Ajouter une entrée à iOS.fichier plist via Cordova config.XML

Je suis nouveau à la Cordova CLI.

Je dois effectuer les étapes suivantes par programme via Cordova.

  1. Dans le projet .plist ajoute une nouvelle ligne
  2. Entrez les valeurs suivantes dans la nouvelle ligne:
  3. Clé: GDLibraryMode de Type:Chaîne de caractères (par défaut) Valeur:GDEnterpriseSimulation

Je pense que je dois le faire dans la configuration.fichier xml dans la racine de mon projet (ou peut-être celui dans le dossier "plates-formes").

Quelqu'un peut-il expliquez-moi comment ajouter l'entrée via la configuration.xml pour que l'entrée ci-dessus soit ajoutée au moment de la compilation?

J'utilise Cordova 3.3.1-0.42 (je sais que ce n'est pas le dernier). J'ai déjà fait mon projet et tout va bien, j'ai juste besoin d'ajouter cette entrée ajoutée au pList.

75
demandé sur ROMANIA_engineer 2014-03-31 22:15:24

13 réponses

Je ne pense pas que vous puissiez le faire via une modification directe config.xml. Au moins, je n'ai vu aucune mention de cela dans les docs: http://cordova.apache.org/docs/en/3.3.0/config_ref_index.md.html

Je pense que vous devez créer un plugin, car ils peuvent insérer des entrées plist: http://docs.phonegap.com/en/3.3.0/plugin_ref_spec.md.html#Plugin%20Specification

Voir la section' config-file element'. Voici une estimation de ce que la section pertinente du plugin.xml va faire regardez comme:

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

Ensuite, vous pouvez installer le plugin: cordova plugin add <your plugin name or file location>

58
répondu mooreds 2014-04-01 14:44:10

J'aime vraiment la solution de @james en utilisant un crochet Cordova. Cependant, il y a deux problèmes. L'étatdocs :

  • " nous vous recommandons fortement d'écrire vos crochets en utilisant Node.js "
  • "/hooks le répertoire est considéré comme obsolète en faveur des éléments hook dans config.xml "

Voici un nœud.implémentation js en utilisant le paquet 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 tous les types de crochet fournis par Cordova, ceux pertinents pour votre situation sont:

  • after_prepare
  • before_compile

Choisissez un type de crochet, puis ajoutez le crochet à votre fichier config.xml:

<platform name="ios">
    <hook type="after_prepare" src="scripts/my-hook.js" />
</platform>
39
répondu TachyonVortex 2017-05-23 10:31:35

Vous pouvez utiliser l'utilitaire PlistBuddy dans un script Cordova hook pour modifier les * - Info.fichier plist.

Par exemple, j'ai le script suivant sous {[1] } qui ajoute une propriété de dictionnaire et ajoute une entrée dans ce dictionnaire:

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

Assurez-vous de rendre le script exécutable (chmod +x).

Le true à la fin du script est parce que PlistBuddy retourne avec un code de sortie d'erreur si la clé ajoutée existe déjà, et ne fournit pas un moyen de détecter si la clé existe déjà. Cordova signalera une erreur de construction si le script hook se termine avec un statut d'erreur. Meilleure gestion des erreurs est possible, mais une douleur à mettre en œuvre.

32
répondu James 2015-10-23 13:33:11

Ce sont les étapes que j'ai fini par faire pour permettre à mon application de partager des fichiers via itunes entre appareils.

1.In votre application accédez à votre configuration.XML. Tapez cette pièce dans votre configuration sous la balise plate-forme <platform name="ios">.

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

2. Ensuite, allez dans votre outil de ligne de commande et tapez: cordova prepare

  1. Désinstaller et réinstaller l'application sur votre appareil, et vous verrez que votre application apparaît dans itunes pour vous permettre de partager des fichiers entre votre appareil.

Quelques choses, assurez-vous que cordova est à jour, et que vous avez ajouté la plate-forme pour ios.

npm install -g cordova

Cette commande installe cordova.

cordova platform add ios

Cette commande ajoute la plate-forme pour ios.

Lorsque vous exécutez la commande cordova prepare, vous utilisez le SDK Xcode d'Apple généré dans le dossier platform/ios. Là, vous pouvez voir le fichier plist qui est généré pour votre application, qui est étiqueté comme " yourApp-info.plist". Y vous pouvez voir la nouvelle clé et la nouvelle chaîne produites dans la mise en page xml qui ressemble à ceci:

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

Aussi un mot d'avertissement, ma société a laissé tomber cette application de framework ionic sur mes genoux il y a quelques semaines (avec un délai très court). Tout ce que je vous dis est basé sur deux semaines d'apprentissage. Donc, ce n'est peut-être pas la meilleure pratique, mais j'espère que cela aidera quelqu'un.

13
répondu Eric Weiss 2016-04-22 16:28:55

Cela semble être possible maintenant en utilisant la configuration.xml: au moins certains auteurs de plugins dire. Par exemple, dans les documents pour le Plugin Cordova Camera, ils discutent de la nouvelle exigence dans iOS 10 que vous fournissez une chaîne de message d'autorisation dans le plist. Pour l'accomplir, ils suggèrent d'exécuter la commande Add du plugin avec des arguments, ainsi:

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

Cela a pour résultat que vous obtenez non seulement un nouveau <plugin> ajouté à config.xml, mais il a un <variable> enfant:

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

Qui semble alors corréler avec les nouvelles clés dans mes informations.plist, peut-être en quelque sorte en passant les valeurs à l'exécution?

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

Je mentirais si je disais que je sais exactement comment cela fonctionne, mais cela semble indiquer le chemin.

13
répondu XML 2016-10-06 04:06:22

Mise à jour: pour les gens veulent utiliser la caméra avec iOS > = 10. Cela signifie, par la normale, vous pouvez config dans le plugin comme:

 <!-- 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>

Mais pour l'instant, vous ne pouvez pas config NSCameraUsageDescription et NSPhotoLibraryUsageDescription dans le plugin. Vous devez les configurer dans platform- > iOS project par Xcode ou dans le fichier *-Info.plist.

Depuis iOS 10, il est obligatoire d'ajouter un NSCameraUsageDescription et NSPhotoLibraryUsageDescription dans l'info.plist.

En savoir plus: https://www.npmjs.com/package/cordova-plugin-camera

8
répondu Hung 2017-07-14 11:04:08

Vous pouvez définir le nom d'affichage dans le plist de l'application en éditant directement l'ios.json dans le répertoire plugins.

Ajouter ce qui suit au config_munge.les fichiers de la section de l'ios.le fichier json fera l'affaire et il sera maintenu même lors de l'utilisation de la CLI.

"*-Info.plist": {

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

Voici un exemple complet

4
répondu blakgeek 2015-05-25 00:57:16

@ TachyonVortex la solution semble être la meilleure option mais s'est écrasée dans mon cas. Le problème a été causé par un champ nsmainnibfile vide qui n'est pas correctement converti par le paquet npm plist. Dans le .plist fichier

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

Est converti en:

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

Je l'ai corrigé avec en ajoutant au script:

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

Le script ressemble enfin (scripts/mes-crochet.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' });

};

Et config.xml:

<platform name="ios">
    <hook type="before_build" src="scripts/my-hook.js" />
</platform>
3
répondu Sebastien Horin 2017-05-23 12:34:47

J'ai utilisé ce plugin pour résoudre le problème, peut-être que cela peut vous aider :

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

2
répondu Malo Degachi 2016-04-11 16:04:47

J'utilise ce qui suit dans le ionic 3 sans aucun plugin ou importation supplémentaire et je pense que cela pourrait être utile pour les autres:

<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
répondu necixy 2018-09-21 06:57:12

Si vous tentez de modifier un .plist dans un natif iOS plugin avec un <config-file> balise plugin.xml, voici ce que vous devez faire:

  1. Assurez-vous que votre .plist est xml, pas binaire! Vous pouvez utiliser plutil pour convertir un binaire .plist en xml et le valider dans le contrôle de version.

    plutil -convert xml1 Info.plist

  2. Les instructions pour <config-file> indiquent que target= est relatif au projet Xcode généré à platforms/ios/<project>/, mais j'ai trouvé que je devais ajouter un caractère générique caractère de mon chemin pour le faire fonctionner:

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

  3. Si vous souhaitez ajouter une clé au niveau supérieur de .plist, vous devez définir parent égal au nom de la clé, puis imbriquer une balise <string> avec la valeur. L'utilisation d'un <array> ou <dict> comme le montrent tous les exemples entraînera l'imbrication de ces clés sous parent.

Voici un exemple complet qui fonctionne pour moi pour ajouter plusieurs propriétés de niveau supérieur:

<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
répondu Sky Kelsey 2016-08-10 23:31:00

Je préfère le crochet after_prepare pour les projets plus importants ou si vous avez plusieurs plugins utilisant les mêmes autorisations. Mais vous pouvez toujours aller de la manière simple:

Simplement: - supprimer le plugin qui nécessite l'autorisation souhaitée - ajouter à nouveau avec --enregistrer - dans la configuration.xml, le plugin a maintenant une nouvelle variable avec une description vide que vous pouvez remplir - maintenant, construisez ios avec -- release et ils seront définis.

0
répondu Emanuel 2017-03-25 00:13:07

Vous avez juste besoin des étapes suivantes 1.

Aller au navigateur du projet Sélectionnez la cible Cliquez sur info de l'onglet option autre option sont build setting build phase vous verrez la valeur de type de clé Lorsque vous pointez sur un nom de clé, vous trouverez + et-sign cliquez sur le signe + écrire Key: GDLibraryMode dans la section Clé Type:String dans la section tyoe Value:GDEnterpriseSimulation dans la section valeur

-4
répondu Nitin 2014-03-31 18:31:04