Не существует известного способа задания целевой активности для cordova-universal-links-plugin
. Вы можете создать обходной путь, запустив сценарии до / после cordova prepare
.
. Исправление будет работать следующим образом:
- Вы должны перестроить свои действия в
AndroidManifest.xml
, чтобы целевое действие упорядочено до основного / запускающего действия. Я предполагаю, что целевая активность изначально выглядит так:
<activity android:name=".CordovaActivity">
<intent-filter android:label="@string/launcher_name">
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Теперь вы напишите два NodeJS сценария: before_prepare.js
и after_prepare.js
.
a) before_prepare.js
: это добавит <action android:name="android.intent.action.VIEW" />
после <category />
тег для вашей целевой деятельности. Поскольку «CordovaActivity» временно также является основным / запускающим действием и находится перед фактическим основным действием, плагин universal-links должен вместо этого нацелиться на него.
b) after_prepare.js
: мы хотим, чтобы это запускалось после плагина применяет намеренные фильтры универсальных ссылок к вашей целевой деятельности. Он удалит добавленный вами тег <action />
. Это необходимо, поскольку Android не может разрешить два основных действия.
Добавьте before_prepare.js
к уровню вашего проекта config.xml
в качестве before_prepare
Cordova hook.
Поскольку Cordova запускает ваши хуки до плагинов, вы не можете добавить after_prepare.js
в качестве after_prepare
хука Cordova. Это связано с тем, что тег <action />
будет удален до того, как плагин universal-links сможет работать. Вместо этого вам нужно будет запустить его после команды cordova prepare
. Я рекомендую сделать это с помощью сценария npm (npm run prepare
), который запускается after_prepare.js
после cordova prepare
.
Моя реализация зависит от elementtree
для XML редактирования (он также используется Cordova для внутренних целей):
npm install elementtree
before_prepare.js
:
const et = require('elementtree')
const fs = require('fs')
const MANIFEST_FILE = '/.../CordovaProject/platforms/android/app/src/main/AndroidManifest.xml'
/**
* Add main action intent from `SurkartaActivity`.
*
* @param {ElementTree} manifestTree
*/
function addMainAction (manifestTree) {
const intentFilterElement = manifestTree.find("./application/activity[@android:name='.SurakartaActivity']")
.getchildren()[0]
const mainActionElement = et.SubElement(intentFilterElement, 'action')
mainActionElement.set('android:name', 'android.intent.action.MAIN')
}
// Cordova hook executes module.exports
module.exports = function () {
const manifestTree = et.parse(fs.readFileSync(MANIFEST_FILE, 'utf8'))
addMainAction(manifestTree)
console.log(manifestTree.write())
fs.writeFileSync(MANIFEST_FILE, manifestTree.write())
}
after_prepare.js
:
const et = require('elementtree')
const fs = require('fs')
const MANIFEST_FILE = '/.../CordovaProject/platforms/android/app/src/main/AndroidManifest.xml'
/**
* Remove main action intent from `SurkartaActivity`.
*
* @param {ElementTree} manifestTree
*/
function stripMainAction (manifestTree) {
const intentFilterElement = manifestTree.find("./application/activity[@android:name='.SurakartaActivity']")
.getchildren()[0]
intentFilterElement.remove(intentFilterElement.getchildren()[1])
}
function hey () {
const manifestTree = et.parse(fs.readFileSync(MANIFEST_FILE, 'utf8'))
stripMainAction(manifestTree)
fs.writeFileSync(MANIFEST_FILE, manifestTree.write())
}
module.exports = hey
// This isn't an Cordova hook, so run it manually
hey()
Изменения в существующих файлах:
config.xml
:
<hook type="before_prepare" src="./path/to/before_prepare.js" />
package.json
:
{
"scripts": {
"prepare": "cordova prepare; node ./path/to/after_prepare.js"
},
"dependencies": {
"elementtree": "@latest" /* npm install elementtree should do this for you */
}
}