在收到仅数据 Firebase 云消息时将 Android React Native 应用程序带到前台

Bring Android React Native App to Foreground On Receipt of Data Only Firebase Cloud Message

我成功地使用 Firebase Cloud Messaging with react-native-firebase 在 Android 设备之间发送和接收纯数据消息。

当设备收到消息时,如果应用程序在后台或已被杀死,我想将应用程序带到前台。我收到的通知在这两种情况下都会显示 console.log(),但我无法弄清楚如何最好地处理 'waking up' 应用程序/将其置于前台:

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

以上代码在两种情况下都按预期执行。

是否有我可以查看的 React Native 包来帮助实现我正在尝试做的事情,或者我是否应该考虑必须编写一些 Java?

更新

我正在尝试实现类似 this 的东西,但不确定是否可以将这样的代码直接添加到我的 React Native 应用程序中?

更新 2

我发现了this package react-native-invoke-app that uses 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 页面上提出了 this 问题,其中包含有关我所面临问题的更多详细信息。

使用 react-native-invoke-app 应该可以完成工作。

  1. 确保 AppRegistry.registerHeadlessTask('RNFirebaseBackgroundMessage', () => backgroundMessaging); 在您的根应用程序组件上。
  2. 从您拥有的任何子组件导出 backgroundMessaging 并将其导入您的应用程序根组件。
  3. 在子组件的函数内调用 invokeApp(),这与您所做的非常相似。
  4. 当应用不是 运行 时,请不要忘记 this

我没有对此进行测试,但我看不出它为什么不起作用。

希望对您有所帮助!

这不起作用的原因是 react-native-invoke-app 不支持 Android 版本 > 8。如果有人知道这个包的替代品,请在下面评论,谢谢。

而不是 invokeapp(); 你可以描述一个 url 方案并打开与该方案相关的 url,使应用程序打开并进入前台。

ON Android:

在`标签下的./android/app/src/main/AndroidManifest.xml中添加<data android:scheme=“my-awesome-app” />意图。

ON iOS

  1. 打开你的 xcode,启动 iOS 项目并打开 xcode.

    [=44 中的 Info.plist 文件=]
  2. 在根键下添加 URL types 行,然后添加一个项目,例如:Item 0,然后 URL Schemes 然后是一个带有字符串值的项目。 (在我们的例子中是 my-awesome-app)。 就像下图一样

现在设置 url 方案后,现在您可以这样调用它了。

import {Linking} from 'react-native';

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

您可以在任何地方使用它。