Añadir entrada a iOS.archivo plist a través de Cordova config.XML


Soy nuevo en Cordova CLI.

Necesito realizar los siguientes pasos mediante programación a través de Cordova.

  1. En el proyecto .plist añade una nueva fila
  2. Introduzca los siguientes valores en la nueva fila:
  3. Key: GDLibraryMode Type:String (default) Value : GDEnterpriseSimulation

Creo que necesito hacer esto en la configuración.archivo xml en la raíz de mi proyecto (o tal vez el de la carpeta "platforms").

Puede alguien explícame cómo agregar la entrada a través de la configuración.xml de modo que la entrada anterior se añade en tiempo de compilación?

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

Author: ROMANIA_engineer, 2014-03-31

13 answers

No creo que pueda hacer esto a través de la modificación directa 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 tienes que crear un plugin, porque pueden insertar entradas plist: http://docs.phonegap.com/en/3.3.0/plugin_ref_spec.md.html#Plugin%20Specification

Consulte la sección 'config-file element'. He aquí una conjetura en cuanto a lo que la sección relevante de la plugin.xml será aspecto:

<platform name="ios">
<config-file target="*-Info.plist" parent="CFBundleURLTypes">
<array>
    <dict>
        <key>GDLibraryMode</key>
        <string>GDEnterpriseSimulation</string>
    </dict>
</array>
</config-file>
</platform>

Entonces puedes instalar el plugin: cordova plugin add <your plugin name or file location>

 58
Author: mooreds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-01 14:44:10

Me gusta mucho la solución de @james usando un gancho Cordova. Sin embargo, hay dos cuestiones. El docs estado:

  • "recomendamos encarecidamente escribir tus hooks usando el nodo .js "
  • "/hooks el directorio se considera obsoleto a favor de los elementos hook en config.xml "

Aquí hay un Nodo.js implementation using the plist NPM package:

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 proporcionados por Cordova, los 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:

<platform name="ios">
    <hook type="after_prepare" src="scripts/my-hook.js" />
</platform>
 39
Author: TachyonVortex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:35

Puede usar la utilidad PlistBuddy dentro de un script Cordova hook para modificar la *-Info.archivo plist.

Por ejemplo, tengo el siguiente script bajo <project-root>/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 del script es porque PlistBuddy devuelve con un código de salida de error si la clave que se agrega ya existe, y no proporciona una forma de detectar si la clave ya existe. Cordova reportará un error de compilación si el script hook sale con un estado de error. Mejor manejo de errores es posible, pero un dolor de implementar.

 32
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-23 13:33:11

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

1.In tu aplicación navega hasta tu configuración.XML. Escriba esta pieza en su configuración bajo la etiqueta de plataforma <platform name="ios">.

 <config-file platform="ios" target="*-Info.plist" parent="UIFileSharingEnabled">
      <true/>
  </config-file>

2. Luego vaya a su herramienta de línea de comandos y escriba: cordova prepare

  1. Desinstale y reinstale su aplicación en su dispositivo, y verá su aplicación aparecer en itunes para que pueda compartir cualquier archivo entre su dispositivo.

Algunas cosas, asegúrese de que Cordova está al día, y que ha añadido 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 ejecuta el comando cordova prepare está utilizando Xcode SDK de Apple que se genera en la carpeta platform/ios. Allí puede ver el archivo plist que se genera para su aplicación, que está etiquetado como "yourApp-info.plist". Alli puede ver la nueva clave y cadena producida en el diseño xml que se ve así:

 <key>UIFileSharingEnabled</key>
 <true/>

También una advertencia, mi compañía dejó caer esta aplicación de marco ionic en mi regazo hace un par de semanas (con un plazo muy corto). Todo lo que te estoy diciendo 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.

 13
Author: Eric Weiss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-22 16:28:55

Esto parece ser posible ahora usando la configuración.xml: al menos algunos autores de plugins principales lo dicen. Por ejemplo, en los documentos para el complemento Cordova Camera, discuten el nuevo requisito en iOS 10 de que proporcione una cadena de mensaje de permiso en la lista plist. Para lograrlo, sugieren ejecutar el comando plugin add con argumentos, así:

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 <plugin> a la configuración.xml, pero tiene un <variable> niño:

<plugin name="cordova-plugin-camera" spec="~2.3.0">
    <variable name="CAMERA_USAGE_DESCRIPTION" value="My App would like to access your camera, to take photos of your documents." />
</plugin>

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

  <key>NSCameraUsageDescription</key>
  <string/>
  <key>NSPhotoLibraryUsageDescription</key>
  <string/>

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

 13
Author: XML,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-06 04:06:22

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

 <!-- ios -->
 <platform name="ios">

     <config-file target="*-Info.plist" parent="NSLocationWhenInUseUsageDescription">
         <string></string>
     </config-file>
     <config-file target="*-Info.plist" parent="NSCameraUsageDescription">
         <string></string>
     </config-file>
      <config-file target="*-Info.plist" parent="NSPhotoLibraryUsageDescription">
         <string></string>
     </config-file>

 </platform>

Pero por ahora, no puedes config NSCameraUsageDescription y NSPhotoLibraryUsageDescription en plugin. Debe configurarlos en plataforma - > proyecto iOS por Xcode o en el archivo *-Info.plist.

Desde iOS 10 es obligatorio agregar una NSCameraUsageDescription y NSPhotoLibraryUsageDescripción en la información.plist.

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

 8
Author: Hung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-14 11:04:08

Puede establecer el nombre para mostrar en el plist de la aplicación editando directamente el ios.json en el directorio plugins.

Añadiendo lo siguiente a config_munge.sección archivos de ios.el archivo json hará el truco y se mantendrá incluso cuando se use la CLI.

"*-Info.plist": {

    "parents": {
        "CFBundleDisplayName": [
            {
                "xml": "<string>RevMob Ads Cordova Plugin Demo</string>",
                "count": 1
            }
        ]
    }
}

Aquí hay un ejemplo completo

 4
Author: blakgeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-25 00:57:16

@TachyonVortex la solución parece ser la mejor opción, pero se estaba cayendo en mi caso. El problema fue causado por un campo NSMainNibFile vacío que no está convertido correctamente por el paquete plist NPM. En el .plist file

    <key>NSMainNibFile</key>
    <string></string>
    <key>NSMainNibFile~ipad</key>
    <string></string>

Se convierte en:

    <key>NSMainNibFile</key>
    <string>NSMainNibFile~ipad</string>

Lo arreglé añadiendo al script:

    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:

<platform name="ios">
    <hook type="before_build" src="scripts/my-hook.js" />
</platform>
 3
Author: Sebastien Horin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:47

He utilizado este plugin para resolver el problema, tal vez te puede ayudar:

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

 2
Author: Malo Degachi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-11 16:04:47

Estoy usando lo siguiente en el ionic 3 sin ningún complemento adicional o importaciones y creo que esto podría ser útil para otros:

<platform name="ios">
    <edit-config file="*-Info.plist" mode="merge" target="NSLocationWhenInUseUsageDescription">
        <string>Location is required so we can show you your nearby projects to support.</string>
    </edit-config>
    <edit-config file="*-Info.plist" mode="merge" target="NSCameraUsageDescription">
        <string>Camera accesss required in order to let you select profile picture from camera.</string>
    </edit-config>
    <edit-config file="*-Info.plist" mode="merge" target="NSPhotoLibraryUsageDescription">
        <string>Photo library accesss required in order to let you select profile picture from gallery / library.</string>
    </edit-config>
</platform>
 1
Author: necixy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-21 06:57:12

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

  1. Asegúrese de que su .plist es xml, no binario! Puede usar plutil para convertir un binario .plist en xml, y confirmarlo al control de versiones.

    plutil -convert xml1 Info.plist

  2. Las instrucciones para <config-file> indican que target= es relativo al proyecto xcode generado en platforms/ios/<project>/, pero encontré que necesitaba anteponer un comodín carácter a mi camino para conseguir que funcione:

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

  3. Si desea agregar una clave en el nivel superior de .plist, debe establecer parent igual al nombre de la clave, y luego anidar una etiqueta <string> con el valor. Usar un <array> o <dict> como se muestra en cualquier ejemplo hará que estas claves se aniden bajo parent.

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

<platform name="ios">
    <config-file target="*/Resources/MyResources.bundle/Info.plist" parent="MyDistribution">
        <string>Cordova</string>
    </config-file>
    <config-file target="*/Resources/MyResources.bundle/Info.plist" parent="MyVersion">
        <string>3.2.0</string>
    </config-file>
</platform>
 0
Author: Sky Kelsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-10 23:31:00

Prefiero el gancho after_prepare para proyectos más grandes o si tiene varios complementos que usan los mismos permisos. Pero siempre puedes ir por el camino sencillo:

Simplemente: - eliminar el plugin que requiere el permiso deseado - añadir de nuevo con save guardar - en configuración.xml, el plugin ahora tiene una nueva variable con una descripción en blanco que puede rellenar - ahora construye ios con release release y se configurarán.

 0
Author: Emanuel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-25 00:13:07

Solo necesita los siguientes pasos 1.

Ir al navegador del proyecto Seleccione el destino Haga clic en información desde la pestaña opción otras opciones son configuración de compilación fase de compilación verá el valor del tipo de clave Cuando apuntes a cualquier nombre clave encontrarás + y-sign haga clic en el signo + escribir Key: GDLibraryMode en la sección clave Type:String en la sección tyoe Value:GDEnterpriseSimulation en la sección valor

 -4
Author: Nitin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-31 18:31:04