Creo que ahora me las arreglé para resolver todos los problemas que tenía.
- Parece ser mejor utilizar títulos de elementos de grupo para mantener las licencias (esto es lo que hace Apple en las aplicaciones de iWork). Sin embargo, existe un límite en la longitud de estos (y aún no he descubierto exactamente cuál es el límite), por lo que debe dividir cada archivo de licencia en varias cadenas.
- Puede crear un salto de línea dentro de estos incluyendo un retorno de carro literal (es decir, también conocido como ^ M, \ r o 0x0A)
- Asegúrese de no incluir ningún texto a mitad de texto literal. Si lo hace, algunas o todas las cadenas del archivo se ignorarán silenciosamente.
Tengo un script de conveniencia que utilizo para ayudar a generar el archivo .plist y .strings, que se muestra a continuación.
Para usarlo:
- Cree un directorio de 'licencias' en su proyecto
- Ponga el script en ese directorio
- Coloque cada licencia en ese directorio, una por archivo, con nombres de archivo que terminen .license
- Realice cualquier reformateo necesario en las licencias. (por ejemplo, elimine los espacios adicionales al comienzo de las líneas, asegúrese de que no haya saltos de línea en la mitad del párrafo). Debe haber una línea en blanco entre cada párrafo
- Cambie al directorio de licencias y ejecute el script
- Edite su paquete de configuración Root.plist para incluir una sección secundaria llamada 'Agradecimientos'
Aquí está el guión:
#!/usr/bin/perl -w
use strict;
my $out = "../Settings.bundle/en.lproj/Acknowledgements.strings";
my $plistout = "../Settings.bundle/Acknowledgements.plist";
unlink $out;
open(my $outfh, '>', $out) or die $!;
open(my $plistfh, '>', $plistout) or die $!;
print $plistfh <<'EOD';
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StringsTable</key>
<string>Acknowledgements</string>
<key>PreferenceSpecifiers</key>
<array>
EOD
for my $i (sort glob("*.license"))
{
my $value=`cat $i`;
$value =~ s/\r//g;
$value =~ s/\n/\r/g;
$value =~ s/[ \t]+\r/\r/g;
$value =~ s/\"/\'/g;
my $key=$i;
$key =~ s/\.license$//;
my $cnt = 1;
my $keynum = $key;
for my $str (split /\r\r/, $value)
{
print $plistfh <<"EOD";
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>$keynum</string>
</dict>
EOD
print $outfh "\"$keynum\" = \"$str\";\n";
$keynum = $key.(++$cnt);
}
}
print $plistfh <<'EOD';
</array>
</dict>
</plist>
EOD
close($outfh);
close($plistfh);
Configurando su Settings.bundle
Si no ha creado un Settings.bundle, vaya a Archivo -> Nuevo -> Nuevo archivo ...
En la sección Recursos, busque el Paquete de configuración. Utilice el nombre predeterminado y guárdelo en la raíz de su proyecto.
Expanda el Settings.bundle
grupo y seleccione Root.plist
. Deberá agregar una nueva sección donde su clave será Preference Items
de tipo Array
. Agregue la siguiente información:
La Filename
clave apunta al plist que fue creado por este script. Puedes cambiar el title
a lo que quieras.
Ejecutar secuencia de comandos en el momento de la compilación
Además, si desea que este script se ejecute cada vez que construya su proyecto, puede agregar una fase de construcción a su objetivo:
- Ve a tu archivo de proyecto
- Seleccione el objetivo
- Haga clic en la pestaña Build Phases
- En la esquina inferior derecha de ese panel, haga clic en 'Agregar fase de construcción'
- Seleccione 'Agregar secuencia de comandos de ejecución'
- Arrastre y suelte su script de Perl en la sección de su script. Modifíquelo para lucir algo como esto:
cd $SRCROOT/licenses
( $SRCROOT
apunta a la raíz de su proyecto)
./yourScriptName.pl
Una vez que haya terminado, puede arrastrar la Run Script
fase de compilación antes en el proceso de compilación. Deberá moverlo hacia arriba antes Compile Sources
para que las actualizaciones de su Paquete de configuración se compilen y se copien.
Actualización para iOS 7: iOS 7 parece manejar la tecla "Título" de manera diferente y está arruinando el texto renderizado. Para arreglar eso, el Acknowledgements.plist generado necesita usar la clave "FooterText" en lugar de "Título". Así es como se cambia el script:
for my $str (split /\r\r/, $value)
{
print $plistfh <<"EOD";
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>FooterText</key> # <= here is the change
<string>$keynum</string>
</dict>
EOD
print $outfh "\"$keynum\" = \"$str\";\n";
$keynum = $key.(++$cnt);
}