从不调用Firebase消息onResume、onLaunch或onBackgroundMessage
我正在使用Firebase云消息包进行flifter。 我希望,每当用户点击收到的通知时,颤振应用程序就会打开,并根据fcm发送的数据导航到特定屏幕 但当应用程序处于后台或应用程序关闭时,我无法实现所需的行为,因为onResume和onLaunch处理程序从未被调用。我尝试了很多解决方案,比如创建通知通道,使用类似 颤振、本地通知等,但对我来说没有任何效果 下面是我的FirebaseMessagingService类,用于处理fcm相关任务从不调用Firebase消息onResume、onLaunch或onBackgroundMessage,firebase,flutter,notifications,firebase-cloud-messaging,Firebase,Flutter,Notifications,Firebase Cloud Messaging,我正在使用Firebase云消息包进行flifter。 我希望,每当用户点击收到的通知时,颤振应用程序就会打开,并根据fcm发送的数据导航到特定屏幕 但当应用程序处于后台或应用程序关闭时,我无法实现所需的行为,因为onResume和onLaunch处理程序从未被调用。我尝试了很多解决方案,比如创建通知通道,使用类似 颤振、本地通知等,但对我来说没有任何效果 下面是我的FirebaseMessagingService类,用于处理fcm相关任务 class FirebaseMessagingServ
class FirebaseMessagingService {
final FirebaseMessaging _fcm = FirebaseMessaging();
final RouterService _routerService = locator<RouterService>();
final LocalStorageService _localStorage = locator<LocalStorageService>();
Future initialise() async {
if (Platform.isIOS) {
_fcm.requestNotificationPermissions(IosNotificationSettings());
}
_fcm.configure(
onMessage: (Map<String, dynamic> message) async {
Map<String, dynamic> arguments = {};
Map<String, dynamic> data = message['data'];
if (data.containsKey('argument')) {
if (data.containsKey('value')) {
arguments[data['argument']] = data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed('${data['route']}', arguments: arguments);
},
onLaunch: (Map<String, dynamic> message) async {
Map<String, dynamic> arguments = {};
Map<String, dynamic> data = message['data'];
if (data.containsKey('argument')) {
if (data.containsKey('value')) {
arguments[data['argument']] = data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed('${data['route']}', arguments: arguments);
},
onResume: (Map<String, dynamic> message) async {
Map<String, dynamic> arguments = {};
Map<String, dynamic> data = message['data'];
if (data.containsKey('argument')) {
if (data.containsKey('value')) {
arguments[data['argument']] = data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed('${data['route']}', arguments: arguments);
},
onBackgroundMessage: _myBackgroundMessageHandler);
}
static Future<dynamic> _myBackgroundMessageHandler(
Map<String, dynamic> message) async {
final RouterService _routerService = locator<RouterService>();
if (message.containsKey('data')) {
// Handle data message
Map<String, dynamic> arguments = {};
Map<String, dynamic> data = message['data'];
if (data.containsKey('argument')) {
if (data.containsKey('value')) {
arguments[data['argument']] = data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed('${data['route']}', arguments: arguments);
}
if (message.containsKey('notification')) {
// Handle notification message
final dynamic notification = message['notification'];
}
}
}
类FirebaseMessagingService{
最终FirebaseMessaging_fcm=FirebaseMessaging();
最终RouterService_RouterService=locator();
最终LocalStorageService_localStorage=locator();
Future initialise()异步{
if(Platform.isIOS){
_fcm.requestNotificationPermissions(IONotificationSettings());
}
_fcm.configure(
onMessage:(映射消息)异步{
映射参数={};
地图数据=消息['data'];
if(data.containsKey('argument')){
if(data.containsKey('value')){
参数[data['argument']]=data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed(“${data['route']}”,参数:参数);
},
onLaunch:(映射消息)异步{
映射参数={};
地图数据=消息['data'];
if(data.containsKey('argument')){
if(data.containsKey('value')){
参数[data['argument']]=data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed(“${data['route']}”,参数:参数);
},
onResume:(映射消息)异步{
映射参数={};
地图数据=消息['data'];
if(data.containsKey('argument')){
if(data.containsKey('value')){
参数[data['argument']]=data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed(“${data['route']}”,参数:参数);
},
onBackgroundMessage:\u myBackgroundMessageHandler);
}
静态未来\u myBackgroundMessageHandler(
映射消息)异步{
最终RouterService_RouterService=locator();
if(message.containsKey('data')){
//处理数据消息
映射参数={};
地图数据=消息['data'];
if(data.containsKey('argument')){
if(data.containsKey('value')){
参数[data['argument']]=data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed(“${data['route']}”,参数:参数);
}
if(message.containsKey('notification')){
//处理通知消息
最终动态通知=消息['notification'];
}
}
}
有人能帮我解决这个问题吗?我找到了解决办法。首先,您必须将此代码添加到清单中:
<intent-filter>
<action android:name="FLUTTER_NOTIFICATION_CLICK"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
然后还可以作为数据传递,例如route=>detailScreen
完成此操作后,通过检查FCM中通过的路由,可以调用firebase消息传递功能,如onResume
或OnLaunch
检查路线时,您可以使用此功能浏览任何屏幕:
//PRIVATE METHOD TO HANDLE NAVIGATION TO SPECIFIC PAGE
void _navigateToSignalsPage(Map<String, dynamic> message) {
final MessageBean item = _itemForMessage(message);
// Clear away dialogs
// Navigator.popUntil(context, (Route<dynamic> route) => route is PageRoute);
if (!item.route.isCurrent) {
print('heey girl ${item.route}');
Navigator.push(
context, MaterialPageRoute(builder: (context) => HomePage(selectedPage: 0,)));
}
}
//处理特定页面导航的私有方法
无效(地图信息){
最终消息bean项=_itemForMessage(消息);
//清除对话框
//Navigator.popintil(context,(Route-Route)=>Route是PageRoute);
如果(!item.route.isCurrent){
打印('heeygirl${item.route}');
导航器。推(
context,materialpage(builder:(context)=>主页(selectedPage:0,);
}
}
//PRIVATE METHOD TO HANDLE NAVIGATION TO SPECIFIC PAGE
void _navigateToSignalsPage(Map<String, dynamic> message) {
final MessageBean item = _itemForMessage(message);
// Clear away dialogs
// Navigator.popUntil(context, (Route<dynamic> route) => route is PageRoute);
if (!item.route.isCurrent) {
print('heey girl ${item.route}');
Navigator.push(
context, MaterialPageRoute(builder: (context) => HomePage(selectedPage: 0,)));
}
}