在收到仅数据 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
应该可以完成工作。
- 确保
AppRegistry.registerHeadlessTask('RNFirebaseBackgroundMessage', () => backgroundMessaging);
在您的根应用程序组件上。
- 从您拥有的任何子组件导出
backgroundMessaging
并将其导入您的应用程序根组件。
- 在子组件的函数内调用 invokeApp(),这与您所做的非常相似。
- 当应用不是 运行 时,请不要忘记 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
打开你的 xcode,启动 iOS 项目并打开 xcode.
[=44 中的 Info.plist
文件=]
在根键下添加 URL types
行,然后添加一个项目,例如:Item 0
,然后 URL Schemes
然后是一个带有字符串值的项目。 (在我们的例子中是 my-awesome-app)。
就像下图一样
现在设置 url 方案后,现在您可以这样调用它了。
import {Linking} from 'react-native';
Linking.openURL('my-awesome-app://');
您可以在任何地方使用它。
我成功地使用 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
应该可以完成工作。
- 确保
AppRegistry.registerHeadlessTask('RNFirebaseBackgroundMessage', () => backgroundMessaging);
在您的根应用程序组件上。 - 从您拥有的任何子组件导出
backgroundMessaging
并将其导入您的应用程序根组件。 - 在子组件的函数内调用 invokeApp(),这与您所做的非常相似。
- 当应用不是 运行 时,请不要忘记 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
打开你的 xcode,启动 iOS 项目并打开 xcode.
[=44 中的Info.plist
文件=]在根键下添加
URL types
行,然后添加一个项目,例如:Item 0
,然后URL Schemes
然后是一个带有字符串值的项目。 (在我们的例子中是 my-awesome-app)。 就像下图一样
现在设置 url 方案后,现在您可以这样调用它了。
import {Linking} from 'react-native';
Linking.openURL('my-awesome-app://');
您可以在任何地方使用它。