Flutter药品提醒App中Awesome Notification通知不触发求助
排查Awesome Notifications未触发的常见问题
以下是针对Flutter药品提醒App通知未正常触发的分步排查方案:
权限与平台配置检查
- Android:确保
AndroidManifest.xml中添加了POST_NOTIFICATIONS(Android 13+)权限,且正确配置了通知渠道;Android 12+还需申请SCHEDULE_EXACT_ALARM权限,可通过代码检查并引导用户开启:if (Platform.isAndroid) { final exactAlarmStatus = await AwesomeNotifications().requestExactAlarmPermission(); if (!exactAlarmStatus) { // 跳转至系统设置开启精确闹钟权限 } } - iOS:在
Info.plist中添加NSUserNotificationUsageDescription和NSRemoteNotificationUsageDescription描述,代码中主动请求通知权限:await AwesomeNotifications().requestPermissionToSendNotifications();
- Android:确保
初始化逻辑验证
确保App启动时完成Awesome Notifications初始化,且渠道配置与后续创建通知时的channelKey一致:void main() async { WidgetsFlutterBinding.ensureInitialized(); await AwesomeNotifications().initialize( 'resource://drawable/your_app_icon', [ NotificationChannel( channelKey: 'medication_reminder', channelName: '药品提醒', channelDescription: '定时推送药品服用提醒', importance: NotificationImportance.High, channelShowBadge: true, ) ], ); runApp(const MyApp()); }通知创建逻辑排查
检查添加提醒页面的通知创建代码,重点确认:channelKey与初始化时的渠道key完全匹配- 定时时间转换正确,避免时区偏差(建议用
ZonedDateTime或统一转换为UTC时间) - 通知ID唯一,避免被重复创建的通知覆盖
示例正确的定时通知创建代码:
await AwesomeNotifications().createNotification( content: NotificationContent( id: int.parse(firestoreDocId), // 用Firestore文档ID作为唯一ID channelKey: 'medication_reminder', title: '药品服用提醒', body: '该吃${medName}了,剂量:${dose}', ), schedule: NotificationCalendar( year: remindTime.year, month: remindTime.month, day: remindTime.day, hour: remindTime.hour, minute: remindTime.minute, second: 0, repeats: false, // 需要重复提醒则设为true并配置重复规则 ), );后台运行与重启恢复
- App重启后,需从Firestore读取所有未过期的药品提醒,重新创建定时通知,否则之前设置的提醒会丢失
- iOS需开启后台刷新权限,在
Info.plist的UIBackgroundModes中添加remote-notification和fetch
快速测试定位问题
先创建一个立即触发的测试通知,验证基础功能是否正常:await AwesomeNotifications().createNotification( content: NotificationContent( id: 999, channelKey: 'medication_reminder', title: '测试通知', body: '通知功能正常', ), );如果测试通知能正常显示,说明问题出在定时逻辑或时间参数上;若仍不显示,检查权限、渠道配置或包版本兼容性。
日志辅助排查
添加日志打印,查看通知创建结果及错误信息:final createResult = await AwesomeNotifications().createNotification(...); print('通知创建结果:$createResult');同时查看控制台输出,确认是否有权限被拒、渠道不存在等错误提示。
内容的提问来源于stack exchange,提问作者Waseem Thiab
相关产品推荐
相关产品推荐

