Cordova Android插件:由cordova覆盖的config.xml准备?

时间:2013-11-29 10:12:10

标签: android cordova

我正在为Android平台开发Cordova插件。

正如here所述,我编辑了platforms/android/res/xml/config.xml文件以包含插件的类映射。

除了我每次运行cordova prepare android这个文件都被覆盖后说:

Generating config.xml from defaults for platform "android"

所以,我必须每次都撤消这个非常烦人的变化。有没有办法告诉cordova不要这样做或在其他地方插入类映射?

4 个答案:

答案 0 :(得分:17)

您需要创建一个插件包并安装它来解决此问题。

一个插件包有一个plugin.xml文件,一个JS文件和存储在这个结构中的本机代码:

PLUGIN_NAME\
 src\
  PLATFORM_NAME\
   PLAFORM_SPECIFIC_FILES
 www\
  PLUGIN_JS_FILE
 plugin.xml

实施例

BackgroundAPI\
 plugin.xml
 src\
  android\
   BackgroundAPI.java
  ios\
   BackgroundAPI.h
   BackgroundAPI.m
 www\
  BackgroundAPI.js

在plugin.xml中,您可以定义安装插件时将放入config.xml的项目。这样可以确保每次运行build或prepare命令时都不会删除代码。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
    id="com.dawsonloudon.backgroundapi"
    version="1.0.0">
    <name>backgroundapi</name>
    <description>run external api calls on a background thread</description>
    <license>MIT</license>

    <js-module src="www/BackgroundAPI.js" name="BackgroundAPI">
        <clobbers target="BackgroundAPI" />
    </js-module>

    <platform name="ios">
        <config-file target="config.xml" parent="/*">
            <feature name="BackgroundAPI">
                <param name="ios-package" value="BackgroundAPI" />
            </feature>
        </config-file>

        <header-file src="src/ios/BackgroundAPI.h" />
        <source-file src="src/ios/BackgroundAPI.m" />
    </platform>

    <platform name="android">
        <config-file target="res/xml/config.xml" parent="/*">
            <feature name="BackgroundAPI" >
                <param name="android-package" value="com.dawsonloudon.backgroundapi.BackgroundAPI"/>
            </feature>
        </config-file>

        <config-file target="AndroidManifest.xml" parent="/*">
            <uses-permission android:name="android.permission.INTERNET" />
        </config-file>
        <source-file src="src/android/BackgroundAPI.java" target-dir="src/com/dawsonloudon/backgroundapi" />
    </platform>

</plugin>

如果您在项目的单独目录中构建了所有内容,请转到项目目录并运行:

cordova plugin add /PATH/TO/YOUR/PLUGIN

现在已经安装了该插件,您的项目中将有一个plugins文件夹,并且所有config.xml编辑将始终存在。

要编辑插件,请在/ plugins / PLUGIN_NAME / www

中更改JS文件

要编辑本机代码,请浏览到/ platforms / PLATFORM /并找到您的本机代码。

每次构建或准备时,您的JS文件都将被重写为插件目录中的平台特定路径,但是您的本机代码仅在安装插件时写入/ platforms / paths。

我建议一旦你的插件完成,你应该收集你所有的插件特定文件并将它们复制回你的插件包目录,这样你就可以在将来的项目中再次使用它们(或者发布它们以供其他人使用以供开源使用) )。

答案 1 :(得分:10)

我正在使用Cordova 3.1

我认为我发现了许多config.xml文件的以下行为 - 似乎不是Cordova文档所说的,也许在3.1更改了文档并没有更新?在我的项目中,所有这些似乎都正常工作。

我有3个config.xml文件:

1)myproject / www / config.xml

2)myproject / platforms / android / res / xml / config.xml

3)myproject / platforms / android / assets / www / config.xml

1)和3)具有相同的内容,包括: 名称,描述,作者,内容,访问权限和多个首选项标签。 !没有插件的功能标签!

我只编辑了文件1);然后使用“cordova build android”从该信息生成文件3) - 正如我所理解的那样。我添加了我想要配置的所有其他首选项标签1) - 我基本上添加了所有记录的内容:

<preference name="fullscreen" value="false" />
<preference name="webviewbounce" value="false" />
<preference name="useBrowserHistory" value="true" />
<preference name="exit-on-suspend" value="false" />
<preference name="permissions" value="none" />
<preference name="target-device" value="universal" />
<preference name="prerendered-icon" value="true" />
<preference name="stay-in-webview" value="false" />
<preference name="detect-data-types" value="true" />
<preference name="show-splash-screen-spinner" value="true" />
<preference name="auto-hide-splash-screen" value="true" />
<preference name="disable-cursor" value="false" />
<preference name="android-minSdkVersion" value="10" />
<preference name="android-installLocation" value="auto" />
<preference name="orientation" value="portrait"/>

然后有文件2);这很奇怪!

  • 该文件包含所有插件“feature”标签,是我的应用程序中唯一具有这些功能标签的config.xml文件。我的“cordova插件添加”命令为我的所有插件正确添加了它们。

  • 在我编辑/将我的偏好标签添加到文件1之后,每次执行“cordova build android”时,这些标签也会被复制到此文件中2)。

  • “cordova build android”仍打印到concole“从默认为平台生成config.xml”android“”...但它包含了我所有的偏好1) - 我认为一旦文件1)的内容多于“默认”内容,它就会成功地将该内容复制到文件2)

  • 文件2)包括文件1)中的首选项,功能标签和正确的作者;但它没有正确的描述,也没有文件1中正确的名称标签。这两个标签似乎来自一些cordova内部默认值,如果你直接在文件2中更改它们,它们会被下一个“cordova build android”覆盖到这些默认值。我找不到办法让他们保持自己的价值观! - 我怀疑那里有一个错误!

答案 2 :(得分:1)

我想为我的cordova应用程序创建一个不同的起始页面,并遇到同样的问题 - 我的config.xml文件被build命令覆盖了。解决此问题的方法是更改​​公共config.xml文件,该文件当前位于项目根文件夹中。一旦我在那里进行了更改,就会在构建命令中获取更改。我使用this page作为参考。

这是一个非常古老的主题 - 希望这有助于某人。

答案 3 :(得分:0)

因此,确保您正在编辑顶级config.xml文件非常重要。

有时,至少在该文件中的权限的情况下,您将需要删除并重新安装该插件,并在命令行中设置所需的权限,即使Cordova文档说您可以在任一位置设置这些权限

有关示例,请参阅相机插件的iOS怪癖部分。