爱奥尼亚/ cordova :使用config.xml添加意图过滤器

oogrdqng  于 2022-11-15  发布在  其他
关注(0)|答案(4)|浏览(160)

我正在开发一个移动的应用程序使用离子框架(基于 cordova )。
在Android中,我注册了我的应用程序来打开 *.txt文件。我在platforms/android/AndroidManifest.xml中添加了意图过滤器,它工作正常。但平台文件夹在.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总是不变的,我做错了什么?
我用的是离子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>
dzhpxtsq

dzhpxtsq1#

解决了!
我不能用爱奥尼亚或 cordova :这是一项PhoneGap功能(请参阅Stackoverflow answer
我可以用另外两种方法来做:
1.使用自定义Cordova插件
1.使用挂钩
我更喜欢第二种方式。我找到了一个interesting hook来满足我的目的。注意:记住安装一些软件包:

npm install lodash elementtree plist --save-dev

遗憾的是这个钩子合并了标签。所以我写了一个稍微修改过的钩子版本:see here。您可以将此挂钩放在/hooks/after_platform_add中。
现在我在config.xml中有了我的意图过滤器配置:

<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
v6ylcynt

v6ylcynt2#

Cordova 9现在直接支持使用<config-file><edit-config>节,就像在plugin.xml文件中一样。

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

<?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错误。

xkftehaa

xkftehaa3#

我遇到了同样的问题,但是安装(然后记住或记录依赖关系)一堆npm依赖关系,然后使用一个大的通用钩子的想法对于我所需要的来说太重量级了。
钩子可以是简单的shell脚本,这通常是修改文本文件的一种更直接的方式。在我的例子中,我只需要在MainActivity活动中添加一个intent过滤器,这对于sed来说是一项微不足道的工作;我刚刚创建了文件hooks/after_prepare/020_add_moozvine_intents.sh,其内容为:

#!/usr/bin/env zsh

MANIFEST=${0:h}/../../platforms/android/AndroidManifest.xml
[[ -e $MANIFEST ]] || { print "Manifest not found at $MANIFEST." ; exit 1; }

grep -q HANDLE_MOOZVINE_NOTIFICATION $MANIFEST && { print "Manifest already modified. Nothing to do."; exit 0; }

AFTER_LINE='android:name="MainActivity"'
ADDITION='\
        <intent-filter>\
            <action android:name="HANDLE_MOOZVINE_NOTIFICATION" />\
            <category android:name="android.intent.category.DEFAULT" />\
        </intent-filter>
';

sed -i -e "/${AFTER_LINE}/a${ADDITION}" $MANIFEST

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

js81xvg6

js81xvg64#

下面是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

相关问题