121 votes

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 similaires, licences, ce qui m'oblige à inclure divers éléments 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 raisonnable précédent pour mettre cette information en vertu d'une "Licence" sous-entrée dans les paramètres de faisceau (sur l'ipad, facebook, pages, keynote, numbers et wikipanion semblent tous faire).

Je suis un peu en difficulté en vue d'obtenir le même bien; il me semble nécessaire de scinder le texte ligne par ligne et entrer dans xcode une ligne à la fois (et xcode4 semble avoir un plantage de problème lors de la modification de la plists).

Il semble que le genre de chose qu'il n'y a presque certainement un script quelque part pour le faire, ou une simple façon de le faire que j'ai manqué.

196voto

JosephH Points 21074

Je pense que j'ai maintenant réussi à résoudre tous les problèmes que j'ai été en cours d'exécution dans.

  • Il semble préférable d'utiliser l'élément de groupe de titres à détenir des licences (c'est ce que Apple ne dans le les apps iWork). Il y a cependant une limite sur la longueur de ceux-ci (et je n'ai pas encore découvert exactement ce que la limite de l'est), donc vous avez besoin pour briser chaque fichier de licence dans plusieurs chaînes de caractères.
  • Vous pouvez créer un saut de ligne à l'intérieur de ces comprennent un littéral de retour de chariot (ie. autrement connu sous le nom ^M, \r ou 0x0A)
  • Assurez-vous de ne pas inclure le caractère "s la mi-texte. Si vous le faites, certaines ou toutes les chaînes dans le fichier sera ignoré en silence.

J'ai une commodité script que j'utilise pour aider à générer de l' .plist et .fichier de chaînes, illustré ci-dessous.

Pour l'utiliser:

  1. Créer un "licences" sous-répertoire de votre projet
  2. Mettre le script dans le répertoire
  3. Mettre chaque licence dans ce répertoire, un fichier par fichier, avec des noms de fichiers .licence
  4. Effectuer tout le nécessaire de reformater sur les licences. (eg. supprimer les espaces supplémentaires au début de la ligne, s'assurer qu'il n'y a pas de sauts de ligne à la mi-paragraphe). Il devrait y avoir une ligne vide entre chaque paragraphe
  5. Changement de licences répertoire et exécuter le script
  6. Modifier les paramètres de votre faisceau de Racine.plist pour inclure un enfant section "Remerciements" de

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);

La configuration de vos Paramètres.bundle

Si vous n'avez pas créé de Paramètres.bundle, allez dans Fichier --> Nouveau --> Nouveau Fichier...

En vertu de la section des Ressources, trouver les Paramètres Bundle. Utilisez le nom par défaut et l'enregistrer à la racine de votre projet.

Développez l' Settings.bundle groupe et sélectionnez Root.plist. Vous aurez besoin d'ajouter une nouvelle section où sa clé sera Preference Items de type Array. Ajoutez les informations suivantes:

enter image description here

L' Filename points clés de la plist qui a été créé par ce script. Vous pouvez modifier l' title de ce que jamais vous le souhaitez.

Exécuter Le Script Au Moment De La Construction

Aussi, si vous voulez l'exécution de ce script à chaque fois que vous construisez votre projet, vous pouvez ajouter une phase de construction de votre cible:

  1. Accédez à votre fichier de projet
  2. Sélectionnez la cible
  3. Cliquez sur les Phases de construction de l'onglet
  4. Dans le coin inférieur droit de ce volet, cliquez sur 'Ajouter une Phase de construction'
  5. Sélectionnez "Ajouter Exécuter Le Script'
  6. Faites glisser et de déposer votre script perl dans la section de votre script. Modifier pour ressembler à quelque chose comme ceci:

1 cd /Utilisateurs/nom d'utilisateur/Projet/licences
2 ./yourScriptName.pl

Astuce: Si le chemin d'accès à votre projet contient des espaces, assurez-vous de leur échapper avec \ caractères. Comme ceci:

/Utilisateurs/nom d'utilisateur/Documents/Mes\ iPhone\ Apps/Projet/licences

Après vous avez terminé, vous pouvez glisser l' Run Script phase de génération plus tôt dans le processus de construction. Vous aurez envie de le déplacer vers le haut avant d' Compile Sources , de sorte que les mises à jour de vos Paramètres de Faisceau compilé et copié.

Mise à jour pour iOS 7: iOS 7 semble gérer le "Titre" de la clé différente et est gâcher le rendu du texte. Pour corriger que le Remerciements.plist besoin d'utiliser le "FooterText de la clé" au lieu de "Titre". Cette façon de modifier 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);
}

37voto

Sean Points 171

Voici la même solution que celle fournie par @JosephH (sans traduction), 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"
)
 

16voto

JosephH Points 21074

Comme une alternative, pour ceux qui utilisent CocoaPods, il va générer un 'Remerciements' plist pour chaque cible de votre Podfile qui contient les détails de la Licence pour chaque Pod utilisé dans la cible (en supposant que les détails ont été spécifiés dans le module spec). La liste des propriétés de fichier qui peut être ajouté à iOS paramètres de faisceau.

Il y a également des projets en cours pour permettre aux données d'être converti et affichées dans l'application à la place:

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

https://github.com/cocoapods/CPDAcknowledgements

14voto

carloe Points 385

J'ai pensé que je jetterais mon itération sur Sean est génial de code python dans le mélange. La principale différence est que cela prend une entrée de répertoire et puis, de manière récursive de recherche pour les fichiers de LICENCE. Il dérive de la valeur de titre à partir du répertoire parent du fichier de LICENCE, de sorte qu'il joue bien avec les cocoapods.

La motivation était de créer un script pour garder automatiquement la partie juridique de mon application jusqu'à ce jour comme je l'ai ajouter ou supprimer des gousses. Il le fait aussi d'autres choses comme de supprimer les retours à la ligne forcé de licences de l'paragraphes regarder un peu mieux sur les appareils.

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

8voto

cvknage Points 93

J'ai fait un script en Ruby inspiered par @JosephH script. Cette version ne sera, à mon avis, de mieux représenter l'individu projets open source.

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

C'est ce qu'remerciements vont ressembler dans votre Application:

Settings.appSettings.bundleAcknowledgementsenter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X