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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:35:30