【问题标题】:Bring Android React Native App to Foreground On Receipt of Data Only Firebase Cloud Message在收到仅数据 Firebase 云消息时将 Android React Native 应用程序置于前台
【发布时间】:2019-10-27 11:24:10
【问题描述】:

我已成功使用Firebase Cloud Messaging with 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

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

【问题讨论】:

  • 更正:*FCM 仅数据消息时的前景..
  • 您好,Robot 先生,您有没有为上述问题找到合适的解决方案,因为我也在尝试相同的解决方案
  • 嘿 @HardikDesai 请查看 react-native-callkeep 上的 backToForeground() 方法尝试在 HeadlessJS 后台函数中调用它
  • 好的,我会检查你是否有任何无头代码参考
  • 是的,我正在使用 Firebsae 云消息传递的无头任务:rnfirebase.io/messaging/usagereactnative.dev/docs/headless-js-android

标签: react-native firebase-cloud-messaging react-native-android react-native-firebase


【解决方案1】:

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

【讨论】:

  • 你是如何为 android > 8 修复它的?
  • 我实际上更改了应用程序的流程,因此当应用程序处于后台时会显示通知,单击通知会将应用程序带到前台。
【解决方案2】:

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

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

我没有对此进行测试,但我看不出它不应该工作的原因。

希望对您有所帮助!

【讨论】:

  • 感谢@Abdeen M 的回答。现在正在处理。您提供给 this 的链接似乎已损坏 - 我刚刚收到 about:blank#blocked。你能检查一下链接网址吗?谢谢。
  • 嘿@Mr.Robot,不客气。刚刚修复了断开的链接。干杯!
  • 谢谢 - 我正在做上述所有事情,但不幸的是无法让它工作:(
【解决方案3】:

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

在 Android 上:

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

在 iOS 上

  1. 打开您的 xcode,启动 iOS 项目并在 xcode 中打开 Info.plist 文件。

  2. 在根键下添加 URL types 行,然后添加一个项目,例如:Item 0,然后是 URL Schemes,然后是具有字符串值的项目。 (在我们的示例中,它是 my-awesome-app)。 就像下图一样

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

import {Linking} from 'react-native';

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

你可以在任何你喜欢的地方使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2020-04-12
    • 2017-12-29
    相关资源
    最近更新 更多