web-dev-qa-db-fra.com

Ajouter une entrée au fichier iOS .plist via Cordova config.xml

Je suis nouveau sur la CLI Cordova.

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

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

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

Quelqu'un peut-il m'expliquer comment ajouter l'entrée via le fichier config.xml afin 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 la plus récente). J'ai déjà fait mon projet et tout va bien, il me suffit d'ajouter cette entrée ajoutée à la pList.

76
Red2678

Je ne pense pas que vous puissiez le faire via une ligne droite config.xml modification. Au moins, je n'ai vu aucune mention de cela dans la documentation: 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/fr/3.3.0/plugin_ref_spec.md.html#Plugin%20Specification

Voir la section 'élément de fichier de configuration'. Voici une estimation de ce que la section pertinente du plugin.xml ressemblera:

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

61
mooreds

J'aime beaucoup @ james solution en utilisant un crochet Cordova. Cependant, il y a deux problèmes. Le docs indique:

  • "Nous recommandons fortement d'écrire vos crochets en utilisant Node.js "
  • "Le répertoire /hooks Est considéré comme obsolète au profit des éléments de raccordement dans config.xml"

Voici une implémentation de Node.js utilisant le package 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' });

};

Parmi tous les types de crochets fournis par Cordova, les plus pertinents pour votre situation sont:

  • after_prepare
  • before_compile

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

<platform name="ios">
    <hook type="after_prepare" src="scripts/my-hook.js" />
</platform>
41
TachyonVortex

Vous pouvez utiliser l'utilitaire PlistBuddy à l'intérieur d'un script crochet de Cordova pour modifier le fichier * -Info.plist.

Par exemple, j'ai le script suivant sous <project-root>/hooks/after_prepare/010_modify_plist.sh 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 dû au fait que PlistBuddy renvoie un code de sortie d'erreur si la clé ajoutée existe déjà et ne permet pas de détecter si la clé existe déjà. Cordova signalera une erreur de construction si le script de raccordement se ferme avec un statut d'erreur. Une meilleure gestion des erreurs est possible mais difficile à mettre en œuvre.

32
James

Voici les étapes que j'ai finalement suivies pour permettre à mon application de partager des fichiers via iTunes entre des périphériques.

1.Dans votre application, accédez au fichier config.xml. Tapez cette pièce dans votre configuration sous la balise platform <platform name="ios">.

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

2. Accédez ensuite à votre outil de ligne de commande et tapez: cordova prepare

  1. Désinstallez et réinstallez votre application sur votre appareil. Votre application apparaîtra ensuite dans iTunes pour vous permettre de partager des fichiers entre vos appareils.

Quelques petites 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 plateforme 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. Vous pouvez y voir le fichier plist généré pour votre application, intitulé "yourApp-info.plist". Vous pouvez y voir la nouvelle clé et la nouvelle chaîne générées dans la présentation XML, qui ressemble à ceci:

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

En outre, ma société a abandonné cette application-cadre ionic] il y a quelques semaines (avec un délai très court). Tout ce que je vous dis repose sur deux semaines d'apprentissage. ce n'est peut-être pas la meilleure pratique, mais j'espère que cela aidera quelqu'un.

19
Eric Weiss

Cela semble être possible maintenant avec le fichier config.xml: au moins certains auteurs de plugins essentiels le disent. Par exemple, dans la documentation de Cordova Camera Plugin , ils expliquent la nouvelle condition requise dans iOS 10 pour que vous fournissiez une chaîne de message d'autorisation dans la pliste. Pour ce faire, 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>

Ce qui semble alors être en corrélation avec les nouvelles clés de mon info.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
XML

UPDATE: pour les personnes souhaitant utiliser l'appareil photo avec iOS> = 10. Cela signifie que, normalement, vous pouvez configurer le plug-in comme suit:

 <!-- 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 la plate-forme -> Projet iOS par Xcode ou dans *-Info.plist fichier.

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

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

9
Hung

J'utilise ce qui suit dans ionic sans aucun plugin ni 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>
7
necixy

Vous pouvez définir le nom d'affichage dans la liste des applications en modifiant directement le fichier ios.json dans le répertoire plugins.

Ajouter ce qui suit à la section config_munge.files du fichier ios.json fera l'affaire et il sera maintenu même lorsque vous utilisez l'interface de ligne de commande.

"*-Info.plist": {

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

Voici un exemple complet

4
blakgeek

@TachyonVortex solution semble être la meilleure option mais s'effondrait dans mon cas. Le problème était dû à un champ NSMainNibFile vide qui n'a pas été converti correctement par le package NPM de plist. Dans le fichier . Plist

    <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é en ajoutant au script:

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

Le script ressemble enfin à (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' });

};

et config.xml:

<platform name="ios">
    <hook type="before_build" src="scripts/my-hook.js" />
</platform>
3
Sebastien Horin

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

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

2
Malo Degachi

Je préfère le hook after_prepare pour les projets plus importants ou si vous avez plusieurs plug-ins utilisant les mêmes autorisations. Mais vous pouvez toujours choisir le moyen le plus simple:

simplement: - supprimez le plugin qui requiert l’autorisation souhaitée - rajoutez-le à nouveau avec --save - dans config.xml, le plugin a maintenant une nouvelle variable avec une description vide que vous pouvez remplir - now build ios with - release et ils seront mis.

0
Emanuel

Si vous essayez de modifier un .plist dans un plugin iOS natif avec un <config-file> tag dans votre plugin.xml, Voici ce que tu dois faire:

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

    plutil -convert xml1 Info.plist

  2. Les instructions pour <config-file> indique que target= est relatif au projet xcode généré à platforms/ios/<project>/, mais j’ai trouvé qu’il me fallait ajouter un caractère générique à mon chemin pour que cela fonctionne:

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

  3. Si vous voulez ajouter une clé au plus haut niveau de la .plist, vous devez définir parent égal au nom de la clé, puis imbriquer un <string> tag avec la valeur. Utiliser un <array> ou <dict> comme le montrent les exemples, ces clés seront imbriquées sousparent.

Voici un exemple complet qui fonctionne pour moi pour l'ajout de 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
Sky Kelsey

Oui, c'est possible!

J'utilise Cordova 9.0.0 ([email protected]).

Par exemple, il s’agit du fichier de configuration par lequel j’ai inséré une nouvelle valeur de chaîne dans Info.plist:

<platform name="ios">
    <edit-config file="*-Info.plist" mode="merge" target="NSMicrophoneUsageDescription">
        <string>My awesome app wish to hear your awesome voice through Microphone. Not for fancy stuff, just want to hear you.</string>
    </edit-config>
    <edit-config file="*-Info.plist" mode="merge" target="---Key configuration---">
        <string>---string value---</string>
    </edit-config>
</platform>

Après cela, n'oubliez pas de reconstruire votre fichier intermédiaire en exécutant ces deux commandes dans votre terminal:

cordova platform rm ios
cordova platform add ios

Pour confirmer le changement, vous pouvez vérifier le fichier .plist nouvellement généré en les ouvrant avec xCode.

Fichier -Info.plist situé à:

./platform/ios/[your app name]/[your app name]-Info.plist
0
Donovan P