cordova - 应该在 config.xml 文件中声明 phonegap 插件吗?

标签 cordova phonegap-plugins cordova-3

我是 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的使用是否已经过时了。如果是这种情况,那么绑定(bind)在哪里发生?

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

    谢谢

    最佳答案

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

    有多个config.xml Cordova 3.x 项目中不同位置的文件。我将尝试向您概述文件的不同位置以及您应该如何与它们交互。请记住,当您使用 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/ 中的文件进行所有更改。 ,这是“跨平台”源代码。此文件夹中的任何内容通常都会被复制并传播到平台级别 www使用命令行工具时的文件夹(无论是 /assets/www 用于 Android 还是仅 /www/ 用于 iOS)。这样,您的应用程序只需要一个源文件夹 - 这是您应该在版本控制下拥有的文件夹。您想要的任何应用程序范围的配置更改都应该对 config.xml 进行。放置在此位置的文件;稍后当你使用这些工具时,这个 config.xml文件将被复制(有时会使用特定于平台的配置信息进行修改)到每个应用程序的适当位置,例如 /platforms/android/res/xml/config.xml (安卓)或 /platforms/ios/AppName/config.xml (适用于 iOS)。

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

    插件/org.apache.cordova.network-information/
    - 这个新文件夹包含每个受支持平台的所有插件元信息和代码,包括 Web 和 native 代码

    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 文件中定义的。)

    平台/android/AndroidManifest.xml
    - CLI 工具负责将插件的 xml 文件中定义的任何权限添加到 AndoridManifest。是的,当您这样做时会发生这种情况 cordova plugin add .这些权限直接从 plugins/android.json 文件中的任何内容复制。当您 'rm' 插件时,这些权限也会被删除。但是,编辑这些文件是智能的,因为您可以将自定义内容添加到 AndroidManifest.xml 并且它们将保持不变。

    平台/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 中包含的代码.

    平台/android/res/xml/config.xml
    - 这是适用于 Android 的平台级 config.xml 文件。该文件由 CLI 工具创建。您在顶级 config.xml (/MyApp/www/config.xml) 中编写的许多信息将被复制到此处,但并非全部(还有一些其他内容,我不确定在哪里额外的东西来自。)这是Android在运行您的应用程序时读取的文件,它需要检查您的配置数据。例如,Cordova Android 代码将使用它来查看安装了哪些插件以及哪些 native 类映射到哪些命名空间。我认为您可以编辑它的唯一方法是使用我上面提到的/merges/文件夹。

    平台/ios/{AppName}.xcodeprojcj/project.pbxproj
    - 相当于 AndroidManifest.xml 的 iOS

    平台/ios/{AppName}/config.xml
    - 这是适用于 iOS 的平台级 config.xml 文件。看看它在与 Android 上的不同位置如何? (例如,不在/res/xml/config.xml 中?)该文件由CLI 自动更新,您不应触摸它。

    平台/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 版本更低的 Android 版本,您只需更改对象,它就会在您的 cordova plugin add|rm {id} 中持续存在。调用。

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

    关于cordova - 应该在 config.xml 文件中声明 phonegap 插件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19112436/

    相关文章:

    ios - 通过 Cordova config.xml 添加条目到 iOS .plist 文件

    cordova - 如何在 ionic 2 中使用 Cordova Microsoft Azure 插件

    ios - "PushPlugin not found"在 iOS 上使用 Cordova 2.5

    android - phonegap 3.5.0 中缺少 Cordova jar

    cordova - cordova/argscheck 有什么用?

    javascript - Cordova Android 构建失败 ("failed to find Build Tools revision 24.0.1")

    javascript - 将 LocalNotifications 设置为仅在醒着的时候触发

    ios - 在带有Phonegap的IOS InAppBrowser中显示“完成”按钮

    android - cordova 3.3 中的用户推送通知

    android - ionic :Android Emulator Error