Перенести приложение Android React Native на передний план при получении сообщения Firebase Cloud только для данных

Я успешно использую Firebase Cloud Messaging с react-native-firebase для отправлять и получать сообщения только с данными между устройствами Android.

Когда устройство получает сообщение, если приложение находится в фоновом режиме или было убито, я хотел бы вывести приложение на передний план. Я получаю уведомления, в которых будет отображаться console.log() в обоих случаях, но мне сложно понять, как лучше всего «разбудить» приложение / вывести его на передний план:

  firebase.messaging().onMessage((message) => {
    // Process your message as required
    console.log('You got a message!', message);
  });
}

Приведенный выше код выполняется должным образом в обоих случаях.

Существуют ли пакеты React Native, которые я могу использовать, чтобы достичь того, что я пытаюсь сделать, или мне следует подумать о том, чтобы написать немного Java?

Обновлять

Я пытаюсь достичь чего-то вроде this но не уверены, можно ли добавить такой код прямо в мое приложение React Native?

Обновление 2

Я обнаружил этот пакет response-native-invoke-app, который использует HeadlessJS.

HeadlessJS требует, чтобы вы использовали этот код в вашем index.js:

AppRegistry.registerHeadlessTask('SomeTaskName', () => require('SomeTaskName'));

Однако Firebase Cloud Messaging уже нужно, чтобы вы предоставили эту строку кода в том же месте, что, как я предполагаю, делает то же самое, что и выше:

AppRegistry.registerHeadlessTask('RNFirebaseBackgroundMessage', () => backgroundMessaging);

Следуя react-native-invoke-app документам, я затем помещаю вызов для вызова моего приложения в обратном вызове firebase.messaging().onMessage((message)) следующим образом:

firebase.messaging().onMessage((message) => {
    // Process your message as required
    invokeApp();
    console.log('You got message!', message);
  });
}

Однако это не выводит мое приложение на передний план.

Обновление 3

Теперь я переместил вызов invokeApp() в функцию Firebase backgroundNotificationListener, которая представляет собой задачу без головы, что кажется правильным подходом:

import invokeApp from 'react-native-invoke-app';

const incomingMessage = async (message) => {
  // handle your message
  invokeApp();
  return Promise.resolve();
}
export default incomingMessage;

Но приложение все равно не выйдет на передний план при вызове функции incomingMessage.

Обновление 4

Я поднял эту проблему на react-native-invoke-app странице github, на которой подробнее о проблемах, с которыми я сталкиваюсь.


comment
Исправление: * на переднем плане, когда сообщение только с данными FCM ..   -  person Mr. Robot    schedule 31.10.2019


Ответы (3)


Причина, по которой это не работает, заключается в том, что react-native-invoke-app не поддерживает версии Android> 8. Если кто-то знает альтернативу этому пакету, пожалуйста, прокомментируйте ниже, спасибо.

person Mr. Robot    schedule 03.11.2019
comment
Как починили на android ›8? - person Kailash; 04.03.2020
comment
Я фактически изменил поток приложения, чтобы уведомление появлялось, когда приложение находится в фоновом режиме, и щелчок по уведомлению переводит приложение на передний план. - person Mr. Robot; 04.03.2020

Использование react-native-invoke-app должно выполнить свою работу.

  1. Убедитесь, что ваш AppRegistry.registerHeadlessTask('RNFirebaseBackgroundMessage', () => backgroundMessaging); находится в корневом компоненте приложения.
  2. экспортируйте backgroundMessaging из любого дочернего компонента, в котором он есть, и импортируйте его в корневой компонент приложения.
  3. вызовите invokeApp () внутри функции дочернего компонента, что очень похоже на то, что вы сделали.
  4. Не забывайте этот, когда приложение не запущено.

Я не тестировал это, но не вижу причины, по которой это не должно работать.

Надеюсь это поможет!

person Abdeen M.    schedule 01.11.2019
comment
Спасибо за ответ @Abdeen M. Сейчас прохожу через это. Ссылка, которую вы предоставляете на this, кажется неработающей - я просто получаю about:blank#blocked. Не могли бы вы проверить URL-адрес ссылки? Благодарю. - person Mr. Robot; 02.11.2019
comment
Привет, @ Mr.Robot, добро пожаловать. только что исправил битую ссылку. ваше здоровье! - person Abdeen M.; 02.11.2019
comment
Спасибо - я делаю все вышеперечисленное, но, к сожалению, не могу заставить его работать :( - person Mr. Robot; 03.11.2019

вместо invokeapp(); вы можете описать схему URL-адресов и открыть URL-адрес, связанный с этой схемой, чтобы приложение открылось и появилось на переднем плане.

НА Android:

добавить <data android:scheme=“my-awesome-app” /> намерение в ./android/app/src/main/AndroidManifest.xml под тегом `.

НА iOS

  1. откройте свой xcode, запустите проект iOS и откройте файл Info.plist в xcode.

  2. добавьте строку URL types под корневым ключом, затем добавьте элемент, например: Item 0, затем URL Schemes, затем элемент со строковым значением. (в нашем примере это my-awesome-app). Как на картинке ниже

Теперь, после настройки схемы URL-адресов, вы можете называть ее так.

import {Linking} from 'react-native';

Linking.openURL('my-awesome-app://');

вы можете использовать его везде, где захотите.

настройка схемы на iOS Info.plist

person Amir Gorji    schedule 14.05.2020