najlepszy sposób na dodanie sekcji licencji do pakietu ustawień iOS

116

Moja aplikacja na iOS korzysta z wielu komponentów innych firm licencjonowanych w ramach Apache 2.0 i podobnych licencji, co wymaga ode mnie dołączenia różnych fragmentów tekstu, takich jak:

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

Wydaje się, że istnieje rozsądny precedens dla umieszczenia tych informacji w podpozycji „Licencja” w pakiecie ustawień (na iPadzie facebook, strony, opis, liczby i wikipanion wydają się to robić).

Trochę się staram, żeby osiągnąć to samo; Wydaje mi się, że muszę podzielić tekst wiersz po wierszu i wprowadzić do xcode wiersz na raz (a xcode4 wydaje się mieć problem z awarią podczas edycji plists).

Wygląda na to, że prawie na pewno jest gdzieś skrypt do zrobienia lub jakiś prosty sposób, aby to zrobić, który przegapiłem.

JosephH
źródło

Odpowiedzi:

192

Myślę, że teraz udało mi się rozwiązać wszystkie napotkane problemy.

  • Wydaje się, że najlepiej jest używać tytułów elementów grupowych do przechowywania licencji (tak robi Apple w aplikacjach iWork). Istnieje jednak ograniczenie ich długości (a jeszcze nie odkryłem dokładnie, jaki to limit), więc musisz podzielić każdy plik licencji na wiele ciągów.
  • Możesz w nich utworzyć podział wiersza, dołączając literalny znak powrotu karetki (np. Znany jako ^ M, \ r lub 0x0A)
  • Upewnij się, że nie zawiera żadnego tekstu pośredniego dosłownego. Jeśli to zrobisz, niektóre lub wszystkie ciągi w pliku zostaną po cichu zignorowane.

Mam wygodny skrypt, którego używam do generowania plików .plist i .strings, pokazanych poniżej.

Aby z niego skorzystać:

  1. Utwórz katalog „Licencje” w swoim projekcie
  2. Umieść skrypt w tym katalogu
  3. Umieść każdą licencję w tym katalogu, po jednej na plik, z nazwami plików kończącymi się na .license
  4. Przeprowadź niezbędne ponowne formatowanie licencji. (np. usuń dodatkowe spacje na początku wierszy, upewnij się, że w środku akapitu nie ma podziałów). Pomiędzy każdym akapitem powinna znajdować się pusta linia
  5. Przejdź do katalogu licencji i uruchom skrypt
  6. Edytuj pakiet ustawień Root.plist, aby uwzględnić sekcję podrzędną o nazwie „Podziękowania”

Oto scenariusz:

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

Konfigurowanie pakietu Settings.bundle

Jeśli nie utworzyłeś pakietu ustawień, przejdź do Plik -> Nowy -> Nowy plik ...

W sekcji Zasoby znajdź pakiet ustawień. Użyj domyślnej nazwy i zapisz ją w katalogu głównym projektu.

Rozwiń Settings.bundlegrupę i wybierz Root.plist. Będziesz musiał dodać nową sekcję, w której jej klucz będzie Preference Itemstypu Array. Dodaj następujące informacje:

wprowadź opis obrazu tutaj

Do Filenamekluczowych punktów do plist, który został utworzony przez ten skrypt. Możesz zmienić titleto, co chcesz.

Wykonaj skrypt w czasie kompilacji

Ponadto, jeśli chcesz, aby ten skrypt był uruchamiany za każdym razem, gdy tworzysz projekt, możesz dodać fazę kompilacji do celu:

  1. Przejdź do pliku projektu
  2. Wybierz cel
  3. Kliknij kartę Fazy budowy
  4. W prawym dolnym rogu tego panelu kliknij „Dodaj fazę budowy”
  5. Wybierz „Dodaj skrypt uruchamiania”
  6. Przeciągnij i upuść skrypt perla do sekcji skryptu. Zmodyfikuj, aby wyglądać mniej więcej tak:
  1. cd $SRCROOT/licenses( $SRCROOTwskazuje na katalog główny twojego projektu)
  2. ./yourScriptName.pl

Po zakończeniu możesz wcześniej przeciągnąć Run Scriptfazę kompilacji w procesie kompilacji. Będziesz chciał go wcześniej przenieść, Compile Sourcesaby aktualizacje pakietu ustawień zostały skompilowane i skopiowane.

Aktualizacja dla iOS 7: iOS 7 wydaje się obsługiwać klawisz „Tytuł” ​​inaczej i psuje renderowany tekst. Aby naprawić, że wygenerowana lista Acknowledgements.plist musi używać klucza „FooterText” zamiast „Title”. Oto jak zmienić skrypt:

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
źródło
1
Cóż za fantastyczny pomysł! Zacząłem to robić ręcznie, zanim szybko zdałem sobie sprawę, że potrzebuję automatycznego rozwiązania, szczególnie ze względu na drakońskie ograniczenie długości tytułu w grupie.
Hilton Campbell
9
Jedna rzecz, na którą należy zwrócić uwagę: „Nazwa pliku” to forma wyświetlania klucza. Faktyczny klucz to „Plik”. Jeśli okienko potomne nie jest wyświetlane, kliknij prawym przyciskiem myszy i wybierz „Pokaż surowe klucze / wartości” i upewnij się, że nazwa klucza to „Plik”.
atticus
10
To fantastyczne, dzięki. Użyłem 'cd "$ SRCROOT / Licenses /"' w bloku Run Script, który działa trochę lepiej, jeśli nad projektem pracuje wiele osób.
chris
9
Przeczytaj devforums.apple.com/message/894791#894791, jeśli używasz tego z iOS7. W szczególności może zajść potrzeba zmiany <key> Title </key> na <key> FooterText </key>, aby wyglądał normalnie.
esilver,
2
Jak uczynić to panelem podrzędnym: Utwórz element 0 w elementach preferencji. Wygląda na to, że nie możesz wybrać okienka podrzędnego jako typu, ale musisz utworzyć element w pozycji 0 (element podrzędny pozycji 0) i ten pierwszy element ma klucz „Typ”. Aby to ułatwić, kliknij prawym przyciskiem myszy i wybierz Pokaż surowe klucze / wartości. Chcesz ustawić wartość Type na PSChildPaneSpecifier. Po odznaczeniu opcji Pokaż surowe klucze / wartości będzie teraz wyświetlać okienko potomne, nawet w nazwie elementu 0, tj. „Jego 0 (okienko potomne -)”. To jest to, czego chcesz.
Marc
36

Oto to samo rozwiązanie, które dostarczył @JosephH (bez tłumaczeń), ale zrobione w Pythonie dla każdego, kto woli Pythona od Perla

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
źródło
Ta odpowiedź wymaga więcej głosów pozytywnych. Składnia Pythona Składnia <3Perla. ;)
Ricardo Sanchez-Saez
5
current_file = codecs.open(filename, 'r', 'utf-8')dla licencji Unicode.
user2821144
Dzięki! Stworzyłem nową wersję opartą na tej, która jest świetna dla Kartaginy. Usuwa również niepotrzebne znaki nowej linii z tekstu licencji. Sprawdź to: gist.github.com/Zyphrax/0d015c618d46093b4f815e62a6a33969
Zyphrax
1
Włożyłem
Zyphrax
15

Alternatywnie, dla tych, którzy używają CocoaPods, wygeneruje listę „Acknowledgments” dla każdego celu określonego w pliku Podfile, która zawiera szczegóły licencji dla każdego Poda używanego w tym celu (zakładając, że szczegóły zostały określone w specyfikacji Poda). Plik listy właściwości, który można dodać do pakietu ustawień systemu iOS.

Trwają również prace nad projektami umożliwiającymi konwersję tych danych i wyświetlanie ich w aplikacji:

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

https://github.com/cocoapods/CPDAcknowledgements

JosephH
źródło
3
Tutaj jest więcej informacji na ten temat: github.com/CocoaPods/CocoaPods/wiki/Acknowledgements
Oren
Należy pamiętać, że witryna wiki Cocoapods ma nazwę pliku wejściowego Pods-Acknowledgements.plist, ale w rzeczywistości plik jest generowany jako Pods-confirmgements.plist (małe litery „a”). Użycie niewłaściwego przypadku spowoduje przerwanie instalacji, jeśli system plików rozróżnia wielkość liter.
Keller
14

Pomyślałem, że rzucę moją iterację na niesamowity kod Pythona Seana w miksie. Główną różnicą jest to, że pobiera katalog wejściowy, a następnie rekurencyjnie przeszukuje go w poszukiwaniu plików LICENCJI. Wyprowadza wartość tytułu z katalogu nadrzędnego pliku LICENSE, więc dobrze współgra z cocoapods.

Motywacją było stworzenie skryptu kompilacji, który automatycznie aktualizowałby sekcję prawną mojej aplikacji podczas dodawania lub usuwania podów. Robi również inne rzeczy, takie jak usuwanie wymuszonych nowych linii z licencji, dzięki czemu akapity wyglądają trochę lepiej na urządzeniach.

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

wprowadź opis obrazu tutaj

Carloe
źródło
8

Zrobiłem skrypt w Rubim zainspirowany skryptem @JosephH. Moim zdaniem ta wersja będzie lepiej reprezentować poszczególne projekty open source.

Wisit iOS-AcknowledgementGenerator, aby pobrać skrypt i przykładowy projekt.

Tak będą wyglądać podziękowania w Twojej aplikacji:

Settings.app Zestaw ustawień Podziękowanie wprowadź opis obrazu tutaj

cvknage
źródło
2

To jest dodatek do odpowiedzi Józefa. (Nie mam przedstawiciela do komentowania)

Musiałem <key>StringsTable</key> <string>Acknowledgements</string> zejść powyżej ostatniego </dict>w skrypcie Perla.

Przed tą modyfikacją sekcja Acknowledgements w aplikacji była pusta, a XCode nie mógł odczytać wynikowego Acknowledgements.plist. („Nie można odczytać danych, ponieważ mają one nieprawidłowy format”).

(XCode 6.3.2 iOS 8.3)

mattti
źródło
2

Skrypt w Pythonie od Seana w tym wątku działa. Ale jest kilka podstawowych rzeczy, które należy wiedzieć.

  1. w Xcode kliknij prawym przyciskiem myszy w górnej części drzewa Nawigatora projektu nazwę projektu i dodaj nową grupę. Spowoduje to umieszczenie nowego folderu w projekcie.
  2. Dodaj tam skrypt Seana i zapisz go jako: Acknowledgements.py.
  3. Upewnij się, że masz zainstalowany Python w swoim systemie. Używam komputera Mac.
  4. Dodaj pierwszy plik licencji do folderu, który utworzyłeś w 1. Uprość to tak, jak tylko jedno słowo w pliku, powiedz: Testowanie. Zapisz go w folderze jako Test1.license.
  5. Skonfiguruj swój zestaw ustawień zgodnie z powyższym JosephH.
  6. Użyj aplikacji Terminal, aby CD do folderu utworzonego w 1.
  7. Uruchom skrypt. Wpisz: python Acknowledgements.py. Jeśli nie otrzymasz żadnych błędów, nastąpi powrót do monitu Terminala. Zrób to wszystko przed dodaniem skryptu uruchamiania do Build.
  8. Utwórz i uruchom swoją aplikację.
  9. Kliknij dwukrotnie przycisk Home iPhone'a i wyłącz Ustawienia. Często nie powoduje zmiany ustawień aplikacji, dopóki Ustawienia nie zostaną ponownie uruchomione.
  10. Po ponownym uruchomieniu Ustawień przejdź do aplikacji i sprawdź, czy zadziałało.
  11. Jeśli to wszystko zadziałało, powoli dodawaj więcej plików licencji, ale za każdym razem uruchamiaj skrypt. Podczas uruchamiania skryptu mogą wystąpić błędy z powodu pewnych znaków w pliku, więc prostym sposobem debugowania jest dodanie pliku, uruchomienie skryptu, sprawdzenie, czy zadziałał i kontynuowanie. W przeciwnym razie edytuj wszelkie znaki specjalne z pliku .license.
  12. Nie otrzymałem pracy Run Build Script zgodnie z powyższymi instrukcjami. Ale ten proces działa dobrze, jeśli nie zmieniasz plików .license tak często.
D. Rothschild
źródło
1

Ack Ack: Acknowledgement Plist Generator
Jakiś czas temu stworzyłem skrypt w Pythonie, który skanuje pliki licencji i tworzy ładną listę Acknowledgments, której możesz użyć w swoim Settings.plist. Wykonuje dużo pracy za Ciebie.

https://github.com/Building42/AckAck

cechy

  • Wykrywa foldery Carthage i CocoaPods
  • Wykrywa istniejące plists dla niestandardowych licencji
  • Czyści teksty licencji, usuwając niepotrzebne nowe wiersze i podziały wierszy
  • Zapewnia wiele opcji dostosowywania (zobacz --helpszczegóły)
  • Obsługuje zarówno Python v2, jak i v3

zainstalować

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

Biegać

./ackack.py

Zrzut ekranu

Podziękowanie

Jeśli masz sugestie dotyczące ulepszeń, napisz problem lub prośbę o pobranie na GitHub!

Zyphrax
źródło