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

Unity中OneSignal推送通知不显示且HandleNotificationReceived未触发求助

解决Unity集成OneSignal收不到通知、HandleNotificationReceived回调未触发的问题

一、核心排查方向

1. 确认订阅与权限状态

  • 检查控制台输出的pushState.subscriptionStatus.subscribed值:
    • 若为false,说明设备未成功订阅OneSignal服务。需排查:
      • OneSignal App ID是否与控制台创建的应用ID完全匹配;
      • Android平台:确认AndroidManifest.xml中已添加通知权限(POST_NOTIFICATIONS等),且目标API版本符合要求;
      • iOS平台:确认已在代码中请求通知权限(可通过OneSignal.RequestPermission()主动触发);
    • 实现权限与订阅状态的监听回调,实时追踪状态变化:
      private void OneSignal_permissionObserver(OSPermissionStateChanges stateChanges)
      {
          Debug.Log($"权限状态变更: {stateChanges.to.status}");
          Debug.Log($"是否授权通知: {stateChanges.to.authorized}");
      }
      
      private void OneSignal_subscriptionObserver(OSSubscriptionStateChanges stateChanges)
      {
          Debug.Log($"订阅状态变更: {stateChanges.to.subscribed}");
          Debug.Log($"当前User ID: {stateChanges.to.userId}");
      }
      

2. 修正回调绑定问题

  • 你的HandleNotificationReceived是静态方法,部分OneSignal SDK版本对静态回调的支持存在兼容性问题,建议改为实例方法:
    // 修改为实例方法
    private void HandleNotificationReceived(OSNotification notification)
    {
        OSNotificationPayload payload = notification.payload;
        string message = payload.body;
        ToastMessage.Instance.showToastOnUiThread("Message: " + message);
    
        print("GameControllerExample:HandleNotificationReceived: " + message);
        print("displayType: " + notification.displayType);
        extraMessage = "Notification received with text: " + message;
    
        Dictionary<string, object> additionalData = payload.additionalData;
        if (additionalData == null)
            Debug.Log("[HandleNotificationReceived] Additional Data == null");
        else
            Debug.Log("[HandleNotificationReceived] message " + message + ", additionalData: " + Json.Serialize(additionalData));
    }
    
    初始化时直接绑定实例方法即可(无需修改StartInit链中的代码)。

3. 验证通知发送条件

  • 测试时区分应用状态:
    • 前台:你设置了inFocusDisplayType = OSInFocusDisplayOption.Notification,此时应弹出通知并触发回调;
    • 后台:Android需确认已创建有效通知渠道,iOS需确保推送权限包含“提醒”选项;
  • 在OneSignal控制台发送测试通知时,确保目标正确:
    • 使用日志中输出的userId作为目标;
    • 或通过你设置的标签data:data批量推送;
    • 必须填写通知内容(body),否则你的回调中message为空,可能导致Toast无显示,但控制台仍会打印日志。

4. 利用日志定位问题

  • 你已开启VERBOSE级别的日志,重点查看以下内容:
    • OneSignal初始化日志中是否有“Successfully initialized”字样;
    • 是否存在“Subscription failed”“Permission denied”等错误信息;
    • 通知到达时是否有“Notification received”的日志输出,若有但未触发回调,说明回调绑定逻辑异常;
  • Android可通过Logcat、iOS通过Xcode查看更详细的原生日志,排查底层推送服务问题。

5. 检查版本兼容性

  • 确认OneSignal Unity SDK版本与你的Unity版本匹配(例如Unity 2020+建议使用3.x及以上版本的SDK);
  • Android平台检查gradle版本、iOS平台检查Xcode版本是否符合SDK的最低要求。

二、额外优化建议

  • 移除初始化后立即调用的OneSignal.ClearOneSignalNotifications():该方法会清除历史通知,但不影响新通知接收,若测试时依赖历史通知验证,可暂时注释;
  • 确保挂载该脚本的GameObject在运行过程中不会被销毁,否则实例方法回调会失效(静态方法虽不受影响,但仍建议使用实例方法)。

内容的提问来源于stack exchange,提问作者Ρπίηζε Κιηφφ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:50:35