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,提问作者Ρπίηζε Κιηφφ
相关产品推荐
相关产品推荐

