Agregar entrada al archivo .plist de iOS a través de Cordova config.xml

Soy nuevo en el CLI de Cordova.

Necesito realizar los siguientes pasos programáticamente a través de cordova.

  1. En el proyecto .plist agrega una nueva fila
  2. Ingrese los siguientes valores en la nueva fila:
  3. Clave : GDLibraryMode Tipo : String (predeterminado) Valor : GDEnterpriseSimulation

Creo que necesito hacer esto en el archivo config.xml en la raíz de mi proyecto (o tal vez en la carpeta “plataformas”).

¿Puede alguien explicarme cómo agregar la entrada a través de config.xml para que la entrada anterior se agregue en tiempo de comstackción?

Estoy usando Cordova 3.3.1-0.42 (sé que no es el último). Ya he hecho mi proyecto y todo está bien, solo necesito agregar esta entrada agregada a la pList.

No creo que puedas hacer esto mediante una modificación directa de config.xml . Al menos, no vi ninguna mención de esto en los documentos: http://cordova.apache.org/docs/en/3.3.0/config_ref_index.md.html

Creo que debes crear un complemento, porque pueden insertar entradas plist: http://docs.phonegap.com/en/3.3.0/plugin_ref_spec.md.html#Plugin%20Specification

Consulte la sección ‘elemento de archivo de configuración’. Aquí hay una conjetura sobre cómo se verá la sección relevante de plugin.xml :

     GDLibraryMode GDEnterpriseSimulation     

Luego puede instalar el complemento: cordova plugin add

Realmente me gusta la solución de @ james con un gancho de Cordova. Sin embargo, hay dos problemas. El estado de los documentos :

  • “le recomendamos escribir sus ganchos usando Node.js ”
  • /hooks directory se considera obsoleto a favor de los elementos hook en config.xml

Aquí hay una implementación de Node.js usando el paquete plist NPM:

 var fs = require('fs'); // nodejs.org/api/fs.html var plist = require('plist'); // www.npmjs.com/package/plist var FILEPATH = 'platforms/ios/.../...-Info.plist'; module.exports = function (context) { var xml = fs.readFileSync(FILEPATH, 'utf8'); var obj = plist.parse(xml); obj.GDLibraryMode = 'GDEnterpriseSimulation'; xml = plist.build(obj); fs.writeFileSync(FILEPATH, xml, { encoding: 'utf8' }); }; 

De todos los tipos de gancho provistos por cordova, los más relevantes para su situación son:

  • after_prepare
  • before_compile

Elija un tipo de gancho y luego agregue el gancho a su archivo config.xml :

    

Puede usar la utilidad PlistBuddy dentro de una secuencia de comandos de gancho Cordova para modificar el archivo * -Info.plist.

Por ejemplo, tengo el siguiente script en /hooks/after_prepare/010_modify_plist.sh que agrega una propiedad de diccionario y agrega una entrada dentro de ese diccionario:

 #!/bin/bash PLIST=platforms/ios/*/*-Info.plist cat << EOF | Add :NSAppTransportSecurity dict Add :NSAppTransportSecurity:NSAllowsArbitraryLoads bool YES EOF while read line do /usr/libexec/PlistBuddy -c "$line" $PLIST done true 

Asegúrese de hacer el script ejecutable ( chmod +x ).

El true al final de la secuencia de comandos se debe a que PlistBuddy devuelve con un código de salida de error si la clave que se está agregando ya existe, y no proporciona una forma de detectar si la clave ya existe. Cordova informará un error de comstackción si el script hook sale con un estado de error. Es posible un mejor manejo de errores, pero es difícil implementarlo.

Esto parece ser posible ahora usando config.xml: al menos algunos autores de plugins principales lo dicen. Por ejemplo, en los documentos del Complemento de cámara de Cordova , se analiza el nuevo requisito en iOS 10 de que se proporciona una cadena de mensaje de permiso en el plist. Para lograrlo, sugieren ejecutar el complemento agregar comando con argumentos, por lo tanto:

cordova plugin add cordova-plugin-camera --variable CAMERA_USAGE_DESCRIPTION="My App would like to access your camera, to take photos of your documents."

Esto tiene el resultado de que no solo se agrega un nuevo a config.xml, sino que tiene un elemento secundario :

    

Que luego parece correlacionarse con las nuevas claves en mi info.plist, ¿tal vez de alguna manera pasar los valores en tiempo de ejecución?

  NSCameraUsageDescription  NSPhotoLibraryUsageDescription  

Mentiría si dijera que sé exactamente cómo funciona, pero parece indicar el camino.

Estos son los pasos que terminé haciendo para permitir que mi aplicación comparta archivos a través de iTunes entre dispositivos.

1.En su aplicación vaya a su config.xml. Escriba esta pieza en su configuración bajo la etiqueta de la plataforma .

     

2. Luego ve a tu línea de comando y escribe: cordova prepare

  1. Desinstale y vuelva a instalar su aplicación en su dispositivo, y verá que su aplicación aparece en iTunes para que pueda compartir los archivos entre sus dispositivos.

Algunas cosas, asegúrese de que cordova esté actualizado y de que haya agregado la plataforma para iOS.

 npm install -g cordova 

Este comando instala cordova.

 cordova platform add ios 

Este comando agrega la plataforma para ios.

Lo que está sucediendo es que cuando ejecutas el comando cordova prepare estás usando el Xcode SDK de Apple que se genera en la carpeta plataforma / ios. Allí puede ver el archivo plist que se genera para su aplicación, que está etiquetado como “yourApp-info.plist”. Allí puede ver la nueva clave y cadena producida en el diseño xml que se ve así:

  UIFileSharingEnabled  

También como advertencia, mi compañía dejó caer esta aplicación de ionic framework en mi regazo hace un par de semanas (con un plazo realmente corto). Todo lo que te digo se basa en un par de semanas de aprendizaje. Así que esta puede no ser la mejor práctica, pero espero que ayude a alguien.

ACTUALIZACIÓN: para las personas que quieran utilizar la cámara con iOS> = 10. Esto significa que, por normal, puede configurar en el complemento como:

              

Pero por ahora, no puede configurar NSCameraUsageDescription y NSPhotoLibraryUsageDescription en el complemento. *-Info.plist configurarlos en la plataforma -> proyecto iOS por Xcode o en el archivo *-Info.plist .

Desde iOS 10, es obligatorio agregar una descripción de NSCameraUsageDescription y NSPhotoLibraryUsageDescription en info.plist.

Obtenga más información: https://www.npmjs.com/package/cordova-plugin-camera

Puede configurar el nombre para mostrar en la lista de la aplicación editando directamente el archivo ios.json en el directorio de complementos.

Agregar lo siguiente a la sección config_munge.files del archivo ios.json hará el truco y se mantendrá incluso cuando se utiliza la CLI.

 "*-Info.plist": { "parents": { "CFBundleDisplayName": [ { "xml": "RevMob Ads Cordova Plugin Demo", "count": 1 } ] } } 

Aquí hay un ejemplo completo

La solución de @TachyonVortex parece ser la mejor opción, pero se derrumbó en mi caso. El problema fue causado por un campo NSMainNibFile vacío que el paquete plist NPM no convirtió correctamente. En el archivo .plist

  NSMainNibFile  NSMainNibFile~ipad  

se convierte a:

  NSMainNibFile NSMainNibFile~ipad 

Lo arreglé añadiendo al guión:

  obj.NSMainNibFile = ''; obj['NSMainNibFile~ipad'] = ''; 

El script finalmente se ve como (scripts / my-hook.js):

 var fs = require('fs'); // nodejs.org/api/fs.html var plist = require('plist'); // www.npmjs.com/package/plist var FILEPATH = 'platforms/ios/***/***-Info.plist'; module.exports = function (context) { var xml = fs.readFileSync(FILEPATH, 'utf8'); var obj = plist.parse(xml); obj.GDLibraryMode = 'GDEnterpriseSimulation'; obj.NSMainNibFile = ''; obj['NSMainNibFile~ipad'] = ''; xml = plist.build(obj); fs.writeFileSync(FILEPATH, xml, { encoding: 'utf8' }); }; 

y config.xml:

    

He usado este complemento para resolver el problema, tal vez pueda ayudarte:

https://www.npmjs.com/package/cordova-plugin-queries-schemes

Si está intentando modificar un .plist en un plugin nativo de iOS con una etiqueta en su plugin.xml , esto es lo que debe hacer:

  1. ¡Asegúrate de que tu .plist sea ​​xml, no binario! Puede usar plutil para convertir un .plist binario en xml y plutil al control de versiones.

    plutil -convert xml1 Info.plist

  2. Las instrucciones para indican que target= es relativo al proyecto xcode generado en platforms/ios// , pero descubrí que necesitaba anteponer un carácter comodín a mi ruta para que funcione:

    target="*/Resources/MyResources.bundle/Info.plist"

  3. Si desea agregar una clave en el nivel superior de .plist , debe establecer que parent sea igual al nombre de la clave, y luego anidar una etiqueta con el valor. Usar un o como muestran los ejemplos hará que estas claves se aniden en el elemento parent .

Aquí hay un ejemplo completo que me funciona para agregar múltiples propiedades de nivel superior:

   Cordova   3.2.0   

Prefiero el hook after_prepare para proyectos más grandes o si tienes varios complementos con los mismos permisos. Pero siempre puedes ir por el camino simple:

simplemente: – elimine el complemento que requiere el permiso deseado – agréguelo nuevamente con –save – en config.xml, el complemento ahora tiene una nueva variable con una descripción en blanco que puede completar; ahora comstack ios con – release y ellos serán establecidos.

Estoy utilizando lo siguiente en el ionic 3 sin ningún complemento o importación adicionales y creo que esto podría ser útil para otros:

   Location is required so we can show you your nearby projects to support.   Camera accesss required in order to let you select profile picture from camera.   Photo library accesss required in order to let you select profile picture from gallery / library.   

solo necesitas seguir los pasos 1.

Ir al navegador del proyecto Seleccionar el destino Hacer clic en la información de la pestaña opción Otra opción son la configuración de la construcción Fase de comstackción Verá el valor del tipo de tecla Cuando señale cualquier nombre de tecla encontrará + y – clic de signo en la Key: GDLibraryMode + escribir Key: GDLibraryMode en sección clave Type:String en la sección tyoe Value:GDEnterpriseSimulation en la sección de valor