如何在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
相关产品推荐
相关产品推荐

