La mejor forma de agregar una sección de licencia al conjunto de configuraciones de iOS

Mi aplicación para iOS usa una cantidad de componentes de terceros con licencia de Apache 2.0 y licencias similares, lo que requiere que incluya varios fragmentos de texto, este tipo de cosas:

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

Parece haber un precedente razonable para poner esta información bajo una subinserción de ‘Licencia’ en el conjunto de configuraciones (en el ipad facebook, páginas, keynote, números y wikipanion todos parecen hacer esto).

Estoy luchando un poco para lograr lo mismo; Parece que necesito dividir el texto línea por línea e ingresar xcode una línea a la vez (y xcode4 parece tener un problema al bloquear las listas).

Parece que es casi seguro que haya algún script en alguna parte, o alguna forma simple de hacerlo que me he perdido.

Creo que ahora pude resolver todos los problemas con los que me estaba metiendo.

  • Parece que lo mejor es utilizar títulos de elementos de grupo para mantener las licencias (esto es lo que hace Apple en las aplicaciones de iWork). Sin embargo, hay un límite en la longitud de estos (y todavía no he descubierto exactamente cuál es el límite), por lo que debe dividir cada archivo de licencia en varias cadenas.
  • Puede crear un salto de línea dentro de estos mediante la inclusión de un retorno de carro literal (es decir, también conocido como ^ M, \ r o 0x0A)
  • Asegúrese de no incluir ningún texto a mitad de texto. Si lo hace, algunas o todas las cadenas del archivo serán ignoradas en silencio.

Tengo un script de conveniencia que utilizo para ayudar a generar el archivo .plist y .strings, que se muestra a continuación.

Para usarlo:

  1. Crea un directorio de ‘licencias’ bajo tu proyecto
  2. Ponga el script en ese directorio
  3. Coloque cada licencia en ese directorio, una por archivo, con nombres de archivo que terminen .license
  4. Realice cualquier reformateo necesario en las licencias. (por ejemplo, eliminar espacios adicionales al comienzo de las líneas, asegúrese de que no haya saltos de línea a mitad de párrafo). Debería haber una línea en blanco entre cada párrafo
  5. Cambiar al directorio de licencias y ejecutar el script
  6. Edite su conjunto de configuraciones Root.plist para incluir una sección secundaria llamada ‘Acknowledgments’

Aquí está el guión:

 #!/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';     StringsTable Acknowledgements PreferenceSpecifiers  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";  Type PSGroupSpecifier Title $keynum  EOD print $outfh "\"$keynum\" = \"$str\";\n"; $keynum = $key.(++$cnt); } } print $plistfh <<'EOD';    EOD close($outfh); close($plistfh); 

Configurando su Settings.bundle

Si no ha creado un archivo Settings., vaya a Archivo -> Nuevo -> Nuevo archivo …

En la sección de Recursos, encuentre el Paquete de Configuraciones. Use el nombre predeterminado y guárdelo en la raíz de su proyecto.

Expanda el grupo Settings.bundle y seleccione Root.plist . Tendrá que agregar una nueva sección donde su clave será Preference Items de Preference Items de tipo Array . Agregue la siguiente información:

enter image description here

La clave de Filename apunta al plist que fue creado por este script. Puedes cambiar el title a lo que quieras.

Ejecutar script en tiempo de comstackción

Además, si desea que este script se ejecute cada vez que crea su proyecto, puede agregar una fase de comstackción a su objective:

  1. Ve a tu archivo de proyecto
  2. Seleccione el objective
  3. Haga clic en la pestaña Crear fases
  4. En la esquina inferior derecha de ese panel, haga clic en ‘Agregar fase de construcción’
  5. Seleccione ‘Agregar secuencia de ejecución’
  6. Arrastre y suelte su script de Perl en la sección de su script. Modificar para que se vea así:
  1. cd $SRCROOT/licenses ( $SRCROOT apunta a la raíz de su proyecto)
  2. ./yourScriptName.pl

Una vez que haya terminado, puede arrastrar la fase de comstackción Run Script antes en el proceso de comstackción. Deberá moverlo hacia arriba antes de Compile Sources para que las actualizaciones de su paquete de configuraciones sean comstackdas y copiadas.

Actualización para iOS 7: iOS 7 parece manejar la tecla “Título” diferente y está estropeando el texto renderizado. Para arreglar que Acknowledgements.plist generado necesite usar la tecla “FooterText” en lugar de “Title”. Esta es la forma de cambiar la secuencia de comandos:

 for my $str (split /\r\r/, $value) { print $plistfh <<"EOD";  Type PSGroupSpecifier FooterText # <= here is the change $keynum  EOD print $outfh "\"$keynum\" = \"$str\";\n"; $keynum = $key.(++$cnt); } 

Aquí está la misma solución que @JosephH proporcionó (sin traducciones), pero hecho en Python para cualquiera que prefiera python sobre 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" ) 

Como alternativa, para aquellos que usan CocoaPods, generará un ploteo de ‘Agradecimientos’ para cada objective especificado en su Podfile que contiene los detalles de la Licencia para cada Pod utilizado en ese objective (suponiendo que se hayan especificado los detalles en la especificación del Pod). El archivo de lista de propiedades que se puede agregar al conjunto de configuraciones de iOS.

También hay proyectos en curso para permitir que estos datos se conviertan y se muestren dentro de la aplicación en su lugar:

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

https://github.com/cocoapods/CPDAcknowledgements

Pensé que lanzaría mi iteración sobre el asombroso código python de Sean en la mezcla. La principal diferencia es que toma un directorio de entrada y luego busca recursivamente los archivos de LICENCIA. Deriva el valor del título del directorio padre del archivo LICENSE, por lo que funciona bien con cocoapods.

La motivación fue crear un script de comstackción para mantener automáticamente actualizada la sección legal de mi aplicación a medida que agrego o elimino pods. También hace otras cosas como eliminar las nuevas líneas forzadas de las licencias para que los párrafos se vean mejor en los dispositivos.

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

enter image description here

Hice un guión en Ruby con el guión de @JosephH. Esta versión, en mi opinión, representará mejor los proyectos individuales de código abierto.

Wisit iOS-AcknowledgementGenerator para descargar el script y el proyecto de muestra.

Así es como se verán los agradecimientos en su aplicación:

Settings.appSettings.bundleExpresiones de gratitudenter image description here

Este es un apéndice a la respuesta de Joseph H. (No tengo el representante para comentar)

Tuve que mover StringsTable Acknowledgements hasta el último en el script de Perl.

Antes de esta modificación, la sección de Acknowledgments en la aplicación estaba vacía y XCode no podía leer los Acknowledgements.plist resultantes. (“No se pudieron leer los datos porque no están en el formato correcto”).

(Xcode 6.3.2 iOS 8.3)

El script de Python de Sean en este hilo funciona. Pero hay un par de cosas básicas que debes saber.

  1. en Xcode, haga clic derecho en la parte superior del árbol de Project Navigator, en el nombre de su proyecto, y agregue un nuevo grupo. Esto pone una nueva carpeta en tu proyecto.
  2. Agregue el script de Sean allí y asegúrese de guardarlo como: Acknowledgements.py.
  3. Asegúrate de tener Python instalado en tu sistema. Estoy usando una Mac.
  4. Agregue un primer archivo de licencia a la carpeta que creó en 1. Haga que sea tan simple como tener solo una palabra en el archivo, por ejemplo: Prueba. Guárdelo en la carpeta como Test1.license.
  5. Configure su juego de Configuración según JosephH arriba.
  6. Use su aplicación Terminal para CD en la carpeta que creó en 1.
  7. Ejecute el script Escriba: python Acknowledgements.py. Si no obtiene ningún error, volverá directamente a la solicitud de la Terminal. Haga todo esto antes de agregar cualquier script de ejecución a Build.
  8. Crea y ejecuta tu aplicación.
  9. Toca dos veces el botón de inicio del iPhone y cancela Configuración. A menudo no recupera el cambio de Configuración para su aplicación hasta que se reinicie la Configuración.
  10. Después de reiniciar la Configuración, ve a tu aplicación y mira para ver si funcionó.
  11. Si todo eso funcionó, agregue lentamente más archivos de licencia pero ejecute el script cada vez. Puede obtener errores al ejecutar el script debido a ciertos caracteres en el archivo, por lo que la forma más fácil de depurarlo es agregar un archivo, ejecutar el script, ver si funcionó y continuar. De lo contrario, edite los caracteres especiales del archivo .license.
  12. No conseguí que Run Build Script funcionara de acuerdo con las instrucciones anteriores. Pero este proceso funciona bien si no está cambiando los archivos .license que a menudo.