【问题标题】:Should a phonegap plugin be declared in the config.xml file?是否应该在 config.xml 文件中声明 phonegap 插件?
【发布时间】:2013-10-07 09:23:51
【问题描述】:

我是 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 文件中做的

谢谢

【问题讨论】:

    标签: cordova phonegap-plugins cordova-3


    【解决方案1】:

    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
    

    【讨论】:

    • 嗨,Sam,请确保我在使用之前下载了该插件。但我的问题是为什么即使我没有在 config.xml 文件中包含映射,插件仍然可以工作?
    • 我认为这是因为只有 phonegapbuild 服务需要读取您的 config.xml 以查看您拥有哪些插件。如果你只是在本地构建,那么你可以忽略它。
    【解决方案2】:

    你可能想检查一下这个加速器插件: Phonegap Acceleramator plugin.

    你也可以在那里搜索你需要的任何插件

    【讨论】:

    • 嗨 Hazem,也许问题的标题具有误导性。我可以使用 phonegap 插件。我真正的问题是插件是否需要在 config.xml 文件中声明。我注意到即使我没有在 config.xml 文件中声明任何内容,该插件仍然有效。
    • 是的,我收到了你的问题,但问题是 phonegap 也在从 cordova_plugins 文件中读取插件
    • 这可能是因为插件被自动复制到android文件夹而不是iOS文件夹,您可以查看此链接:stackoverflow.com/questions/18301518/…
    • 顺便说一下config.xml文件主要是phonegap build使用的。
    • 嗨@s.Daniel,是的,有一种方法 - 创建一个“依赖插件”,列出所有需要的插件,然后安装它,请参阅:github.com/apache/cordova-mobile-spec/blob/master/…
    【解决方案3】:

    我很确定您仍然可以使用该插件的原因是因为您编辑了错误的config.xml,或者没有运行cordova 命令行工具将您的更改传播到正确的config.xml 文件,该文件实际上是由应用程序使用。

    在 Cordova 3.x 项目的不同位置有多个 config.xml 文件。我将尝试为您概述文件的不同位置以及您应该如何与它们交互。请记住,当您使用 CLI (Command Line-interface) 时会发生这种情况 - 我通过键入以下内容生成了这个目录结构:

    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 中所做的“旧”方式),您通常可以使用相同的工作流程,但需要Use Plugman to Manage Plugins。 (我们正在记录这两个不同的“工作流程”。)

    首先,当您使用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 文件将被复制(有时会使用特定于平台的配置信息进行修改)到每个应用程序的适当位置,例如 /platforms/android/res/xml/config.xml(适用于 android)或 /platforms/ios/AppName/config.xml(适用于 iOS) .

    假设您要通过键入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 - 这两个文件现在都已被编辑以包含对网络信息插件的引用。这是您将看到 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。)

    这解释了为什么即使在删除 &lt;feature name="Accelerometer"&gt; 行之后您仍然能够在应用中使用加速度计 - 它们只是从主应用范围的 config.xml 重新复制到平台级别的 config.xml

    我想唯一需要弄清楚的是如何编辑特定于平台的配置文件;例如,如何编辑 AndroidManifest.xml 文件?好吧,事实证明您可以直接编辑/platforms/android/AndroidManifest.xml 文件 - CLI 足够智能,不会在自动添加或删除插件权限时删除您的自定义设置。因此,假设由于某种原因您需要支持比 Cordova 支持的版本更低的 Android 版本,您只需更改对象,它就会在您的 cordova plugin add|rm {id} 调用中持续存在。

    我希望能澄清一些事情,请随时提出更多问题!

    【讨论】:

    • 这个回复是史诗般的。谢谢 - 这对我们非常有帮助
    • @obie 太棒了,我很高兴它有帮助!我正在尝试将大量此类信息推送到真实文档中,因此,如果您认为我遗漏了任何内容或应该澄清什么,请告诉我!
    • 1. /www/config.xml 文件现已移至最新 Cordova 3.4.0-0.1.3 中的根目录 /config.xml
    • 当我看到这个答案时,我几乎哭了:) 解释得非常漂亮,所有我都感到困惑的事情。非常感谢!
    • 当使用 cordova plugin add ... 时,它不会将这些添加到您的全局 config.xml 中。如果您使用的是 Phonegap 构建,则它需要在您的全局 config.xml 中添加 &lt;gap:plugin&gt; 标签,据我所知,您必须手动添加它们。阅读docs.build.phonegap.com/en_US/configuring_plugins.md.html
    【解决方案4】:

    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

    【讨论】:

      【解决方案5】:

      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
      

      添加/更新/删除也可以通过cli完成:

      $ 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

      来源:

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 2015-09-29
      • 2018-03-06
      • 1970-01-01
      相关资源
      最近更新 更多