Обнаружение события нажатия кнопки переднего плана на Firebase FCM - PullRequest
0 голосов
/ 04 июля 2019

Я использую плагин firebase с приложением Ionic 4.У меня есть сценарий использования, когда пользователь нажимает на передний план.т.е. он должен перенаправить на другой интерфейс.Как я могу это сделать?Я могу сделать это с помощью варианта использования с фоновым нажатием.

fcmListeners() {
    this.firebase.onNotificationOpen().subscribe(async (data: any) => {

      if (data.tap) {// when user tapped the background notification
        this.pushRedirection(data);
        console.log("Received in background-data", data);
      } else {
        console.log("Received in foreground", data);
        this.pushRedirection(data);
      }
    });
  }

Если я использую код вышеупомянутого вида, он автоматически переходит на нужную страницу без нажатия пользователем.Но мне нужно реализовать это, если пользователь нажал только на толчок.Так вы можете сказать мне, как справиться с этим?

Полезная нагрузка:

{
  "registration_ids": [
    "dlaNHzi7Gy8:APA91bGdn_jXFJm1xdGGI44s48JbXEu5iYa"
  ],
  "notification": {
    "body": "Push Test Facility Category",
    "title": null,
    "icon": "myicon",
    "sound": "mySound",
    "vibrate": 1,
    "Badge": 1,
    "click_action": "FCM_PLUGIN_ACTIVITY"
  },
  "data": {
    "message": "Push Test Facility Category",
    "title": null,
    "b": "22",
    "id": "2",
    "category_name": "Restaurants",
    "h": "1",
    "p": 1,
    "type": "2"
  }
}

this.firebase.onNotificationOpen().subscribe(async (data: any)

enter image description here

Примечание: Я могу реализовать здесь специальный тост уведомлений для Android, так как он ничего не показывает в уведомлении переднего плана.Но iOS показывает уведомление переднего плана по умолчанию.Так как справиться с этим тогда?

1 Ответ

1 голос
/ 04 июля 2019

Плагин Firebase Corodva в настоящее время показывает push-уведомление, даже когда уведомление было получено, будучи приложением на переднем плане, но это проблема и не должно быть поведением по умолчанию.Как вы можете видеть в этой проблеме, до слияния исправление можно исправить локально следующим образом:

Я изменил

PROJECT_ROOT/plugins/cordova-plugin-firebase/src/ios/AppDelegate+FirebasePlugin.m

, но также

PROJECT_ROOT/platforms/ios/PROJECT_NAME/plugins/cordova-plugin-firebase/AppDelegate+FirebasePlugin.m

В обоих файлах в строке 183 я заменил

completionHandler(UNNotificationPresentationOptionAlert);

на

completionHandler(UNNotificationPresentationOptionNone);

Теперь он ведет себя как ожидалось (без уведомлений на переднем плане, только в фоновом режиме)

После исправления вы можете использовать data.tap и должен работать правильно:

if (data.tap) {
  // when user tapped the background notification
  this.pushRedirection(data);
  console.log("Received in background-data", data);
}

Если вам нужно сделать это в среде CI / CD или вы просто хотите автоматизировать ее, вы можете создать Cordova Hook .

Для этого сначала создайте новую папку cordova-hooks в src, а затем создайте новый js-файл с именем fix_push-notifications-foreground_issue.js, например:

src
 |- ...
 |- cordova-hooks
      |- fix_push-notifications-foreground_issue.js
 |- node_modules
 |- ...

Обратите внимание, что есть и другие способы.чтобы добавить хуки Cordova (например, используя папку по умолчанию hooks), но я все же предпочитаю использовать пользовательскую папку.Дополнительную информацию можно найти здесь .

Вставьте следующий код в этот новый файл js:

#!/usr/bin/env node
module.exports = function (context) {

    const fs = require('fs');
    const path = require('path');

    const issue = `completionHandler(UNNotificationPresentationOptionAlert);`;
    const fix = `completionHandler(UNNotificationPresentationOptionNone);`;

    // ISSUE: iOS: Push notifications are shown when in foreground
    // https://github.com/arnesson/cordova-plugin-firebase/issues/817

    function start() {
        console.log('+------------------------------------+');
        console.log('| Starting PN Foreground Fix Hook    |');
        console.log('+------------------------------------+');


        const pluginDir = path.join(context.opts.projectRoot, '/plugins/cordova-plugin-firebase-lib/src/ios');
        const pluginFile = path.join(pluginDir, 'AppDelegate+FirebasePlugin.m');

        const platformPluginDir = path.join(context.opts.projectRoot, '/platforms/ios/Bilbayt/Plugins/cordova-plugin-firebase-lib');
        const platformPluginFile = path.join(platformPluginDir, 'AppDelegate+FirebasePlugin.m');

        applyFixToFile(pluginFile);
        applyFixToFile(platformPluginFile);

        console.log('+------------------------------------+');
    }

    /**
     * Fixes the push notification foreground issue on the file sent as parametner
     * @param {*} file Path of the file to be fixed
     */
    function applyFixToFile(file) {
        if (fs.existsSync(file)) {
            let content = fs.readFileSync(file).toString('utf8');

            if (content.indexOf(issue) > -1) {

                content = content.replace(issue, fix);
                fs.writeFileSync(file, content);

                console.log(`   PN foregorund fix applied to ${file} file`);

            } else {

                console.log(`   No need to apply PN foreground fix to ${file} file`);

            }

        } else {
            console.log(`   Unable to find ${file} file`);
        }
    }

    // Start the hook
    start();

}

И, наконец, добавьте хукв вашем config.xml файле:

<widget ...

  <hook src="cordova-hooks/fix_push-notifications-foreground_issue.js" type="before_prepare" />

  <platform name="android">
  ...
  </platform>

  <platform name="ios">
  ...
  </platform>

</widget>

Теперь каждый раз, когда вы создаете приложение, исправление должно применяться автоматически:)

...