web-dev-qa-db-fra.com

Un plugin phonegap doit-il être déclaré dans le fichier config.xml?

Je suis un débutant dans le développement de Phonegap, j'ai donc quelques questions:

1) J'utilise le plug-in d'accéléromètre. J'ai lu dans le manuel que je dois déclarer le plugin dans le fichier config.xml pour pouvoir l'utiliser. Cependant, j'ai remarqué que même si je supprime la déclaration du config.xml

<feature name="Accelerometer">
    <param name="Android-package" value="org.Apache.cordova.AccelListener" />
</feature>

l'accéléromètre fonctionne toujours.

Je voudrais donc vous demander si dans la version phonegap 3.0.0, l'utilisation du config.xml est obsolète. Si tel est le cas, alors où la liaison a-t-elle lieu?

2) J'utilise la plate-forme Android pour construire l'application. Dans la structure du projet, il y a trois fichiers config.xml avec un contenu différent:

  • a) Dans les actifs/www/phonegap-app-hello-world-3.0.0/www/config.xml
  • b) Dans les ressources/www/phonegap-app-hello-world-3.0.0/config.xml
  • c) Dans le res/xml/config.xml

Quelle est l'utilité de chacun d'eux? Où dois-je déclarer mon plug-in? Je l'ai fait dans le fichier res/xml/config/xml

Merci

44
panipsilos

Je suis sûr que la raison pour laquelle vous pouvez toujours utiliser le plug-in est que vous avez soit modifié le mauvais config.xml ou n'a pas exécuté les outils de ligne de commande cordova pour propager vos modifications vers le bon config.xml fichier réellement utilisé par l'application.

Il existe plusieurs config.xml fichiers à différents endroits d'un projet Cordova 3.x. Je vais essayer de vous donner un aperçu des différents emplacements des fichiers et comment vous devez interagir avec eux. Gardez à l'esprit que c'est ce qui se passe lorsque vous utilisez la CLI ( Command Line-interface ) - J'ai généré cette structure de répertoire en tapant:

cordova create {MyApp}
cordova platform add Android ios
cordova plugin add org.Apache.cordova.network-information

Ou avant Cordova 3.1, remplacez la dernière ligne par:

cordova plugin add https://git-wip-us.Apache.org/repos/asf/cordova-plugin-network-information.git

Si vous utilisez uniquement les scripts Shell au niveau de la plate-forme pour créer l'application ("l'ancienne" manière que nous avons utilisée dans Cordova 2.X), vous pouvez généralement utiliser le même flux de travail, mais vous devrez tiliser Plugman pour gérer les plugins . (Nous sommes en train de documenter ces deux "workflows" différents.)

Tout d'abord, lorsque vous créez une application avec cordova create MyApp, il créera une structure de projet vide comme celle-ci:

/myApp/
        /www/           # This is where your "cross-platform' files go.
                        # The build tools copy these files over to the correct
                        # asset folder for each platform, like /assets/www/ for
                        # Android or just /www/ for iOs. This is where you should
                        # be doing most/all of your work and is what should
                        # probably be version controlled.
        /platforms/
            /Android/   # These will only appear after `cordova platform add`
            /ios/       # You should generally not touch these file as they are
                        # recreated quite often, although changes will persist.
        /plugins/
            /Android/   # These will only appear after `cordova plugin add`. They
                        # pretty much just contain the native and web plugin code
                        # for all platforms that a plugin supports.
            /ios/
        /merges/        # This is where you can place platform-specific code that
                        # you write that will get merged in with your cross
                        # platform source, see the "customize each platform"
                        # section of: http://cordova.Apache.org/docs/en/3.0.0/guide_cli_index.md.html

Vous devez apporter toutes vos modifications aux fichiers dans /www/, qui est le code source "multiplateforme". Tout ce qui se trouve dans ce dossier sera généralement copié et propagé vers le dossier www au niveau de la plate-forme lorsque vous utilisez les outils de ligne de commande (que son /assets/www pour Android ou simplement /www/ pour iOS). De cette façon, vous n'avez besoin que d'un seul dossier source pour votre application - c'est le dossier que vous devriez avoir sous contrôle de version. Toutes les modifications de configuration à l'échelle de l'application que vous souhaitez doivent être apportées au config.xml fichier placé à cet emplacement; plus tard, lorsque vous utiliserez les outils, cette config.xml le fichier sera copié (et parfois modifié avec des informations de configuration spécifiques à la plate-forme) à l'emplacement approprié pour chaque application, comme /platforms/Android/res/xml/config.xml (pour Android) ou /platforms/ios/AppName/config.xml (pour iOS).

Supposons que vous souhaitiez ajouter le plug-in d'accélération en tapant cordova plugin add https://git-wip-us.Apache.org/repos/asf/cordova-plugin-network-information.git. Si vous deviez exécuter un diff après cette commande, vous verrez que les fichiers suivants ont été modifiés ou ajoutés:

plugins/org.Apache.cordova.network-information/ - Ce nouveau dossier contient toutes les métadonnées et le code du plugin, y compris le code Web et natif, pour chaque plateforme prise en charge

plugins/Android.json et plugins/ios.json - Ces deux fichiers ont maintenant été modifiés pour contenir une référence au plugin d'informations réseau. C'est là que vous verrez le bit config-munge de JSON. Au fur et à mesure que vous ajoutez des plug-ins, ce fichier s'agrandit en permanence pour les référencer tous. Ce fichier indique aux outils de ligne de commande quel code il doit remplacer et dans quels fichiers. Par exemple, après avoir ajouté le plugin cordova-plugin-network-information, vous le verrez dans /plugins/Android.json:

{
        "prepare_queue": {
            "installed": [],
            "uninstalled": []
        },
        "config_munge": {
            "res/xml/config.xml": {
                "/*": {
                    "<feature name=\"NetworkStatus\"><param name=\"Android-package\" value=\"org.Apache.cordova.networkinformation.NetworkManager\" /></feature>": 1
                }
            },
            "AndroidManifest.xml": {
                "/*": {
                    "<uses-permission Android:name=\"Android.permission.ACCESS_NETWORK_STATE\" />": 1
                }
            }
        },
        "installed_plugins": {
            "org.Apache.cordova.network-information": {
                "PACKAGE_NAME": "io.cordova.hellocordova"
            }
        },
        "dependent_plugins": {}
    }

Cela indique aux scripts d'écrire le nom de la fonction dans res/xml/config.xml (encore une fois, pour iOS, ce sera différent, car le fichier de configuration au niveau de l'application se trouve dans un emplacement différent sur iOS!), et lui dit également d'écrire Android.permission.ACCESS_NETWORK_STATE autorisation dans AndroidManifest.xml (vous ne trouverez rien de tel sur iOS car aucune autorisation n'est nécessaire.) (Au fait, ce qui est écrit dans chacun de ces fichiers json est défini dans le plugin fichier plugin.xml.)

plates-formes/Android/AndroidManifest.xml - Les outils CLI ont pris en charge l'ajout de la permission définie dans le fichier xml du plugin à AndoridManifest. Oui, cela se produit lorsque vous faites cordova plugin add. Ces autorisations sont directement copiées à partir de tout ce qui se trouve dans le fichier plugins/Android.json. Ces autorisations sont également supprimées lorsque vous "rm" un plugin. Cependant, la modification de ces fichiers se fait intelligemment, en ce sens que vous pouvez ajouter des éléments personnalisés à AndroidManifest.xml et ils persisteront.

plateformes/Android/assets/www/cordova_plugins.js - Ce fichier est enterré dans les ressources html qui composeront votre application finale - ces ressources (assez vous ne devez pas modifier grand-chose dans/plateformes /) car ils seront remplacés par les outils CLI assez fréquemment. Ce fichier est utilisé par Cordova lors de l'exécution pour charger le code du plugin que vous avez ajouté; il prend également en charge le mappage des espaces de noms JavaScript aux fichiers réels (il s'agit de la déclaration "clobbers"). Par exemple, je vois:

{
    "file": "plugins/org.Apache.cordova.network-information/www/network.js",
    "id": "org.Apache.cordova.network-information.network",
    "clobbers": [
        "navigator.connection",
        "navigator.network.connection"
    ]
}

cela signifie que dans le code de votre application, navigator.connection et navigator.network.connection correspondra au code contenu dans plugins/org.Apache.cordova.network-information/www/network.js.

plates-formes/Android/res/xml/config.xml - Il s'agit du fichier config.xml au niveau de la plate-forme pour Android. Ce fichier est créé par les outils CLI. Une grande partie des informations que vous écrivez dans votre config.xml de niveau supérieur (/MyApp/www/config.xml) seront copiées ici, mais pas toutes (et il y a des choses supplémentaires, je ne sais pas exactement où le fichier supplémentaire provient.) Il s'agit du fichier lu par Android lorsqu'il exécute votre application et doit vérifier vos données de configuration. Par exemple, Cordova Android l'utilisera pour voir quels plugins sont installés et quelles classes natives mappent vers quels espaces de noms. I pensez la seule façon de modifier cela est d'utiliser le dossier/merges/qui J'ai mentionné ci-dessus.

plates-formes/ios/{AppName} .xcodeprojcj/project.pbxproj - L'équivalent iOS d'AndroidManifest.xml

plates-formes/ios/{AppName} /config.xml - Il s'agit du fichier config.xml au niveau de la plate-forme pour iOS. Vous voyez à quel point il est différent de celui d'Android? (par exemple, pas dans /res/xml/config.xml?) Ce fichier est automatiquement mis à jour par la CLI et vous ne devez pas le toucher.

plates-formes/ios/www/cordova_plugins.js - Le même fichier existe sur Android (mais dans un emplacement différent) et a le même objectif: aider Cordova à charger vos plugins au moment de l'exécution lorsque quelqu'un utilise l'application

Je pense que cela décrit à peu près tous les fichiers et dossiers utilisés dans un projet cordova.

Avec un peu de chance, vous pouvez voir maintenant que vous ne devriez en fait éditer que /www/config.xml fichier. Ce fichier sera utilisé pour construire le /platforms/Android/res/xml/config.xml et /platforms/ios/{AppName}/config.xml, qui sont utilisés par Cordova lorsque l'application packagée est en cours d'exécution. Des parties de ce fichier seront utilisées pour modifier les fichiers AndroidManifest.xml et project.pbxprojc (pour Android et iOS, respectivement.)

Cela explique pourquoi vous pouviez toujours utiliser l'accéléromètre dans votre application même après avoir supprimé le <feature name="Accelerometer"> lignes - elles étaient juste recopiées au niveau de la plate-forme config.xml à partir de l'application principale large config.xml

Je suppose que la seule chose qui reste à savoir est de savoir comment modifier les fichiers de configuration spécifiques à la plate-forme; par exemple, comment pouvez-vous modifier le fichier AndroidManifest.xml? Eh bien, il s'avère que vous pouvez simplement modifier le /platforms/Android/AndroidManifest.xml fichier directement - la CLI est suffisamment intelligente pour ne pas effacer vos personnalisations lorsqu'elle ajoute ou supprime automatiquement les autorisations de plug-in. Donc, pour une raison quelconque, vous devez prendre en charge une version inférieure de Android que celle prise en charge par Cordova, vous pouvez simplement changer l'objet et il persistera si votre cordova plugin add|rm {id} appels.

J'espère que cela clarifie les choses, n'hésitez pas à poser d'autres questions!

124
MBillau

Depuis cordova 3.5 , nous pouvons conserver les plugins dans config.xml fichier

<feature name="Network Information">
    <param name="id" value="org.Apache.cordova.network-information" />
    <param name="version" value="0.2.10" />
</feature>

La commande suivante récupérera les plugins définis dans config.xml

cordova restore plugins --experimental

La commande suivante écrira vos plugins installés actuels dans config.xml (3.5):

cordova save plugins --experimental

Dans 5.x et versions ultérieures:

cordova plugin save

Source: http://cordova.Apache.org/news/2014/07/10/tools-release.html

22

Depuis Cordova 5.0, oui .

<?xml version='1.0' encoding='utf-8'?>
    ...
    <plugin name="cordova-plugin-console" spec="^1.0.0" />
    ...
</ xml>

Plugins d'économie de masse sur un projet existant:

$ cordova plugin save

Lors d'une nouvelle installation (ou après un nettoyage), vous pouvez ajouter tous les plugins avec:

$ cordova prepare

L'ajout/la mise à jour/la suppression peut également se faire via cli:

$ cordova plugin add <plugin[@<version>] | directory | git_url> --save
$ cordova plugin update <plugin[@<version>] | directory | git_url> --save
$ cordova plugin remove <plugin> --save

Il n'y a pas de mise à jour de masse pour le moment. Vous pouvez supprimer le répertoire plugins puis exécuter un $cordova prepare.

Sources :

8
Cédric M.

Config.xml est principalement utilisé par la génération phonegap.

Si vous utilisez phonegap 3, vous devez gérer vos plugins à l'aide de la CLI:

$ phonegap local plugin add https://git-wip-us.Apache.org/repos/asf/cordova-plugin-network-information.git

Le seul config.xml que vous devez modifier est /www/config.xml, les autres sont générés automatiquement à partir de celui-ci lorsque vous construisez votre projet en utilisant:

$ phonegap build ios
5
Sam Thompson