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

如何在OneSignal v16版本中获取UserID?

OneSignal v16 获取UserID报错解决办法

我用OneSignal v16做网页通知,初始化代码是这样的:

<script src="https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.page.js" defer></script>
<script>
  window.OneSignalDeferred = window.OneSignalDeferred || [];
  OneSignalDeferred.push(function(OneSignal) {
    OneSignal.init({
      appId: "**********************",
    });
  });
</script>

用户第一次访问会弹出订阅提示,之后我要把UserID存到数据库里,就加了这段代码:

OneSignalDeferred.push(function(OneSignal) {
    OneSignal.init({
      appId: "**********************",
    });
    OneSignal.getUserId(function(userId) {
        console.log("USERID:", userId)
    });
  });

结果控制台直接报错:

TypeError: OneSignal.getUserId is not a function

问题原因

OneSignal v16已经彻底弃用了带回调参数的getUserId()方法,现在这个方法返回的是Promise对象,不再支持传入回调函数。另外,如果调用时机不对(比如用户还没完成订阅),也可能出现异常。

正确实现方式

方式1:用Promise的then方法处理

OneSignalDeferred.push(function(OneSignal) {
    OneSignal.init({
      appId: "**********************",
    });
    // 用Promise获取UserID
    OneSignal.getUserId().then(userId => {
        if (userId) {
            console.log("USERID:", userId);
            // 这里写把userId存到数据库的逻辑
        } else {
            console.log("用户还没订阅,拿不到UserID");
        }
    }).catch(error => {
        console.error("获取UserID失败:", error);
    });
});

方式2:用async/await简化代码

OneSignalDeferred.push(async function(OneSignal) {
    await OneSignal.init({
      appId: "**********************",
    });
    try {
        const userId = await OneSignal.getUserId();
        if (userId) {
            console.log("USERID:", userId);
            // 执行存数据库的操作
        } else {
            console.log("用户未订阅");
        }
    } catch (error) {
        console.error("获取UserID出错:", error);
    }
});

更稳妥的方式:监听订阅状态变化

为了确保在用户完成订阅后再获取UserID,避免时机问题导致拿不到值,可以监听订阅状态变更事件:

OneSignalDeferred.push(function(OneSignal) {
    OneSignal.init({
      appId: "**********************",
    });
    // 监听订阅状态变化
    OneSignal.on('subscriptionChange', isSubscribed => {
        if (isSubscribed) {
            OneSignal.getUserId().then(userId => {
                console.log("订阅成功,UserID:", userId);
                // 这里把userId存到数据库
            });
        } else {
            console.log("用户取消了订阅");
        }
    });
});

内容的提问来源于stack exchange,提问作者Sudo Sur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:55:16