我很确定您仍然可以使用该插件的原因是您编辑错误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/
您应该对“跨平台”源代码中的文件进行所有更改。www
当您使用命令行工具(无论是/assets/www
用于 Android 还是仅/www/
用于 iOS)时,此文件夹中的任何内容通常都会被复制并传播到平台级文件夹。这样,您的应用程序只需要一个源文件夹 - 这是您应该在版本控制下拥有的文件夹。应该对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 文件中定义的。)
platform/android/AndroidManifest.xml
- CLI 工具负责将插件的 xml 文件中定义的任何权限添加到 AndoridManifest。是的,当您这样做时会发生这种情况cordova plugin add
。这些权限直接从 plugins/android.json 文件中的任何内容复制而来。当您“管理”插件时,这些权限也会被删除。但是,编辑这些文件是智能完成的,因为您可以将自定义内容添加到 AndroidManifest.xml 并且它们将持续存在。
platform/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
.
platform/android/res/xml/config.xml
- 这是 Android 的平台级 config.xml 文件。该文件由 CLI 工具创建。您在顶级 config.xml (/MyApp/www/config.xml) 中编写的许多信息将被复制到这里,但不是全部(还有一些额外的东西,我不确定在哪里额外的东西来自。)这是Android在运行您的应用程序时读取的文件,它需要检查您的配置数据。例如,Cordova Android 代码将使用它来查看安装了哪些插件以及哪些本机类映射到哪些命名空间。我认为您可以编辑它的唯一方法是使用我上面提到的 /merges/ 文件夹。
platform/ios/{AppName}.xcodeprojcj/project.pbxproj
- AndroidManifest.xml 的 iOS 等效项
platform/ios/{AppName}/config.xml
- 这是 iOS 的平台级 config.xml 文件。看看它与 Android 的不同之处?(例如,不在/res/xml/config.xml 中?)这个文件会被CLI 自动更新,你不应该碰它。
platform/ios/www/cordova_plugins.js
- 相同的文件存在于 Android 上(但在不同的位置)并且具有相同的目的:当有人使用该应用程序时,帮助 Cordova 在运行时加载您的插件
我认为这几乎描述了cordova项目中使用的所有文件和文件夹。
希望现在您可以看到实际上您应该只编辑/www/config.xml
文件。该文件将用于构建/platforms/android/res/xml/config.xml
and /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}
调用中持续存在。
我希望澄清一些事情,请随时提出更多问题!