web-dev-qa-db-fra.com

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

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é.

114
JosephH

Je pense avoir réussi à résoudre tous les problèmes que je rencontrais.

  • Il semble préférable d’utiliser des titres d’élément de groupe pour conserver les licences (c’est ce que Apple dans les applications iWork). Il existe toutefois une limite à la durée de ces licences (et j’ai pas encore découvert exactement quelle est la limite), vous devez donc décomposer chaque fichier de licence en plusieurs chaînes.
  • Vous pouvez créer un saut de ligne dans ces éléments en incluant un retour chariot littéral (autrement dit, ^ M,\r ou 0x0A).
  • Assurez-vous de ne pas inclure de texte littéral au milieu du texte. Dans le cas contraire, 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, présentés ci-dessous.

Pour l'utiliser:

  1. Créez un répertoire 'licences' sous votre projet
  2. Mettre le script dans ce répertoire
  3. Placez chaque licence dans ce répertoire, une par fichier, avec les 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 blanche entre chaque paragraphe
  5. Passer au répertoire des licences et exécuter le script
  6. Modifiez votre ensemble de paramètres Root.plist pour y 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 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:

enter image description here

La clé Filename pointe vers la plist créée par ce script. Vous pouvez changer le title en ce que vous voulez.

Exécuter le script au moment de la construction

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:

  1. Accédez à votre fichier de projet
  2. Sélectionnez la cible
  3. Cliquez sur l'onglet Build Phases
  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. Modifier pour ressembler à quelque chose comme ceci:
  1. cd $SRCROOT/licenses ($SRCROOT pointe sur la racine de votre projet)
  2. ./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);
}
191
JosephH

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"
)
36
Sean

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:

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

https://github.com/cocoapods/CPDAcknowledgements

15
JosephH

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.

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

enter image description here

13
carloe

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:

Settings.appSettings.bundleAcknowledgementsenter image description here

8
cvknage

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)

2
mattti

Le script Python de Sean fonctionne dans ce fil. Toutefois, il existe quelques informations de base à connaître.

  1. sous Xcode, cliquez avec le bouton droit de la souris sur le nom de votre projet en haut de l’arborescence du Navigateur de projet et ajoutez un nouveau groupe. Cela met un nouveau dossier dans votre projet.
  2. Ajoutez le script de Sean et sauvegardez-le sous le nom: 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 la tâche, comme si vous n'aviez qu'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 sur CD dans le dossier que vous avez créé dans 1.
  7. Exécutez le script. Tapez: python Acknowledgements.py. Si vous n'obtenez aucune erreur, cela retournera immédiatement à l'invite du terminal. Faites tout cela avant d'ajouter un script d'exécution à la construction.
  8. Construisez et exécutez votre application.
  9. Appuyez deux fois sur le bouton d'accueil de l'iPhone et supprimez les paramètres. Il n'est pas souvent nécessaire de prendre en compte les modifications apportées aux paramètres de votre application jusqu'au redémarrage de ceux-ci.
  10. Après avoir redémarré les paramètres, accédez à votre application et regardez si cela a fonctionné.
  11. Si tout cela fonctionne, ajoutez lentement plus de fichiers de licence, mais exécutez le script à chaque fois. Vous pouvez obtenir des erreurs lors de l'exécution du script en raison de certains caractères du fichier. Le moyen facile de déboguer consiste donc à ajouter un fichier, à l'exécuter, à voir si cela a fonctionné et à continuer. Sinon, éditez tous les caractères spéciaux du fichier .license.
  12. Je n'ai pas obtenu le travail Exécuter le script de construction en suivant les instructions ci-dessus. Mais ce processus fonctionne bien si vous ne modifiez pas souvent les fichiers .license.
2
D. Rothschild

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

  • 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 --help pour plus de détails)
  • Prend en charge les deux Python v2 et v3

Installer

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

Exécuter

./ackack.py

Capture d'écran

Acknowledgements

Si vous avez des suggestions d’amélioration, n'hésitez pas à poster un problème ou à extraire une demande sur GitHub!

0
Zyphrax