我相信你之所以仍然可以使用插件,是因为你要么编辑了错误的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/
/platforms/
/android/
/ios/
/plugins/
/android/
/ios/
/merges/
您应该将所有更改都加到/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.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}
调用中保持不变。
希望这解释清楚了问题,如有任何疑问,请随时提问!
cordova plugin add ...
命令时,它不会将插件添加到全局 config.xml 文件中。如果你正在使用 Phonegap build,则需要在全局 config.xml 文件中手动添加<gap:plugin>
标签。据我所知,这是必需的。请参阅 http://docs.build.phonegap.com/en_US/configuring_plugins.md.html 了解更多信息。 - commonpike