一个 PhoneGap 插件是否需要在 config.xml 文件中声明?

44

我是phonegap开发的新手,所以我有一些问题:

1)我正在使用加速度计插件。我在手册中读到需要在config.xml文件中声明插件才能使用它。但是我注意到即使我从config.xml中删除了声明,

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

加速度计仍然工作。

所以,我想问一下,在PhoneGap 3.0.0版本中,config.xml的使用是否已经过时?如果是这样的话,那么绑定发生在哪里?

2)我使用Android平台构建应用程序。在项目结构中有三个不同内容的config.xml文件:

  • a)在assets/www/phonegap-app-hello-world-3.0.0/www/config.xml
  • b)在assets/www/phonegap-app-hello-world-3.0.0/config.xml
  • c)在res/xml/config.xml

它们每一个的用途是什么?我应该在哪里声明我的插件?我在res/xml/config.xml文件中完成了这项任务。

谢谢。

5个回答

124

我相信你之所以仍然可以使用插件,是因为你要么编辑了错误的config.xml文件,要么没有运行cordova命令行工具将更改传播到实际被应用程序使用的正确的config.xml文件。

Cordova 3.x项目中有多个不同位置的config.xml文件。我将尝试为您概述文件的不同位置以及您应该如何与它们交互。请注意,这就是当您使用CLI(命令行界面)时发生的情况-我通过键入以下内容来生成此目录结构:

cordova create {MyApp}
cordova platform add android ios
cordova plugin add org.apache.cordova.network-information

如果是 Cordova 3.1 之前的版本,则将最后一行替换为:

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

如果您仅使用平台级别的shell脚本来构建应用程序(这是我们在Cordova 2.X中使用的“旧”方式),通常可以使用相同的工作流程,但需要使用Plugman管理插件。(我们正在记录这两种不同的“工作流程”)。

首先,当您使用cordova create MyApp创建应用程序时,它将创建一个空项目结构,如下所示:

/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

您应该将所有更改都加到/www/文件夹中,这是“跨平台”的源代码。当您使用命令行工具时(无论是Android的/assets/www还是iOS的/www/),该文件夹中的内容通常会被复制和传播到平台级别的www文件夹中。因此,您只需要一个应用程序的单个源文件夹-这是您应该放在版本控制下的文件夹。您想要进行的任何应用程序范围内的配置更改都应该放在此位置的config.xml文件中;稍后,在使用工具时,将复制此config.xml文件(有时会使用特定于平台的配置信息进行修改)到每个应用程序的相应位置,例如对于Android是/platforms/android/res/xml/config.xml,对于iOS是/platforms/ios/AppName/config.xml

假设您想通过键入cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-network-information.git来添加加速插件。 如果执行此命令后运行diff,则会看到以下文件已更改或添加:

plugins/org.apache.cordova.network-information/ - 此新文件夹包含每个受支持平台的插件元数据和代码,包括Web和本地代码

plugins/android.json和plugins/ios.json - 现在这两个文件都已编辑,以包含对network-information插件的引用。这是您将看到JSON的config-munge部分。随着添加更多插件,此文件将不断增长以引用所有插件。此文件告诉命令行工具它需要替换哪些代码以及在哪些文件中进行替换。例如,在添加cordova-plugin-network-information插件后,您将在/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": {}
    }

这将告诉脚本将功能名称写入res /xml/config.xml(对于iOS,由于应用程序级别的配置文件位于iOS上不同的位置,因此这将有所不同!),并且还会告诉它将android.permission.ACCESS_NETWORK_STATE 权限写入到AndroidManifest.xml中(在iOS上您不会找到任何类似的内容,因为不需要权限)。 (顺便说一句,每个json文件中写入的内容都在插件的plugin.xml文件中定义。)

platforms/android/AndroidManifest.xml - CLI工具会负责添加插件xml文件中定义的任何权限到AndoridManifest中。是的,这会在您执行cordova plugin add时发生。这些权限直接从plugins/android.json文件中复制。删除插件时也会删除这些权限。但是,智能地编辑这些文件,您可以向AndroidManifest.xml添加自定义内容,并使其保持不变。

platforms/android/assets/www/cordova_plugins.js - 此文件被埋藏在组成最终应用程序的HTML资源中-这些资源(几乎在/platforms/中的所有资源)不应由您编辑,因为它们将经常被CLI工具替换。此文件由Cordova在运行时用于加载您添加的插件代码;它还负责将JavaScript命名空间映射到实际文件(这是“clobbers”声明)。例如,我看到:

{
    "file": "plugins/org.apache.cordova.network-information/www/network.js",
    "id": "org.apache.cordova.network-information.network",
    "clobbers": [
        "navigator.connection",
        "navigator.network.connection"
    ]
}
这意味着在您的应用程序代码中,navigator.connectionnavigator.network.connection 将都映射到 plugins/org.apache.cordova.network-information/www/network.js 中包含的代码。 platforms/android/res/xml/config.xml 这是Android平台级别的config.xml文件。此文件由CLI工具创建。您在顶层config.xml (/MyApp/www/config.xml) 中编写的许多信息将被复制到此处,但并非全部(还有一些其他信息,我不确定其他信息来自哪里)。运行应用程序时,Android会读取此文件并检查您的配置数据。例如,Cordova Android代码将使用此文件查看安装了哪些插件以及哪些本地类映射到哪些命名空间。我认为您唯一能够编辑此文件的方式是使用上面提到的/merges/文件夹。 platforms/ios/{AppName}.xcodeprojcj/project.pbxproj 这是AndroidManifest.xml的iOS等效文件。 platforms/ios/{AppName}/config.xml 这是iOS平台级别的config.xml文件。注意它的位置与Android不同吗?(例如,不在/res/xml/config.xml中?)此文件由CLI自动更新,您不应该更改它。 platforms/ios/www/cordova_plugins.js 相同的文件也存在于Android上(但位于不同位置),并且具有相同的目的:帮助Cordova在运行应用程序时加载您的插件。
这大概描述了Cordova项目中使用的所有文件和文件夹。
希望现在您能看到,您实际上只需要编辑/www/config.xml文件。此文件将用于构建/platforms/android/res/xml/config.xml/platforms/ios/{AppName}/config.xml,用于Cordova在打包应用程序运行时使用。此文件的部分内容将用于编辑AndroidManifest.xml和project.pbxprojc文件(分别用于Android和iOS)。
这就解释了为什么即使删除了<feature name="Accelerometer">行,在您的应用程序中仍然可以使用加速度计-它们只是从主应用程序范围的config.xml重新复制到平台级别的config.xml中。
我想现在唯一需要弄清楚的事情是如何编辑特定于平台的配置文件;例如,如何编辑AndroidManifest.xml文件?好吧,事实证明,您可以直接编辑/platforms/android/AndroidManifest.xml文件——CLI足够聪明,以便在自动添加或删除插件权限时不会删除您的自定义。因此,如果出于某种原因,您需要支持低于Cordova支持版本的Android版本,则可以更改 对象,它将在您的cordova plugin add|rm {id}调用中保持不变。
希望这解释清楚了问题,如有任何疑问,请随时提问!

19
这回复太棒了,谢谢 - 对我们来说帮助非常大。 - obie
1
@obie 太棒了,我很高兴它对你有帮助!我正在尝试将大部分信息推入实际文档中,如果你认为我遗漏了什么或需要澄清的地方,请告诉我! - MBillau
3
"/www/config.xml"文件现在已被移动到最新的Cordova 3.4.0-0.1.3版本中的根目录"/config.xml"。 - kumarharsh
3
看到这个答案时,我几乎要哭了 :) 解释的非常好,解决了我所有困惑的事情。非常感谢! - Aleks
4
当使用 cordova plugin add ... 命令时,它不会将插件添加到全局 config.xml 文件中。如果你正在使用 Phonegap build,则需要在全局 config.xml 文件中手动添加 <gap:plugin> 标签。据我所知,这是必需的。请参阅 http://docs.build.phonegap.com/en_US/configuring_plugins.md.html 了解更多信息。 - commonpike
显示剩余5条评论

22

自从 Cordova 3.5 版本开始,我们可以将插件信息存储在 config.xml 文件中以便持久化。

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

以下命令将获取在config.xml中定义的插件:
cordova restore plugins --experimental

以下命令将在config.xml(3.5)中写入您当前安装的插件:
cordova save plugins --experimental

在5.x及以后版本中:
cordova plugin save

来源:http://cordova.apache.org/news/2014/07/10/tools-release.html

本次更新发布了Cordova 3.5.0版本和相关工具,其中包括对iOS和Android平台的修复和改进。此外,还增加了新的命令行参数和插件管理功能。此次更新强烈推荐所有开发者升级使用。

8

从Cordova 5.0版本开始,是的。

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

在现有项目上使用批量保存插件:

$ cordova plugin save

在新安装或清理后,您可以使用以下方法添加所有插件:
$ cordova prepare

可以通过命令行界面添加/更新/删除:

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

目前没有批量更新的方法。您可以删除plugins目录,然后运行$cordova prepare命令。
参考资料:

有一个工具可以更新插件:https://github.com/Rareloop/cordova-plugin-update - Cédric M.

5

Config.xml主要被PhoneGap Build使用。

如果您正在使用PhoneGap 3,应使用CLI管理插件:

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

唯一需要编辑的config.xml文件是/www/config.xml,其他文件会在使用以下命令构建项目时自动生成:

$ phonegap build ios

1
嗨Sam,我确保在使用之前已经下载了插件。 但是我的问题是,为什么即使我没有在config.xml文件中包含映射,插件仍然能够正常工作? <feature name="Accelerometer"> <param name="android-package" value="org.apache.cordova.AccelListener" /> </feature> - panipsilos
我认为这是因为只有PhoneGap Build服务需要读取您的config.xml文件以查看您拥有哪些插件。如果您只是本地构建,则可以忽略它。 - Sam T

-2

嗨Hazem,也许问题的标题有些误导。我能够使用PhoneGap插件。我的真正问题是插件是否需要在config.xml文件中声明。我注意到,即使我在config.xml文件中没有声明任何内容,插件仍然可以正常工作。 - panipsilos
是的,我收到了你的问题,但问题在于PhoneGap也从cordova_plugins文件中读取插件。 - Hazem Hagrass
1
这可能是因为插件被自动复制到了Android文件夹,但没有复制到iOS文件夹。您可以查看此链接:https://dev59.com/emMl5IYBdhLWcg3wkXpx#18311741 - Hazem Hagrass
顺便说一下,config.xml文件主要由PhoneGap Build使用。 - Hazem Hagrass
谢谢!有没有一种方法可以执行“cordova plugin add ALL_NEEDED_PLUGINS”?将插件/ *检入scm似乎无法正常工作,因此当团队合作时,每个人都必须为每个插件重复执行“cordova plugin add ...”。 - s.Daniel
1
嗨@s.Daniel,是的,有一种方法 - 创建一个“依赖插件”,列出所有需要的插件,并安装它,参见:https://github.com/apache/cordova-mobile-spec/blob/master/dependencies-plugin/plugin.xml - MBillau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接