meilleur moyen d'ajouter une section de licence à l'ensemble de paramètres iOS

116

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 morceaux 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 y avoir un précédent raisonnable pour placer ces informations sous une sous-entrée «Licence» dans l'ensemble de paramètres (sur l'ipad facebook, les pages, la keynote, les nombres et le wikipanion semblent tous faire cela).

J'ai un peu de mal à réaliser la même chose cependant; Il me semble avoir besoin de diviser le texte ligne par ligne et d'entrer dans xcode une ligne à la fois (et xcode4 semble avoir un problème de plantage lors de l'édition des plists).

Cela semble être le genre de chose qu'il y a presque certainement un script quelque part à faire, ou une façon simple de le faire que j'ai manquée.

JosephH
la source

Réponses:

192

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:

  1. Créez un répertoire 'licences' sous votre projet
  2. Mettez le script dans ce répertoire
  3. Mettez chaque licence dans ce répertoire, une par fichier, avec des noms de fichiers qui se terminent par .license
  4. 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
  5. Accédez au répertoire des licences et exécutez le script
  6. 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.bundlegroupe et sélectionnez Root.plist. Vous devrez ajouter une nouvelle section où sa clé sera Preference Itemsde type Array. Ajoutez les informations suivantes:

entrez la description de l'image ici

La Filenameclé pointe vers le plist créé par ce script. Vous pouvez changer le titleen 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:

  1. Accédez à votre dossier de projet
  2. Sélectionnez la cible
  3. Cliquez sur l'onglet Phases de construction
  4. Dans le coin inférieur droit de ce volet, cliquez sur `` Ajouter une phase de construction ''
  5. Sélectionnez "Ajouter un script d'exécution"
  6. Faites glisser et déposez votre script perl dans la section de votre script. Modifiez pour ressembler à quelque chose comme ceci:
  1. cd $SRCROOT/licenses( $SRCROOTpointe vers la racine de votre projet)
  2. ./yourScriptName.pl

Une fois que vous avez terminé, vous pouvez faire glisser la Run Scriptphase de construction plus tôt dans le processus de construction. Vous voudrez le déplacer avant Compile Sourcesafin 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);
}
JosephH
la source
1
Quelle idée fantastique! J'ai commencé à le faire manuellement avant de réaliser rapidement que j'avais besoin d'une solution automatisée, en particulier à cause de la limite de longueur draconienne des titres de groupe.
Hilton Campbell
9
Une chose à surveiller: "Filename" est la forme d'affichage de la clé. La clé réelle est "Fichier". Si le volet enfant ne s'affiche pas, cliquez avec le bouton droit de la souris et sélectionnez "Afficher les clés / valeurs brutes" et assurez-vous que le nom de la clé est "Fichier".
atticus
10
C'est fantastique, merci. J'ai utilisé 'cd "$ SRCROOT / Licenses /"' dans le bloc Run Script qui fonctionne un peu mieux si plusieurs personnes travaillent sur un projet.
chris
9
Lisez devforums.apple.com/message/894791#894791 si vous l'utilisez avec iOS7. Plus précisément, vous devrez peut-être changer <key> Title </key> en <key> FooterText </key> pour lui donner un aspect normal.
esilver du
2
Comment en faire un volet enfant: Créez l'élément 0 dans les éléments de préférence. Il semble que vous ne pouvez pas sélectionner Volet enfant comme type, mais ce que vous faites est de créer un élément sous l'élément 0 (sous-élément de l'élément 0) et ce premier élément a la clé «Type». Pour faciliter les choses, faites un clic droit dessus et sélectionnez Afficher les clés / valeurs brutes. Vous souhaitez définir la valeur de Type sur PSChildPaneSpecifier. Une fois que vous avez désélectionné Afficher les clés / valeurs brutes, il indiquera maintenant Volet enfant, même dans le nom de l'élément 0, c'est-à-dire «Son 0 (Volet enfant -)». Voici ce que tu veux.
Marc
36

Voici la même solution fournie par @JosephH (sans traductions), mais réalisée en Python pour tous ceux qui préfèrent python à 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"
)
Sean
la source
Cette réponse a besoin de plus de votes positifs. Syntaxe Python Syntaxe <3Perl. ;)
Ricardo Sanchez-Saez
5
current_file = codecs.open(filename, 'r', 'utf-8')pour les licences Unicode.
user2821144
Merci! J'ai créé une nouvelle version basée sur celle-ci qui est excellente pour Carthage. Il supprime également certaines nouvelles lignes inutiles du texte de la licence. Vérifiez-le: gist.github.com/Zyphrax/0d015c618d46093b4f815e62a6a33969
Zyphrax
1
J'ai mis un peu plus de travail dedans, voir: github.com/Building42/AckAck
Zyphrax
15

En guise d'alternative, pour ceux qui utilisent CocoaPods, il générera un plist `` Acknowledgements '' pour chaque cible spécifiée dans votre Podfile qui contient les détails de la licence pour chaque Pod utilisé dans cette cible (en supposant que les détails ont été spécifiés dans la spécification du Pod). Le fichier de liste de propriétés qui peut être ajouté au groupe de paramètres iOS.

Il existe également des projets en cours pour permettre à ces données d'être converties et affichées dans l'application à la place:

https://github.com/CocoaPods/cocoapods-install-metadata

https://github.com/cocoapods/CPDAcknowledgements

JosephH
la source
3
Voici plus d'informations à ce sujet: github.com/CocoaPods/CocoaPods/wiki/Acknowledgements
Oren
Sachez que le wiki Cocoapods a le nom du fichier d'entrée comme Pods-Acknowledgements.plist mais le fichier est en fait généré comme Pods-acquittements.plist (minuscule «a»). L'utilisation de la mauvaise casse interrompra l'installation du pod si votre système de fichiers est sensible à la casse.
Keller
14

J'ai pensé lancer mon itération sur le génial code python de Sean dans le mix. La principale différence est qu'il prend un répertoire d'entrée, puis le recherche de manière récursive pour les fichiers LICENCE. Il dérive la valeur du titre du répertoire parent du fichier LICENSE, donc il joue bien avec les cocoapodes.

La motivation était de créer un script de construction pour maintenir automatiquement la section légale de mon application à jour lorsque j'ajoute ou supprime des pods. Il fait également d'autres choses comme supprimer les nouvelles lignes forcées des licences afin que les paragraphes soient un peu meilleurs sur les appareils.

https://github.com/carloe/LicenseGenerator-iOS

entrez la description de l'image ici

carloe
la source
8

J'ai fait un script en Ruby inspiré du script @JosephH. Cette version représentera, à mon avis, mieux les projets open source individuels.

Wisit iOS-AcknowledgementGenerator pour télécharger le script et l'exemple de projet.

Voici à quoi ressembleront les remerciements dans votre application:

Settings.app Settings.bundle Remerciements entrez la description de l'image ici

cvknage
la source
2

Ceci est un addendum à la réponse de JosephH. (Je n'ai pas le représentant pour commenter)

J'ai dû <key>StringsTable</key> <string>Acknowledgements</string> descendre au-dessus du dernier </dict>dans le script Perl.

Avant cette modification, la section Acknowledgements de l'application était vide et XCode ne pouvait pas lire le Acknowledgements.plist résultant. ("Les données n'ont pas pu être lues car elles ne sont pas au bon format.")

(XCode 6.3.2 iOS 8.3)

mattti
la source
2

Le script Python de Sean dans ce fil fonctionne. Mais il y a quelques choses de base à savoir.

  1. dans Xcode, faites un clic droit en haut de l'arborescence Project Navigator, sur le nom de votre projet, et ajoutez un nouveau groupe. Cela place un nouveau dossier dans votre projet.
  2. Ajoutez-y le script de Sean et assurez-vous de l'enregistrer sous: Acknowledgements.py.
  3. Assurez-vous que Python est installé sur votre système. J'utilise un Mac.
  4. Ajoutez un premier fichier de licence au dossier que vous avez créé dans 1. Simplifiez-vous la vie, comme avoir juste un mot dans le fichier, par exemple: Test. Enregistrez-le dans le dossier sous Test1.license.
  5. Configurez votre Settings.bundle selon JosephH ci-dessus.
  6. Utilisez votre application Terminal pour CD vers le dossier que vous avez créé dans 1.
  7. Exécutez le script. Tapez: python Acknowledgements.py. Si vous n'obtenez aucune erreur, il reviendra directement à l'invite du terminal. Faites tout cela avant d'ajouter un script d'exécution au Build.
  8. Créez et exécutez votre application.
  9. Appuyez deux fois sur le bouton d'accueil de l'iPhone et supprimez les paramètres. Il ne prend pas souvent en compte la modification des paramètres de votre application avant le redémarrage des paramètres.
  10. Après avoir redémarré les paramètres, accédez à votre application et regardez si cela a fonctionné.
  11. Si tout cela a fonctionné, ajoutez lentement d'autres fichiers de licence, mais exécutez le script à chaque fois. Vous pouvez obtenir des erreurs lors de l'exécution du script à cause de certains caractères dans le fichier. Le moyen le plus simple de déboguer est d'ajouter un fichier, d'exécuter le script, de voir si cela a fonctionné et de continuer. Sinon, modifiez tous les caractères spéciaux du fichier .license.
  12. Je n'ai pas obtenu le travail Run Build Script selon les instructions ci-dessus. Mais ce processus fonctionne bien si vous ne modifiez pas souvent les fichiers .license.
D. Rothschild
la source
1

Ack Ack: Acknowledgment Plist Generator
Il y a quelque temps, j'ai créé un script Python qui scanne les fichiers de licence et crée un joli plist Acknowledgements que vous pouvez utiliser dans votre Settings.plist. Cela fait beaucoup de travail pour vous.

https://github.com/Building42/AckAck

Caractéristiques

  • Détecte les dossiers Carthage et CocoaPods
  • Détecte les plists existants pour les licences personnalisées
  • Nettoie les textes de licence en supprimant les nouvelles lignes et les sauts de ligne inutiles
  • Fournit de nombreuses options de personnalisation (voir --helppour plus de détails)
  • Prend en charge à la fois Python v2 et v3

Installer

wget https://raw.githubusercontent.com/Building42/AckAck/master/ackack.py
chmod +x ackack.py

Courir

./ackack.py

Capture d'écran

Remerciements

Si vous avez des suggestions d'améliorations, n'hésitez pas à publier un problème ou une demande d'extraction sur GitHub!

Zyphrax
la source