il modo migliore per aggiungere la sezione della licenza al bundle delle impostazioni iOS


116

La mia applicazione iOS utilizza una serie di componenti di terze parti concessi in licenza con Apache 2.0 e licenze simili, il che richiede di includere vari bit di testo, questo genere di cose:

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

Sembra esserci un precedente ragionevole per mettere queste informazioni sotto una voce secondaria "Licenza" nel bundle delle impostazioni (su iPad Facebook, pagine, keynote, numeri e wikipanion sembrano farlo tutti).

Sto lottando un po 'per ottenere effettivamente lo stesso però; Mi sembra di dover dividere il testo riga per riga e inserire in xcode una riga alla volta (e xcode4 sembra avere un problema di arresto anomalo durante la modifica dei plists).

Sembra il genere di cose per cui quasi certamente c'è una sceneggiatura da qualche parte da fare, o un modo semplice per farlo che mi sono perso.

Risposte:


192

Penso di essere riuscito a risolvere tutti i problemi che stavo incontrando.

  • Sembra essere meglio usare i titoli degli elementi del gruppo per contenere le licenze (questo è ciò che Apple fa nelle app iWork). Esiste tuttavia un limite alla lunghezza di questi (e non ho ancora scoperto esattamente quale sia il limite), quindi è necessario suddividere ogni file di licenza in più stringhe.
  • È possibile creare un'interruzione di riga all'interno di questi includendo un ritorno a capo letterale (ad es. Altrimenti noto come ^ M, \ r o 0x0A)
  • Assicurati di non includere alcun testo letterale. Se lo fai, alcune o tutte le stringhe nel file verranno silenziosamente ignorate.

Ho un comodo script che utilizzo per generare i file .plist e .strings, mostrati di seguito.

Per usarlo:

  1. Crea una directory "licenze" nel tuo progetto
  2. Metti lo script in quella directory
  3. Metti ogni licenza in quella directory, una per file, con nomi di file che terminano con .license
  4. Eseguire qualsiasi riformattazione necessaria sulle licenze. (es. rimuovere gli spazi extra all'inizio delle righe, assicurarsi che non ci siano interruzioni di riga a metà paragrafo). Dovrebbe esserci una riga vuota tra ogni paragrafo
  5. Passare alla directory delle licenze ed eseguire lo script
  6. Modifica il tuo bundle di impostazioni Root.plist per includere una sezione figlia chiamata "Riconoscimenti"

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

Configurazione di Settings.bundle

Se non hai creato un Settings.bundle, vai su File -> Nuovo -> Nuovo file ...

Nella sezione Risorsa, trova il pacchetto di impostazioni. Usa il nome predefinito e salvalo nella radice del tuo progetto.

Espandi il Settings.bundlegruppo e seleziona Root.plist. Dovrai aggiungere una nuova sezione in cui la sua chiave sarà Preference Itemsdi tipo Array. Aggiungi le seguenti informazioni:

inserisci qui la descrizione dell'immagine

I Filenamepunti chiave per il plist che è stato creato da questo script. Puoi cambiarlo titlein quello che vuoi.

Esegui script in fase di compilazione

Inoltre, se desideri che questo script venga eseguito ogni volta che costruisci il tuo progetto, puoi aggiungere una fase di compilazione al tuo obiettivo:

  1. Vai al file del tuo progetto
  2. Seleziona il bersaglio
  3. Fare clic sulla scheda Build Phases
  4. Nell'angolo in basso a destra di quel riquadro, fare clic su "Aggiungi fase di compilazione"
  5. Seleziona "Add Run Script"
  6. Trascina e rilascia il tuo script perl nella sezione del tuo script. Modifica per assomigliare a questo:
  1. cd $SRCROOT/licenses( $SRCROOTindica la radice del tuo progetto)
  2. ./yourScriptName.pl

Dopo aver terminato, puoi trascinare la Run Scriptfase di creazione prima nel processo di creazione. Ti consigliamo di spostarlo prima in Compile Sourcesmodo che gli aggiornamenti al tuo pacchetto di impostazioni vengano compilati e copiati.

Aggiornamento per iOS 7: iOS 7 sembra gestire il tasto "Titolo" in modo diverso e sta incasinando il testo visualizzato. Per risolvere il problema, il file Riconoscimenti.plist generato deve utilizzare la chiave "FooterText" invece di "Title". Ecco come cambiare lo 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);
}

1
Che idea fantastica! Ho iniziato a farlo manualmente prima di rendermi conto rapidamente che avevo bisogno di una soluzione automatizzata, in particolare a causa del limite di lunghezza del titolo del gruppo draconiano.
Hilton Campbell

9
Una cosa a cui prestare attenzione: "Nome file" è la forma di visualizzazione della chiave. La chiave effettiva è "File". Se il riquadro figlio non viene visualizzato, fai clic con il pulsante destro del mouse e seleziona "Mostra chiavi / valori non elaborati" e assicurati che il nome della chiave sia "File".
attico

10
È fantastico, grazie. Ho usato 'cd "$ SRCROOT / Licenses /"' nel blocco Esegui script che funziona un po 'meglio se più persone lavorano su un progetto.
chris

9
Leggi devforums.apple.com/message/894791#894791 se lo utilizzi con iOS7. In particolare, potresti dover cambiare <key> Title </key> in <key> FooterText </key> per farlo sembrare normale.
argento

2
Come renderlo un riquadro figlio: crea l'elemento 0 all'interno degli elementi delle preferenze. Sembra che non sia possibile selezionare Riquadro figlio come tipo, ma quello che si fa è creare un elemento sotto Elemento 0 (elemento secondario dell'articolo 0) e il primo elemento ha la chiave "Tipo". Per semplificare, fai clic con il pulsante destro del mouse su questo e seleziona Mostra chiavi / valori non elaborati. Si desidera impostare il valore per Type in modo che sia PSChildPaneSpecifier. Una volta disattivato Mostra chiavi / valori non elaborati, ora verrà visualizzato il riquadro figlio, anche nel nome dell'elemento 0, ovvero "È 0 (riquadro figlio -)". Questo è quello che vuoi.
Marc

36

Ecco la stessa soluzione fornita da @JosephH (senza traduzioni), ma fatta in Python per chiunque preferisca Python a 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"
)

Questa risposta richiede più voti positivi. Sintassi Python Sintassi <3Perl. ;)
Ricardo Sanchez-Saez

5
current_file = codecs.open(filename, 'r', 'utf-8')per le licenze Unicode.
user2821144

Grazie! Ho creato una nuova versione basata su questa che è ottima per Cartagine. Rimuove anche alcune nuove righe non necessarie dal testo della licenza. Dai
Zyphrax

1
Ho lavorato un po 'di più, vedi: github.com/Building42/AckAck
Zyphrax

15

In alternativa, per coloro che utilizzano CocoaPods, genererà un plist di "Riconoscimenti" per ciascun target specificato nel Podfile che contiene i dettagli della licenza per ciascun Pod utilizzato in quel target (supponendo che i dettagli siano stati specificati nelle specifiche del Pod). Il file dell'elenco delle proprietà che può essere aggiunto al bundle delle impostazioni iOS.

Ci sono anche progetti in corso per consentire la conversione e la visualizzazione di questi dati all'interno dell'app:

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

https://github.com/cocoapods/CPDAcknowledgements


3
Ecco maggiori informazioni su di esso: github.com/CocoaPods/CocoaPods/wiki/Ringraziamenti
Oren

Tieni presente che il wiki di Cocoapods ha il nome del file di input come Pods-Riconoscimenti.plist, ma il file è effettivamente generato come Pods-riconoscimenti.plist ("a" minuscola). L'utilizzo del caso sbagliato interromperà l'installazione del pod se il tuo file system fa distinzione tra maiuscole e minuscole.
Keller

14

Ho pensato di inserire la mia iterazione sul fantastico codice Python di Sean nel mix. La differenza principale è che prende una directory di input e quindi la ricerca ricorsivamente per i file LICENSE. Deriva il valore del titolo dalla directory principale del file LICENSE, quindi funziona bene con cocoapods.

La motivazione era creare uno script di build per mantenere automaticamente aggiornata la sezione legale della mia app mentre aggiungo o rimuovo i pod. Fa anche altre cose come rimuovere le nuove righe forzate dalle licenze in modo che i paragrafi appaiano un po 'meglio sui dispositivi.

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

inserisci qui la descrizione dell'immagine


8

Ho realizzato uno script in Ruby ispirato dallo script @JosephH. Questa versione, a mio parere, rappresenterà meglio i singoli progetti open source.

Visita iOS-AcknowledgementGenerator per scaricare lo script e il progetto di esempio.

Ecco come appariranno i riconoscimenti nella tua app:

Settings.app Settings.bundle Ringraziamenti inserisci qui la descrizione dell'immagine


2

Questa è un'aggiunta alla risposta di JosephH. (Non ho il rappresentante per commentare)

Ho dovuto spostarmi <key>StringsTable</key> <string>Acknowledgements</string> al di sopra dell'ultimo </dict>nello script Perl.

Prima di questa modifica, la sezione Riconoscimenti nell'app era vuota e XCode non poteva leggere il risultante elenco Riconoscimenti. ("Impossibile leggere i dati perché non sono nel formato corretto.")

(XCode 6.3.2 iOS 8.3)


2

Lo script Python di Sean in questo thread funziona. Ma ci sono un paio di cose fondamentali da sapere.

  1. in Xcode, fai clic con il pulsante destro del mouse sulla parte superiore dell'albero del Navigatore progetto, sul nome del tuo progetto e aggiungi un nuovo gruppo. Questo inserisce una nuova cartella nel tuo progetto.
  2. Aggiungi lo script di Sean lì e assicurati di salvarlo come: Riconoscimenti.py.
  3. Assicurati di avere Python installato sul tuo sistema. Sto usando un Mac.
  4. Aggiungi un primo file di licenza alla cartella che hai creato in 1. Rendilo semplice come avere solo una parola nel file, ad esempio: Test. Salvalo nella cartella come Test1.license.
  5. Configura il tuo Settings.bundle secondo JosephH sopra.
  6. Usa la tua app Terminal per CD nella cartella che hai creato in 1.
  7. Esegui lo script. Digita: python Riconoscimenti.py. Se non ricevi errori, tornerà subito al prompt del Terminale. Fai tutto questo prima di aggiungere qualsiasi script di esecuzione a Build.
  8. Crea ed esegui la tua app.
  9. Tocca due volte il pulsante Home dell'iPhone e uccidi Impostazioni. Non raccoglie spesso la modifica delle Impostazioni per la tua app fino al riavvio delle Impostazioni.
  10. Dopo aver riavviato le Impostazioni, vai alla tua app e guarda se ha funzionato.
  11. Se tutto ha funzionato, aggiungi lentamente più file di licenza ma esegui lo script ogni volta. È possibile ottenere errori durante l'esecuzione dello script a causa di determinati caratteri nel file, quindi il modo più semplice per eseguire il debug è aggiungere un file, eseguire lo script, vedere se ha funzionato e procedere. Altrimenti, modifica i caratteri speciali dal file .license.
  12. Non ho ottenuto il funzionamento di Run Build Script secondo le istruzioni sopra. Ma questo processo funziona bene se non cambi i file .license così spesso.

1

Ack Ack: Generatore di riconoscimenti Plist
Qualche tempo fa ho creato uno script Python che scansiona i file di licenza e crea un bel plist di riconoscimenti che puoi usare nel tuo Settings.plist. Fa molto del lavoro per te.

https://github.com/Building42/AckAck

Caratteristiche

  • Rileva le cartelle Carthage e CocoaPods
  • Rileva i file plist esistenti per le licenze personalizzate
  • Pulisce i testi della licenza rimuovendo le nuove righe e le interruzioni di riga non necessarie
  • Fornisce molte opzioni di personalizzazione (vedi --helpper i dettagli)
  • Supporta sia Python v2 che v3

Installare

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

Correre

./ackack.py

Immagine dello schermo

Ringraziamenti

Se hai suggerimenti per miglioramenti, sentiti libero di pubblicare un problema o tirare una richiesta su GitHub!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.