我很确定您仍然可以使用该插件的原因是因为您编辑了错误的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.connection 和 navigator.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} 调用中持续存在。
我希望能澄清一些事情,请随时提出更多问题!