Je pense que j'ai maintenant réussi à résoudre tous les problèmes que je rencontrais.
- Il semble préférable d'utiliser les titres des éléments de groupe pour détenir les licences (c'est ce que fait Apple dans les applications iWork). Il y a cependant une limite sur la longueur de ceux-ci (et je n'ai pas encore découvert exactement quelle est la limite), vous devez donc diviser chaque fichier de licence en plusieurs chaînes.
- Vous pouvez créer un saut de ligne à l'intérieur de ceux-ci en incluant un retour chariot littéral (autrement dit, appelé ^ M, \ r ou 0x0A)
- Veillez à ne pas inclure de texte intermédiaire de littéral. Si vous le faites, certaines ou toutes les chaînes du fichier seront ignorées en silence.
J'ai un script pratique que j'utilise pour générer les fichiers .plist et .strings, illustrés ci-dessous.
Pour l'utiliser:
- Créez un répertoire 'licences' sous votre projet
- Mettez le script dans ce répertoire
- Mettez chaque licence dans ce répertoire, une par fichier, avec des noms de fichiers qui se terminent par .license
- Effectuez tout reformatage nécessaire sur les licences. (par exemple, supprimez les espaces supplémentaires au début des lignes, assurez-vous qu'il n'y a pas de sauts de ligne au milieu du paragraphe). Il devrait y avoir une ligne vide entre chaque paragraphe
- Accédez au répertoire des licences et exécutez le script
- Modifiez votre ensemble de paramètres Root.plist pour inclure une section enfant appelée «Remerciements»
Voici le script:
#!/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);
Configuration de votre Settings.bundle
Si vous n'avez pas créé de Settings.bundle, allez dans Fichier -> Nouveau -> Nouveau fichier ...
Dans la section Ressource, recherchez l'ensemble de paramètres. Utilisez le nom par défaut et enregistrez-le à la racine de votre projet.
Développez le Settings.bundle
groupe et sélectionnez Root.plist
. Vous devrez ajouter une nouvelle section où sa clé sera Preference Items
de type Array
. Ajoutez les informations suivantes:
La Filename
clé pointe vers le plist créé par ce script. Vous pouvez changer le title
en ce que vous voulez.
Exécuter le script au moment de la construction
De plus, si vous souhaitez que ce script s'exécute chaque fois que vous générez votre projet, vous pouvez ajouter une phase de génération à votre cible:
- Accédez à votre dossier de projet
- Sélectionnez la cible
- Cliquez sur l'onglet Phases de construction
- Dans le coin inférieur droit de ce volet, cliquez sur `` Ajouter une phase de construction ''
- Sélectionnez "Ajouter un script d'exécution"
- Faites glisser et déposez votre script perl dans la section de votre script. Modifiez pour ressembler à quelque chose comme ceci:
cd $SRCROOT/licenses
( $SRCROOT
pointe vers la racine de votre projet)
./yourScriptName.pl
Une fois que vous avez terminé, vous pouvez faire glisser la Run Script
phase de construction plus tôt dans le processus de construction. Vous voudrez le déplacer avant Compile Sources
afin que les mises à jour de votre ensemble de paramètres soient compilées et copiées.
Mise à jour pour iOS 7: iOS 7 semble gérer la touche "Titre" différemment et gâche le texte rendu. Pour résoudre ce problème, le fichier Acknowledgements.plist généré doit utiliser la clé "FooterText" au lieu de "Title". Voici comment changer le 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);
}