Laravel9+Inertia React中OneSignal通知推送失败问题排查
排查 Laravel 9 + Inertia React 下 OneSignal 通知无法接收的问题
1. 确认用户模型与 OneSignal 订阅 ID 的绑定
你的User模型必须实现OneSignalNotifiable trait,并提供方法返回用户的 OneSignal 订阅 ID,同时要确保前端把订阅ID存储到数据库对应字段:
后端用户模型修改
use NotificationChannels\OneSignal\OneSignalNotifiable; class User extends Authenticatable { use OneSignalNotifiable; // 返回用户的 OneSignal 订阅 ID public function routeNotificationForOneSignal() { return $this->onesignal_id; // 需确保 users 表存在 onesignal_id 字段 } }
前端补充订阅ID存储逻辑
初始化 OneSignal 后,要把用户的订阅ID同步到后端数据库:
useEffect(() => { OneSignal.init({ appId: "PRIVATE-KEY" }); // 监听订阅状态变化,获取并保存订阅ID OneSignal.User.pushSubscription.addEventListener("change", (event) => { if (event.newPushSubscription) { const onesignalId = event.newPushSubscription.id; // 调用后端接口保存订阅ID fetch('/api/save-onesignal-id', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content }, body: JSON.stringify({ onesignal_id: onesignalId }) }); } }); // 检查并请求通知权限 OneSignal.Notifications.getPermissionStatus().then(status => { if (status !== 'granted') { OneSignal.Notifications.requestPermission(); } }); }, []);
2. 验证 OneSignal 后端配置
检查.env文件的配置项是否正确:
ONESIGNAL_APP_ID=你的OneSignal应用ID ONESIGNAL_REST_API_KEY=你的REST API密钥 ONESIGNAL_AUTH_KEY=你的AUTH密钥
同时确认config/services.php中存在对应配置:
'onesignal' => [ 'app_id' => env('ONESIGNAL_APP_ID'), 'rest_api_key' => env('ONESIGNAL_REST_API_KEY'), 'auth_key' => env('ONESIGNAL_AUTH_KEY'), ],
3. 检查通知发送逻辑
确保向用户发送通知的代码正确遍历用户集合,且目标用户均已存储有效的onesignal_id:
// 控制器中的发送逻辑示例 $order = Order::find($orderId); User::all()->each(function ($user) use ($order) { // 跳过未绑定onesignal_id的用户 if ($user->onesignal_id) { $user->notify(new OrderPlacedNotification($order)); } });
4. 排查错误日志与平台记录
- 查看
storage/logs/laravel.log,检查是否有 OneSignal API 调用失败的错误信息(如权限不足、参数错误) - 登录 OneSignal 控制台,进入Messages > All Messages,查看通知发送记录的状态,确认失败原因(如设备未订阅、无效用户ID)
5. 优化 OneSignalMessage 配置
可以补充优先级、平台专属配置,提升通知送达率:
public function toOneSignal($notifiable) { return OneSignalMessage::create() ->setSubject("Nuovo ordine!") ->setBody("Vedi l'ordine.") ->setUrl('http://onesignal.com') ->setPriority(10) // 设置高优先级,确保及时推送 ->setAndroidChannelId('你的安卓通知通道ID') // 适配安卓设备 ->setIosBadgeType('Increase') ->setIosBadgeCount(1); }
内容的提问来源于stack exchange,提问作者p.perfetto993
相关产品推荐
相关产品推荐

