Mon application iOS utilise un certain nombre de composants tiers sous licence Apache 2.0 et des licences similaires, ce qui m'oblige à inclure divers bits de texte, ce genre de chose:
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
Il semble exister un précédent raisonnable pour placer ces informations sous une sous-entrée "Licence" dans le groupe de paramètres (sur l'ipad facebook, les pages, la keynote, les chiffres et wikipanion semblent le faire).
Cependant, je lutte un peu pour atteindre le même objectif; Je semble avoir besoin de scinder le texte ligne par ligne et de saisir dans xcode une ligne à la fois (et xcode4 semble avoir un problème de plantage lors de l'édition des plists).
Il semble que ce soit le genre de chose pour laquelle il y a presque certainement un script quelque part à faire, ou un moyen simple de le faire, que j'ai raté.
Je pense avoir réussi à résoudre tous les problèmes que je rencontrais.
J'ai un script pratique que j'utilise pour générer les fichiers .plist et .strings, présentés ci-dessous.
Pour l'utiliser:
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);
Si vous n'avez pas créé de Settings.bundle, allez dans Fichier -> Nouveau -> Nouveau fichier ...
Dans la section Ressources, recherchez l’ensemble de paramètres. Utilisez le nom par défaut et enregistrez-le à la racine de votre projet.
Élargir 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 clé Filename
pointe vers la plist créée par ce script. Vous pouvez changer le title
en ce que vous voulez.
En outre, si vous souhaitez que ce script soit exécuté chaque fois que vous générez votre projet, vous pouvez ajouter une phase de construction à votre cible:
cd $SRCROOT/licenses
($SRCROOT
pointe sur la racine de votre projet)./yourScriptName.pl
Une fois que vous avez terminé, vous pouvez faire glisser le 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 affiché. Pour résoudre ce problème, le fichier Acknowledgements.plist généré doit utiliser la clé "FooterText" au lieu de "Titre". Cette façon de 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);
}
Voici la même solution que celle fournie par @JosephH (sans traduction), mais dans Python pour ceux qui préfèrent python au lieu de Perl
import os
import sys
import plistlib
from copy import deepcopy
os.chdir(sys.path[0])
plist = {'PreferenceSpecifiers': [], 'StringsTable': 'Acknowledgements'}
base_group = {'Type': 'PSGroupSpecifier', 'FooterText': '', 'Title': ''}
for filename in os.listdir("."):
if filename.endswith(".license"):
current_file = open(filename, 'r')
group = deepcopy(base_group)
title = filename.split(".license")[0]
group['Title'] = title
group['FooterText'] = current_file.read()
plist['PreferenceSpecifiers'].append(group)
plistlib.writePlist(
plist,
"../Settings.bundle/Acknowledgements.plist"
)
En guise d'alternative, pour ceux qui utilisent CocoaPods, il générera un plist 'Accusés de réception' pour chaque cible spécifiée dans votre fichier podfile contenant les détails de la licence pour chaque pod utilisé dans cette cible (en supposant que des détails ont été spécifiés dans la spécification du pod). Fichier de liste de propriétés pouvant être ajouté à l'ensemble de paramètres iOS.
Des projets sont également en cours pour permettre à ces données d'être converties et affichées dans l'application:
Je pensais que je lancerais mon itération sur le code génial de Sean python dans le mixage. La principale différence est qu’il faut un répertoire d’entrée puis une recherche récursive des fichiers LICENSE. Il dérive la valeur du titre. depuis le répertoire parent du fichier LICENSE, de sorte qu’il fonctionne bien avec les cocoapods.
La motivation était de créer un script de construction pour maintenir automatiquement la section légale de mon application à jour au fur et à mesure que j'ajoutais ou supprimais des pods. Elle supprime également les retours à la ligne forcés des licences afin que les paragraphes aient un meilleur aspect sur les périphériques.
J'ai fait un script en Ruby inspiré par le script @JosephH. Cette version représentera, à mon avis, une meilleure représentation des projets individuels à code source ouvert.
Wisit iOS-AcknowledgementGenerator pour télécharger le script et le projet exemple.
Voici à quoi ressembleront les remerciements dans votre application:
Ceci est un addenda à la réponse de JosephH. (Je n'ai pas le représentant à commenter)
Je devais bouger <key>StringsTable</key> <string>Acknowledgements</string>
au-dessus du dernier </dict>
dans le script Perl.
Avant cette modification, la section des accusés de réception de l'application était vide et XCode ne pouvait pas lire le fichier Acknowledgements.plist résultant. ("Les données ne peuvent pas être lues car elles ne sont pas au format correct.")
(XCode 6.3.2 iOS 8.3)
Le script Python de Sean fonctionne dans ce fil. Toutefois, il existe quelques informations de base à connaître.
Ack Ack: Générateur de plis d'accusé de réception
Il y a quelque temps, j'ai créé un script Python qui analyse les fichiers de licence et crée un plist Nice Acknowledgements que vous pouvez utiliser dans votre Settings.plist. le travail pour vous.
https://github.com/Building42/AckAck
Caractéristiques
--help
pour plus de détails)Installer
wget https://raw.githubusercontent.com/Building42/AckAck/master/ackack.py
chmod +x ackack.py
Exécuter
./ackack.py
Capture d'écran
Si vous avez des suggestions d’amélioration, n'hésitez pas à poster un problème ou à extraire une demande sur GitHub!