应用程序终止时,Firebase 推送通知回调不起作用
Firebase push notifications callback doesn't work when app is terminated
所以我更新了 firebase_messaging 并且我不得不更改我的代码,因为 FirebaseMessagin.configure()
已被弃用,现在当我收到通知并单击通知时它不会打开另一个屏幕。
我是这样实现通知的:
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
await Firebase.initializeApp();
print('Handling a background message ${message.messageId}');
}
const AndroidNotificationChannel channel = AndroidNotificationChannel(
'high_importance_channel', // id
'High Importance Notifications', // title
'This channel is used for important notifications.', // description
importance: Importance.high,
);
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'e-Rădăuți',
debugShowCheckedModeBanner: false,
initialRoute: '/',
routes: {
'/': (_) => MenuScreen(),
'/events': (BuildContext context) => EventsScreen(),
},
);
}
}
class MenuScreen extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
Widget build(BuildContext context) {
return Scaffold();
}
@override
void initState() {
super.initState();
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification notification = message.notification;
AndroidNotification android = message.notification?.android;
if (notification != null && android != null) {
flutterLocalNotificationsPlugin.show(
notification.hashCode,
notification.title,
notification.body,
NotificationDetails(
android: AndroidNotificationDetails(
channel.id,
channel.name,
channel.description,
icon: 'launch_background',
),
));
}
});
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
debugPrint('A new onMessageOpenedApp event was published!');
Navigator.pushNamed(context, '/events');
});
}
}
但是当我点击通知时没有调用 .onMessageOpenedApp
因为我没有在我的控制台 (VSCode) 中收到 debugPrint
消息并且我收到以下错误:
D/FLTFireMsgReceiver( 4799): broadcast received for message
W/civic.e_radaut( 4799): Accessing hidden method Landroid/os/WorkSource;->add(I)Z (greylist,test-api, reflection, allowed)
W/civic.e_radaut( 4799): Accessing hidden method Landroid/os/WorkSource;->add(ILjava/lang/String;)Z (greylist,test-api, reflection, allowed)
W/civic.e_radaut( 4799): Accessing hidden method Landroid/os/WorkSource;->get(I)I (greylist, reflection, allowed)
W/civic.e_radaut( 4799): Accessing hidden method Landroid/os/WorkSource;->getName(I)Ljava/lang/String; (greylist, reflection, allowed)
W/FirebaseMessaging( 4799): Notification Channel set in AndroidManifest.xml has not been created by the app. Default value will be used.
I/flutter ( 4799): Handling a background message 0:1617783965733220%2ebdcc762ebdcc76
我使用 click_action: FLUTTER_NOTIFICATION_CLICK
从 firebase 发送了我的通知,并在我的清单中添加了
<intent-filter>
<action android:name="FLUTTER_NOTIFICATION_CLICK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
我的firebase_messaging
版本是^8.0.0-dev.15
所以我不知道我错过了什么或者为什么它不起作用。如果您需要更多详细信息,请随时询问。
它应该在应用程序处于后台时工作,但当它终止时你应该使用 getInitialMessage
。
onMessageOpenedApp
: A Stream event will be sent if the app has opened from a background state (not terminated).
If your app is opened via a notification whilst the app is terminated, see getInitialMessage
.
我使用 .getInitialMessage()
函数解决了这个问题(这是应用程序终止时的回调。
当应用程序处于后台但未终止时,我的通知有效。
为了解决这个问题,我刚刚将其添加到我的代码中:
FirebaseMessaging.instance
.getInitialMessage()
.then((RemoteMessage message) {
if (message != null) {
Navigator.pushNamed(context, message.data['view']);
}
});
我制作了一个工作演示here
如果你想去任何页面或午餐 link 当应用程序启动前点击通知时,你必须使用
getInitialMessage()
示例:
FirebaseMessaging.instance
.getInitialMessage()
.then((RemoteMessage message) {
if (message != null) {
//to do your operation
launch('https://google.com');
}
});
所以我更新了 firebase_messaging 并且我不得不更改我的代码,因为 FirebaseMessagin.configure()
已被弃用,现在当我收到通知并单击通知时它不会打开另一个屏幕。
我是这样实现通知的:
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
await Firebase.initializeApp();
print('Handling a background message ${message.messageId}');
}
const AndroidNotificationChannel channel = AndroidNotificationChannel(
'high_importance_channel', // id
'High Importance Notifications', // title
'This channel is used for important notifications.', // description
importance: Importance.high,
);
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'e-Rădăuți',
debugShowCheckedModeBanner: false,
initialRoute: '/',
routes: {
'/': (_) => MenuScreen(),
'/events': (BuildContext context) => EventsScreen(),
},
);
}
}
class MenuScreen extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
Widget build(BuildContext context) {
return Scaffold();
}
@override
void initState() {
super.initState();
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification notification = message.notification;
AndroidNotification android = message.notification?.android;
if (notification != null && android != null) {
flutterLocalNotificationsPlugin.show(
notification.hashCode,
notification.title,
notification.body,
NotificationDetails(
android: AndroidNotificationDetails(
channel.id,
channel.name,
channel.description,
icon: 'launch_background',
),
));
}
});
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
debugPrint('A new onMessageOpenedApp event was published!');
Navigator.pushNamed(context, '/events');
});
}
}
但是当我点击通知时没有调用 .onMessageOpenedApp
因为我没有在我的控制台 (VSCode) 中收到 debugPrint
消息并且我收到以下错误:
D/FLTFireMsgReceiver( 4799): broadcast received for message
W/civic.e_radaut( 4799): Accessing hidden method Landroid/os/WorkSource;->add(I)Z (greylist,test-api, reflection, allowed)
W/civic.e_radaut( 4799): Accessing hidden method Landroid/os/WorkSource;->add(ILjava/lang/String;)Z (greylist,test-api, reflection, allowed)
W/civic.e_radaut( 4799): Accessing hidden method Landroid/os/WorkSource;->get(I)I (greylist, reflection, allowed)
W/civic.e_radaut( 4799): Accessing hidden method Landroid/os/WorkSource;->getName(I)Ljava/lang/String; (greylist, reflection, allowed)
W/FirebaseMessaging( 4799): Notification Channel set in AndroidManifest.xml has not been created by the app. Default value will be used.
I/flutter ( 4799): Handling a background message 0:1617783965733220%2ebdcc762ebdcc76
我使用 click_action: FLUTTER_NOTIFICATION_CLICK
从 firebase 发送了我的通知,并在我的清单中添加了
<intent-filter>
<action android:name="FLUTTER_NOTIFICATION_CLICK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
我的firebase_messaging
版本是^8.0.0-dev.15
所以我不知道我错过了什么或者为什么它不起作用。如果您需要更多详细信息,请随时询问。
它应该在应用程序处于后台时工作,但当它终止时你应该使用 getInitialMessage
。
onMessageOpenedApp
: A Stream event will be sent if the app has opened from a background state (not terminated).If your app is opened via a notification whilst the app is terminated, see
getInitialMessage
.
我使用 .getInitialMessage()
函数解决了这个问题(这是应用程序终止时的回调。
当应用程序处于后台但未终止时,我的通知有效。
为了解决这个问题,我刚刚将其添加到我的代码中:
FirebaseMessaging.instance
.getInitialMessage()
.then((RemoteMessage message) {
if (message != null) {
Navigator.pushNamed(context, message.data['view']);
}
});
我制作了一个工作演示here
如果你想去任何页面或午餐 link 当应用程序启动前点击通知时,你必须使用
getInitialMessage()
示例:
FirebaseMessaging.instance
.getInitialMessage()
.then((RemoteMessage message) {
if (message != null) {
//to do your operation
launch('https://google.com');
}
});