Flutter中OneSignal的setNotificationOpenedHandler在iOS上失效
针对你遇到的Android正常、iOS15+点击通知不触发setNotificationOpenedHandler的问题,以下是几个排查和解决方向:
升级OneSignal SDK到最新稳定版
旧版本SDK可能存在iOS15+的兼容问题,比如Flutter项目中,修改pubspec.yaml里的onesignal_flutter依赖版本为当前最新:dependencies: onesignal_flutter: ^5.0.0 # 替换为官方最新稳定版本执行
flutter pub get更新依赖后重新打包测试。确认iOS通知权限与前台配置
- 检查用户设备的系统设置→你的App→通知,确保「允许通知」已开启,且通知样式(横幅/提醒)正常启用。
- 推送通知时,payload中需包含
content-available: 1字段,确保App在后台能正常接收并响应通知点击事件。
校验通知Payload格式合法性
iOS15+对payload格式校验更严格,确保additionalData是标准JSON结构,无非法字符或嵌套错误。可先使用简化payload测试:{ "app_id": "你的AppID", "include_player_ids": ["测试设备PlayerID"], "contents": {"en": "测试通知"}, "additional_data": {"id": "123", "type": "detail"} }修正SceneDelegate集成逻辑(iOS13+)
若App使用SceneDelegate,需确保OneSignal的handler在正确生命周期设置:- 在
sceneDidBecomeActive方法中重新绑定setNotificationOpenedHandler,避免冷启动时未初始化的问题:func sceneDidBecomeActive(_ scene: UIScene) { OneSignal.shared.setNotificationOpenedHandler { result in let additionalData = result?.notification.additionalData ?? [:] // 通过MethodChannel将数据传递给Flutter侧处理 } } - 确保
didFinishLaunchingWithOptions中完成OneSignal初始化,无逻辑阻塞。
- 在
优化冷启动场景的handler设置时机
iOS15+冷启动时,通知点击事件可能先于App初始化完成,需在App启动最早阶段设置handler,比如Flutter项目中:void main() async { WidgetsFlutterBinding.ensureInitialized(); await OneSignal.shared.setAppId("你的AppID"); // 初始化后立即绑定handler OneSignal.shared.setNotificationOpenedHandler((openedResult) { AdditionalNotificationModel additionalNotificationModel = AdditionalNotificationModel.fromJson(openedResult.notification.additionalData ?? {}); FunctionUtils.redirectNotification(additionalNotificationModel); readNotification(additionalNotificationModel); }); runApp(MyApp()); }避免原生通知代理冲突
检查原生代码是否自定义了UNUserNotificationCenterDelegate的方法(如userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:),若有,需确保在该方法中调用OneSignal的处理逻辑,或直接使用OneSignal的代理实现,避免覆盖事件。
内容的提问来源于stack exchange,提问作者HuyTran

