Der beste Weg, um dem iOS-Einstellungspaket einen Lizenzabschnitt hinzuzufügen

116

Meine iOS-Anwendung verwendet eine Reihe von Komponenten von Drittanbietern, die unter Apache 2.0 und ähnlichen Lizenzen lizenziert sind. Dazu muss ich verschiedene Textteile einfügen:

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

Es scheint einen vernünftigen Präzedenzfall zu geben, um diese Informationen im Einstellungspaket unter einen Untereintrag "Lizenz" zu stellen (auf dem iPad Facebook scheinen Seiten, Keynote, Zahlen und Wikipanion dies zu tun).

Ich kämpfe ein bisschen darum, dasselbe zu erreichen. Ich muss den Text zeilenweise aufteilen und zeilenweise in xcode eingeben (und xcode4 scheint beim Bearbeiten der Listen ein Absturzproblem zu haben).

Es scheint so, als gäbe es mit ziemlicher Sicherheit irgendwo ein Skript oder eine einfache Möglichkeit, die ich verpasst habe.

JosephH
quelle

Antworten:

192

Ich glaube, ich habe es jetzt geschafft, alle Probleme zu lösen, auf die ich gestoßen bin.

  • Es scheint am besten zu sein, Gruppenelementtitel zu verwenden, um die Lizenzen zu halten (dies ist, was Apple in den iWork-Apps tut). Die Länge dieser Dateien ist jedoch begrenzt (und ich habe noch nicht genau herausgefunden, wie hoch die Grenze ist). Daher müssen Sie jede Lizenzdatei in mehrere Zeichenfolgen aufteilen.
  • Sie können innerhalb dieser einen Zeilenumbruch erstellen, indem Sie einen wörtlichen Wagenrücklauf einfügen (dh auch als ^ M, \ r oder 0x0A bezeichnet).
  • Stellen Sie sicher, dass kein Literal in der Mitte des Textes enthalten ist. Wenn Sie dies tun, werden einige oder alle Zeichenfolgen in der Datei stillschweigend ignoriert.

Ich habe ein praktisches Skript, mit dem ich die unten gezeigten Dateien .plist und .strings generieren kann.

Um es zu benutzen:

  1. Erstellen Sie unter Ihrem Projekt ein Lizenzverzeichnis
  2. Legen Sie das Skript in dieses Verzeichnis
  3. Legen Sie jede Lizenz in dieses Verzeichnis, eine pro Datei, mit Dateinamen, die mit .license enden
  4. Führen Sie alle erforderlichen Neuformatierungen der Lizenzen durch. (z. B. zusätzliche Leerzeichen am Zeilenanfang entfernen, sicherstellen, dass in der Mitte des Absatzes keine Zeilenumbrüche vorhanden sind). Zwischen jedem Absatz sollte eine Leerzeile stehen
  5. Wechseln Sie in das Lizenzverzeichnis und führen Sie das Skript aus
  6. Bearbeiten Sie das Einstellungspaket Root.plist so, dass es einen untergeordneten Abschnitt mit dem Namen "Danksagungen" enthält.

Hier ist das Skript:

#!/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);

Einrichten Ihres Settings.bundle

Wenn Sie kein Settings.bundle erstellt haben, gehen Sie zu Datei -> Neu -> Neue Datei ...

Suchen Sie im Abschnitt Ressource das Einstellungspaket. Verwenden Sie den Standardnamen und speichern Sie ihn im Stammverzeichnis Ihres Projekts.

Erweitern Sie die Settings.bundleGruppe und wählen Sie Root.plist. Sie müssen einen neuen Abschnitt hinzufügen, in dem der Schlüssel Preference Itemsvom Typ ist Array. Fügen Sie die folgenden Informationen hinzu:

Geben Sie hier die Bildbeschreibung ein

Der FilenameSchlüssel zeigt auf die Liste, die von diesem Skript erstellt wurde. Sie können das ändern title, was immer Sie wollen.

Führen Sie das Skript zur Erstellungszeit aus

Wenn Sie möchten, dass dieses Skript bei jeder Erstellung Ihres Projekts ausgeführt wird, können Sie Ihrem Ziel eine Erstellungsphase hinzufügen:

  1. Gehen Sie zu Ihrer Projektdatei
  2. Wählen Sie das Ziel aus
  3. Klicken Sie auf die Registerkarte Phasen erstellen
  4. Klicken Sie in der unteren rechten Ecke dieses Bereichs auf "Build-Phase hinzufügen".
  5. Wählen Sie "Run-Skript hinzufügen".
  6. Ziehen Sie Ihr Perl-Skript per Drag & Drop in den Abschnitt für Ihr Skript. Ändern Sie, um ungefähr so ​​auszusehen:
  1. cd $SRCROOT/licenses( $SRCROOTzeigt auf die Wurzel Ihres Projekts)
  2. ./yourScriptName.pl

Nachdem Sie dies abgeschlossen haben, können Sie die Run ScriptErstellungsphase früher im Erstellungsprozess ziehen. Sie sollten es vorher nach oben verschieben, Compile Sourcesdamit die Aktualisierungen Ihres Einstellungspakets kompiliert und kopiert werden.

Update für iOS 7: iOS 7 scheint die "Titel" -Taste anders zu behandeln und bringt den gerenderten Text durcheinander. Um dies zu beheben, muss die generierte Acknowledgements.plist anstelle von "Title" den Schlüssel "FooterText" verwenden. So ändern Sie das Skript:

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
quelle
1
Was für eine fantastische Idee! Ich begann dies manuell zu tun, bevor mir schnell klar wurde, dass ich eine automatisierte Lösung brauchte, insbesondere wegen der Länge der drakonischen Gruppentitel.
Hilton Campbell
9
Eine Sache, auf die Sie achten sollten: "Dateiname" ist die Anzeigeform des Schlüssels. Der eigentliche Schlüssel ist "Datei". Wenn der untergeordnete Bereich nicht angezeigt wird, klicken Sie mit der rechten Maustaste und wählen Sie "Rohe Schlüssel / Werte anzeigen". Stellen Sie sicher, dass der Schlüsselname "Datei" lautet.
Atticus
10
Das ist fantastisch, danke. Ich habe 'cd "$ SRCROOT / Licenses /"' im Run Script-Block verwendet, was etwas besser funktioniert, wenn mehrere Personen an einem Projekt arbeiten.
Chris
9
Lesen Sie devforums.apple.com/message/894791#894791, wenn Sie dies mit iOS7 verwenden. Insbesondere müssen Sie möglicherweise <key> Title </ key> in <key> FooterText </ key> ändern, damit es normal aussieht.
Silber
2
So machen Sie es zu einem untergeordneten Bereich: Erstellen Sie Element 0 in den Einstellungselementen. Es sieht so aus, als könnten Sie den untergeordneten Bereich nicht als Typ auswählen. Sie erstellen jedoch ein Element unter Element 0 (s Unterelement von Element 0) und dieses erste Element hat den Schlüssel "Typ". Klicken Sie zur Vereinfachung mit der rechten Maustaste darauf und wählen Sie Rohschlüssel / Werte anzeigen. Sie möchten den Wert für Type auf PSChildPaneSpecifier festlegen. Sobald Sie Show Raw Keys / Values ​​deaktiviert haben, wird nun Child Pane angezeigt, auch im Namen für Element 0, dh "Its 0 (Child Pane -)". Das ist, was du willst.
Marc
36

Hier ist die gleiche Lösung, die @JosephH (ohne Übersetzungen) bereitgestellt hat, jedoch in Python für alle, die Python gegenüber Perl bevorzugen

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
quelle
Diese Antwort braucht mehr Upvotes. Python-Syntax <3Perl-Syntax. ;)
Ricardo Sanchez-Saez
5
current_file = codecs.open(filename, 'r', 'utf-8')für Unicode-Lizenzen.
user2821144
Vielen Dank! Ich habe eine neue Version basierend auf dieser erstellt, die für Karthago großartig ist. Außerdem werden einige unnötige Zeilenumbrüche aus dem Lizenztext entfernt. Überprüfen Sie es heraus: gist.github.com/Zyphrax/0d015c618d46093b4f815e62a6a33969
Zyphrax
1
Ich habe ein bisschen mehr Arbeit
hineingesteckt
15

Alternativ wird für Benutzer von CocoaPods eine Liste "Danksagungen" für jedes in Ihrer Poddatei angegebene Ziel generiert, die die Lizenzdetails für jeden in diesem Ziel verwendeten Pod enthält (vorausgesetzt, die Details wurden in der Pod-Spezifikation angegeben). Die Eigenschaftslistendatei, die dem iOS-Einstellungspaket hinzugefügt werden kann.

Es sind auch Projekte im Gange, mit denen diese Daten konvertiert und stattdessen in der App angezeigt werden können:

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

https://github.com/cocoapods/CPDAcknowledgements

JosephH
quelle
3
Hier sind weitere Informationen dazu: github.com/CocoaPods/CocoaPods/wiki/Acknowledgements
Oren
Beachten Sie, dass das Cocoapods-Wiki den Namen der Eingabedatei als Pods-Acknowledgements.plist hat, die Datei jedoch tatsächlich als Pods-Acknowledents.plist (Kleinbuchstabe 'a') generiert wird. Wenn Sie den falschen Fall verwenden, wird die Pod-Installation unterbrochen, wenn bei Ihrem Dateisystem zwischen Groß- und Kleinschreibung unterschieden wird.
Keller
14

Ich dachte, ich würde meine Iteration auf Seans fantastischen Python-Code in der Mischung werfen. Der Hauptunterschied besteht darin, dass ein Eingabeverzeichnis verwendet und dann rekursiv nach LIZENZDATEIEN durchsucht wird. Der Titelwert wird aus dem übergeordneten Verzeichnis der LICENSE-Datei abgeleitet, sodass er gut mit Cocoapods funktioniert.

Die Motivation bestand darin, ein Build-Skript zu erstellen, um den rechtlichen Bereich meiner App automatisch auf dem neuesten Stand zu halten, wenn ich Pods hinzufüge oder entferne. Es werden auch einige andere Dinge ausgeführt, z. B. das Entfernen erzwungener Zeilenumbrüche aus Lizenzen, damit die Absätze auf den Geräten etwas besser aussehen.

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

Geben Sie hier die Bildbeschreibung ein

carloe
quelle
8

Ich habe ein Skript in Ruby erstellt, das vom @ JosephH-Skript inspiriert ist. Diese Version wird meiner Meinung nach die einzelnen Open Source-Projekte besser repräsentieren.

Wisit iOS-AcknowledgementGenerator zum Herunterladen des Skripts und des Beispielprojekts.

So sehen Bestätigungen in Ihrer App aus:

Settings.app Settings.bundle Danksagung Geben Sie hier die Bildbeschreibung ein

cvknage
quelle
2

Dies ist ein Nachtrag zu JosephHs Antwort. (Ich habe nicht den Repräsentanten, um zu kommentieren)

Ich musste mich im Perl-Skript <key>StringsTable</key> <string>Acknowledgements</string> nach oben bewegen </dict>.

Vor dieser Änderung war der Abschnitt "Danksagungen" in der App leer und XCode konnte die resultierende Acknowledgements.plist nicht lesen. ("Die Daten konnten nicht gelesen werden, da sie nicht im richtigen Format vorliegen.")

(XCode 6.3.2 iOS 8.3)

mattti
quelle
2

Das Python-Skript von Sean in diesem Thread funktioniert. Aber es gibt ein paar grundlegende Dinge zu wissen.

  1. Klicken Sie in Xcode mit der rechten Maustaste oben in der Projektnavigatorstruktur auf den Namen Ihres Projekts und fügen Sie eine neue Gruppe hinzu. Dadurch wird ein neuer Ordner in Ihr Projekt eingefügt.
  2. Fügen Sie dort Seans Skript hinzu und speichern Sie es wie folgt: Acknowledgements.py.
  3. Stellen Sie sicher, dass Python auf Ihrem System installiert ist. Ich benutze einen Mac.
  4. Fügen Sie dem Ordner, den Sie in 1 erstellt haben, eine erste Lizenzdatei hinzu. Machen Sie es sich einfach, indem Sie nur ein Wort in der Datei haben, z. B.: Testen. Speichern Sie es im Ordner als Test1.license.
  5. Richten Sie Ihr Settings.bundle gemäß JosephH oben ein.
  6. Verwenden Sie Ihre Terminal-App, um in den Ordner zu CD, den Sie in 1 erstellt haben.
  7. Führen Sie das Skript aus. Typ: python Acknowledgements.py. Wenn Sie keine Fehler erhalten, kehren Sie sofort zur Eingabeaufforderung des Terminals zurück. Führen Sie all dies aus, bevor Sie dem Build ein Ausführungsskript hinzufügen.
  8. Erstellen Sie Ihre App und führen Sie sie aus.
  9. Tippen Sie zweimal auf die iPhone-Home-Schaltfläche und beenden Sie die Einstellungen. Die Änderung der Einstellungen für Ihre App wird nicht oft übernommen, bis die Einstellungen neu gestartet werden.
  10. Gehen Sie nach dem Neustart der Einstellungen zu Ihrer App und prüfen Sie, ob sie funktioniert hat.
  11. Wenn dies alles funktioniert hat, fügen Sie langsam weitere Lizenzdateien hinzu, führen Sie das Skript jedoch jedes Mal aus. Sie können aufgrund bestimmter Zeichen in der Datei Fehler beim Ausführen des Skripts erhalten. Die einfache Möglichkeit zum Debuggen besteht darin, eine Datei hinzuzufügen, das Skript auszuführen, zu überprüfen, ob es funktioniert, und fortzufahren. Andernfalls bearbeiten Sie Sonderzeichen aus der Lizenzdatei.
  12. Ich habe das Run Build Script nicht gemäß den obigen Anweisungen ausgeführt. Dieser Vorgang funktioniert jedoch einwandfrei, wenn Sie die Lizenzdateien nicht so oft ändern.
D. Rothschild
quelle
1

Ack Ack: Bestätigungslistengenerator
Vor Zeit habe ich ein Python-Skript erstellt, das nach Lizenzdateien und eine schöne Acknowledgements Plist erstellt, die Sie in Ihrer Settings.plist verwenden können. Es erledigt einen Großteil der Arbeit für Sie.

https://github.com/Building42/AckAck

Eigenschaften

  • Erkennt Ordner aus Karthago und CocoaPods
  • Erkennt vorhandene Listen für benutzerdefinierte Lizenzen
  • Bereinigt die Lizenztexte, indem unnötige neue Zeilen und Zeilenumbrüche entfernt werden
  • Bietet viele Anpassungsoptionen (siehe --helpfür Details)
  • Unterstützt sowohl Python v2 als auch v3

Installieren

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

Lauf

./ackack.py

Bildschirmfoto

Danksagung

Wenn Sie Verbesserungsvorschläge haben, können Sie gerne ein Problem posten oder eine Anfrage auf GitHub ziehen!

Zyphrax
quelle