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.
- Dans le projet .plist ajoute une nouvelle ligne
- Entrez les valeurs suivantes dans la nouvelle ligne:
- 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.
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>
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 dansconfig.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>
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.
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
- 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.
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.
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
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
@ 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>
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
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>
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:
-
Assurez-vous que votre
.plist
est xml, pas binaire! Vous pouvez utiliserplutil
pour convertir un binaire.plist
en xml et le valider dans le contrôle de version.plutil -convert xml1 Info.plist
-
Les instructions pour
<config-file>
indiquent quetarget=
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"
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 sousparent
.
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>
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.
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 tyoeValue:GDEnterpriseSimulation
dans la section valeur