You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中OneSignal的setNotificationOpenedHandler在iOS上失效

OneSignal setNotificationOpenedHandler 在 iOS15+ 不触发的解决方案

针对你遇到的Android正常、iOS15+点击通知不触发setNotificationOpenedHandler的问题,以下是几个排查和解决方向:

  • 升级OneSignal SDK到最新稳定版
    旧版本SDK可能存在iOS15+的兼容问题,比如Flutter项目中,修改pubspec.yaml里的onesignal_flutter依赖版本为当前最新:

    dependencies:
      onesignal_flutter: ^5.0.0 # 替换为官方最新稳定版本
    

    执行flutter pub get更新依赖后重新打包测试。

  • 确认iOS通知权限与前台配置

    1. 检查用户设备的系统设置→你的App→通知,确保「允许通知」已开启,且通知样式(横幅/提醒)正常启用。
    2. 推送通知时,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在正确生命周期设置:

    1. 在sceneDidBecomeActive方法中重新绑定setNotificationOpenedHandler,避免冷启动时未初始化的问题:
      func sceneDidBecomeActive(_ scene: UIScene) {
          OneSignal.shared.setNotificationOpenedHandler { result in
              let additionalData = result?.notification.additionalData ?? [:]
              // 通过MethodChannel将数据传递给Flutter侧处理
          }
      }
      
    2. 确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 12:40:12