Ionic / Cordova:使用config.xml添加intent-filter

时间:2015-01-28 17:49:00

标签: cordova ionic

我正在使用Ionic Framework(基于Cordova)开发移动应用程序。

在Android中我注册我的应用程序以打开* .txt文件。 我在平台/ android / AndroidManifest.xml中添加了intent-filter,它可以正常工作。 但平台文件夹在.gitignore中:我想使用config.xml。

我尝试添加config.xml:

 <platform name="android">
    <config-file target="AndroidManifest.xml" parent="/*/application/activity">
      <intent-filter><!-- ... --></intent-filter>
    </config-file>
    <!-- ... -->
 </platform>

我还尝试添加:

 <platform name="android">
    <config-file target="AndroidManifest.xml" parent="/manifest/application">
      <activity android:name="CordovaApp"> 
        <intent-filter><!-- ... --></intent-filter>
      </activity>
    </config-file>
    <!-- ... -->
 </platform>

然后我尝试更新AndroidManifest启动

ionic prepare

或者:

ionic remove platform android && ionic add platform android

但AndroidManifest.xml始终保持不变。 我做错了什么?

我正在使用Ionic 1.3.2和Cordova 4.2.0。

修改 这里是整个config.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<widget id="com.ionicframework.myapp551932" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
  <name>MyApp</name>
  <description>
        myApp
    </description>
  <author email="xxx@yyy.it" href="http://www.example.com/">
      A Team
    </author>
  <content src="index.html"/>
  <access origin="*"/>
  <preference name="webviewbounce" value="false"/>
  <preference name="UIWebViewBounce" value="false"/>
  <preference name="DisallowOverscroll" value="true"/>
  <preference name="BackupWebStorage" value="none"/>
  <preference name="SplashScreen" value="screen"/>
  <preference name="SplashScreenDelay" value="3000"/>
  <feature name="StatusBar">
    <param name="ios-package" value="CDVStatusBar" onload="true"/>
  </feature>
  <platform name="android">
    <config-file target="AndroidManifest.xml" parent="/manifest/application/activity">
      <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="file" />
        <data android:mimeType="*/*" />
        <data android:pathPattern=".*\\.txt" />
        <data android:host="*" />
      </intent-filter>
      <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="content" />
        <data android:pathPattern=".*\\.txt" />
        <data android:mimeType="*/*" />
      </intent-filter>
    </config-file>
    <icon src="resources/android/icon/drawable-ldpi-icon.png" density="ldpi"/>
    <icon src="resources/android/icon/drawable-mdpi-icon.png" density="mdpi"/>
    <icon src="resources/android/icon/drawable-hdpi-icon.png" density="hdpi"/>
    <icon src="resources/android/icon/drawable-xhdpi-icon.png" density="xhdpi"/>
    <icon src="resources/android/icon/drawable-xxhdpi-icon.png" density="xxhdpi"/>
    <icon src="resources/android/icon/drawable-xxxhdpi-icon.png" density="xxxhdpi"/>
    <splash src="resources/android/splash/drawable-land-ldpi-screen.png" density="land-ldpi"/>
    <splash src="resources/android/splash/drawable-land-mdpi-screen.png" density="land-mdpi"/>
    <splash src="resources/android/splash/drawable-land-hdpi-screen.png" density="land-hdpi"/>
    <splash src="resources/android/splash/drawable-land-xhdpi-screen.png" density="land-xhdpi"/>
    <splash src="resources/android/splash/drawable-land-xxhdpi-screen.png" density="land-xxhdpi"/>
    <splash src="resources/android/splash/drawable-land-xxxhdpi-screen.png" density="land-xxxhdpi"/>
    <splash src="resources/android/splash/drawable-port-ldpi-screen.png" density="port-ldpi"/>
    <splash src="resources/android/splash/drawable-port-mdpi-screen.png" density="port-mdpi"/>
    <splash src="resources/android/splash/drawable-port-hdpi-screen.png" density="port-hdpi"/>
    <splash src="resources/android/splash/drawable-port-xhdpi-screen.png" density="port-xhdpi"/>
    <splash src="resources/android/splash/drawable-port-xxhdpi-screen.png" density="port-xxhdpi"/>
    <splash src="resources/android/splash/drawable-port-xxxhdpi-screen.png" density="port-xxxhdpi"/>
  </platform>
  <icon src="resources/android/icon/drawable-xhdpi-icon.png"/>
</widget>

4 个答案:

答案 0 :(得分:18)

解决!

我不能使用Ionic或Cordova:它是PhoneGap功能(见Stackoverflow answer

我可以通过其他两种方式实现:

  1. 使用自定义Cordova插件
  2. 使用挂钩
  3. 我更喜欢第二种方式。为了我的目的,我找到了interesting hook。 注意:Rembember安装一些软件包:

    npm install lodash elementtree plist --save-dev
    

    可悲的是,这个钩子合并了标签。 所以我写了一个这个钩子的一个小改动版本:see here。你可以将这个钩子放在/ hooks / after_platform_add。

    现在我在config.xml中有了intent-filter配置:

      <platform name="android">
        <config-file target="AndroidManifest.xml" parent="application/activity">
          <intent-filter><!-- ... --></intent-filter>
        </config-file>
        <!-- ... -->
      </platform>
    

    我可以更新AndroidManifest.xml重新生成android平台:

    ionic platform remove android && ionic platform add android
    

答案 1 :(得分:7)

我遇到了同样的问题,但是安装(然后记住或记录依赖关系)一堆npm依赖关系然后使用一个大的通用钩子的想法对于我需要的东西来说太重了。

Hooks可以是简单的shell脚本,这通常是一种更直接的修改文本文件的方法。在我的情况下,我只需要为if (init) { sh = zmalloc(sizeof(struct sdshdr)+initlen+1); } else { sh = zcalloc(sizeof(struct sdshdr)+initlen+1); } if (sh == NULL) return NULL; sh->len = initlen; sh->free = 0; if (initlen && init) memcpy(sh->buf, init, initlen); sh->buf[initlen] = '\0'; return (char*)sh->buf; } 活动添加一个intent-filter,这对MainActivity来说是一项微不足道的工作;我刚创建了文件sed,内容为:

hooks/after_prepare/020_add_moozvine_intents.sh

完成工作。您可以使用类似的方法对生成的文件进行任何简单的文本修改。

答案 2 :(得分:6)

以上是Rich在JS中为未来Google员工编写的上述解决方案,因为我遇到了shell脚本问题。

module.exports = function (context) {
    const fs = require('fs');
    const _ = require('lodash');

    const scheme = 'flowkey';
    const insertIntent = `
    <intent-filter>
                <action android:name="android.intent.action.VIEW"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
                <category android:name="android.intent.category.BROWSABLE"></category>
                <data android:scheme="${scheme}"></data>
    </intent-filter>
    `;
    const manifestPath = context.opts.projectRoot + '/platforms/android/AndroidManifest.xml';
    const androidManifest = fs.readFileSync(manifestPath).toString();
    if (!androidManifest.includes(`android:scheme="${scheme}"`)) {
        const manifestLines = androidManifest.split(/\r?\n/);
        const lineNo = _.findIndex(manifestLines, (line) => line.includes('@string/activity_name'));
        manifestLines.splice(lineNo + 1, 0, insertIntent);
        fs.writeFileSync(manifestPath, manifestLines.join('\n'));
    }
};

将此作为准备后挂钩。

注意:这是在ES6中,您可以在此处找到ES5版本:https://gist.github.com/smowden/f863331034bf300b960beef1ae25bf82

答案 3 :(得分:2)

Cordova 9 现在直接支持使用<config-file><edit-config>部分,例如在 plugin.xml 文件中。

不使用任何插件或挂钩,您可以直接执行以下操作,例如,将意图过滤器添加到 AndroidManifest.xml

<?xml version='1.0' encoding='utf-8'?>
<widget id="yourdomain.app" version="1.7.8" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <!-- ... -->
    <platform name="android">
        <!-- ... -->
        <config-file parent="application" target="AndroidManifest.xml">
            <activity android:label="webIntentFilter" android:name="yourdomain.app">
                <intent-filter android:autoVerify="true">
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data android:host="yourdomain.com" android:scheme="https" />
                </intent-filter>
            </activity>
        </config-file>
    </platform>
    <!-- ... -->
</widget>

不要忘记将属性xmlns:android="http://schemas.android.com/apk/res/android"添加到您的<widget>标签中,以避免在构建时出现unbound prefix错误。