9.4 推送通知

张开发
2026/4/14 19:24:44 15 分钟阅读

分享文章

9.4 推送通知
推送通知是 App 召回用户、传递信息的重要手段。Flutter 中推送通知分为本地通知和远程推送两种通常结合使用。一、本地通知flutter_local_notificationsdependencies:flutter_local_notifications:^17.2.11.1 初始化importpackage:flutter_local_notifications/flutter_local_notifications.dart;classLocalNotificationService{staticfinal_pluginFlutterLocalNotificationsPlugin();staticFuturevoidinitialize()async{constandroidSettingsAndroidInitializationSettings(mipmap/ic_launcher);constiosSettingsDarwinInitializationSettings(requestAlertPermission:true,requestBadgePermission:true,requestSoundPermission:true,);constsettingsInitializationSettings(android:androidSettings,iOS:iosSettings,);await_plugin.initialize(settings,onDidReceiveNotificationResponse:_onNotificationTapped,);// 请求 Android 13 通知权限await_plugin.resolvePlatformSpecificImplementationAndroidFlutterLocalNotificationsPlugin()?.requestNotificationsPermission();}// 用户点击通知时的回调staticvoid_onNotificationTapped(NotificationResponseresponse){finalpayloadresponse.payload;if(payload!null){finaldatajsonDecode(payload);router.push(/order/${data[orderId]});// 跳转到对应页面}}}1.2 显示通知// 简单通知staticFuturevoidshowSimple({requiredStringtitle,requiredStringbody,String?payload,})async{constandroidDetailsAndroidNotificationDetails(default_channel,默认通知,channelDescription:应用默认通知渠道,importance:Importance.high,priority:Priority.high,icon:mipmap/ic_launcher,largeIcon:DrawableResourceAndroidBitmap(mipmap/ic_launcher),);constiosDetailsDarwinNotificationDetails(presentAlert:true,presentBadge:true,presentSound:true,);constdetailsNotificationDetails(android:androidDetails,iOS:iosDetails,);await_plugin.show(DateTime.now().millisecond,// 通知 IDtitle,body,details,payload:payload,);}// 带进度条的通知文件下载staticFuturevoidshowProgress({required int id,requiredStringtitle,required int progress,required int maxProgress,})async{finalandroidDetailsAndroidNotificationDetails(download_channel,下载通知,channelDescription:文件下载进度,importance:Importance.low,showProgress:true,maxProgress:maxProgress,progress:progress,ongoing:true,// 不可滑动删除autoCancel:false,);await_plugin.show(id,title,$progress%,NotificationDetails(android:androidDetails));}// 定时通知staticFuturevoidscheduleNotification({requiredStringtitle,requiredStringbody,requiredDateTimescheduledTime,})async{await_plugin.zonedSchedule(0,title,body,tz.TZDateTime.from(scheduledTime,tz.local),constNotificationDetails(android:AndroidNotificationDetails(reminder,提醒通知),iOS:DarwinNotificationDetails(),),androidScheduleMode:AndroidScheduleMode.exactAllowWhileIdle,uiLocalNotificationDateInterpretation:UILocalNotificationDateInterpretation.absoluteTime,);}二、Firebase Cloud Messaging远程推送dependencies:firebase_core:^2.30.0firebase_messaging:^14.8.02.1 初始化 FCMimportpackage:firebase_messaging/firebase_messaging.dart;classPushNotificationService{staticfinal_messagingFirebaseMessaging.instance;staticFuturevoidinitialize()async{// 请求推送权限finalsettingsawait_messaging.requestPermission(alert:true,badge:true,sound:true,provisional:false,);debugPrint(Push permission:${settings.authorizationStatus});// 获取 FCM Token发送给后端保存finaltokenawait_messaging.getToken();debugPrint(FCM Token:$token);await_sendTokenToServer(token);// 监听 Token 刷新_messaging.onTokenRefresh.listen(_sendTokenToServer);// 前台消息处理FirebaseMessaging.onMessage.listen(_handleForegroundMessage);// 后台点击通知App 从后台唤起FirebaseMessaging.onMessageOpenedApp.listen(_handleNotificationTap);// 冷启动点击通知App 完全关闭时finalinitialMessageawait_messaging.getInitialMessage();if(initialMessage!null){_handleNotificationTap(initialMessage);}}// 前台收到消息显示本地通知staticvoid_handleForegroundMessage(RemoteMessagemessage){debugPrint(前台消息:${message.notification?.title});if(message.notification!null){LocalNotificationService.showSimple(title:message.notification!.title??,body:message.notification!.body??,payload:jsonEncode(message.data),);}}// 用户点击通知跳转到对应页面staticvoid_handleNotificationTap(RemoteMessagemessage){finaldatamessage.data;switch(data[type]){caseorder:router.push(/order/${data[orderId]});break;casechat:router.push(/chat/${data[roomId]});break;casepromotion:router.push(/promotion/${data[promotionId]});break;}}staticFuturevoid_sendTokenToServer(String?token)async{if(tokennull)return;awaitApiClient.post(/device/register,body:{fcmToken:token});}// 主题订阅staticFuturevoidsubscribeToTopic(Stringtopic)_messaging.subscribeToTopic(topic);staticFuturevoidunsubscribeFromTopic(Stringtopic)_messaging.unsubscribeFromTopic(topic);}2.2 后台消息处理// main.dart — 后台消息处理器必须是顶层函数pragma(vm:entry-point)Futurevoid_firebaseMessagingBackgroundHandler(RemoteMessagemessage)async{awaitFirebase.initializeApp();debugPrint(后台消息:${message.messageId});// 可以在此更新本地数据库、显示本地通知等}voidmain()async{WidgetsFlutterBinding.ensureInitialized();awaitFirebase.initializeApp();// 注册后台处理器FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);awaitPushNotificationService.initialize();runApp(constMyApp());}三、通知渠道管理AndroidstaticFuturevoidcreateNotificationChannels()async{finalandroidPlugin_plugin.resolvePlatformSpecificImplementationAndroidFlutterLocalNotificationsPlugin();// 订单通知高优先级有声音awaitandroidPlugin?.createNotificationChannel(constAndroidNotificationChannel(order_channel,订单通知,description:订单状态变更通知,importance:Importance.high,sound:RawResourceAndroidNotificationSound(order_sound),),);// 活动通知低优先级静默awaitandroidPlugin?.createNotificationChannel(constAndroidNotificationChannel(promotion_channel,活动通知,description:促销活动推送,importance:Importance.low,),);}四、角标管理dependencies:flutter_app_badger:^1.5.0importpackage:flutter_app_badger/flutter_app_badger.dart;// 设置角标FlutterAppBadger.updateBadgeCount(unreadCount);// 清除角标FlutterAppBadger.removeBadge();小结功能方案本地通知flutter_local_notifications远程推送Firebase Cloud MessagingFCM前台通知用本地通知展示远程消息通知跳转解析 payload/data → 路由跳转后台处理onBackgroundMessage顶层函数角标flutter_app_badger 下一节继续阅读后续章节

更多文章