Кордова универсальные ссылки на другую деятельность - PullRequest
0 голосов
/ 23 января 2020

Я использую аутентификацию Firebase в своем приложении Cordova. Приложение android интегрирует Cordova в действие, которое не является основным / запускающим действием. Из-за этого требуемый плагин зависимостей «cordova-universal-links-plugin» не нацелен на правильную активность (он нацелен на активность main / launcher).

Есть ли способ указать целевую активность для универсального -links? Если нет, как я могу сделать обходной путь / хак для устранения этой проблемы (так как плагин больше не поддерживается)?

1 Ответ

0 голосов
/ 23 января 2020

Не существует известного способа задания целевой активности для cordova-universal-links-plugin. Вы можете создать обходной путь, запустив сценарии до / после cordova prepare.

. Исправление будет работать следующим образом:

  1. Вы должны перестроить свои действия в 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 */
  }
}
...