我成功使用 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 应用程序中?
我发现了这个包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);
});
}
然而,这并没有将我的应用程序带到前台。
我现在已将
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
函数时,应用程序仍然不会来到前台。
我在 react-native-invoke-app
github 页面上提出了
this问题,该页面包含有关我面临的问题的更多详细信息。
这不起作用的原因是
react-native-invoke-app
不支持Android版本> 8。
而不是
invokeapp();
,您可以描述一个url方案并打开与该方案相关的url,以使应用程序打开并进入前台。
Android 上:
在 ` 标签下的
<data android:scheme=“my-awesome-app” />
中添加 ./android/app/src/main/AndroidManifest.xml
意图。
iOS 上
打开您的 xcode,启动 iOS 项目并在 xcode 中打开
Info.plist
文件。在根键下添加
URL types
行,然后添加一个项目,例如:Item 0
,然后URL Schemes
,然后添加一个带有字符串值的项目。 (在我们的示例中是 my-awesome-app)。
就像下图一样现在设置好 url 方案后,现在你可以像这样调用它了。
import {Linking} from 'react-native';
Linking.openURL('my-awesome-app://');
您可以在任何您想要的地方使用它。
使用
react-native-invoke-app
应该可以完成工作。
AppRegistry.registerHeadlessTask('RNFirebaseBackgroundMessage', () => backgroundMessaging);
位于您的根应用程序组件上。backgroundMessaging
并将其导入到您的应用程序根组件中。我还没有测试过这个,但我看不出它不起作用的原因。
希望这有帮助!