如何在Flutter应用中获取OneSignal PlayerId及相关订阅变量?
关于OneSignal PlayerId/Token获取及订阅状态监听的解决方案
一、直接访问订阅ID和Token的方法
只要OneSignal SDK完成初始化,你可以在任意需要的时机直接调用代码获取,无需依赖控制台:
// 获取PlayerId(即pushSubscription.id) String? playerId = OneSignal.User.pushSubscription.id; // 获取设备推送Token String? pushToken = OneSignal.User.pushSubscription.token;
注意:调用时机要选在SDK初始化之后(比如initState方法、App启动完成回调里),避免因订阅未完成导致返回null。如果需要确保拿到有效值,可以结合下面的监听方法配合使用。
二、解决订阅状态监听仅触发一次的问题
addObserver本身是监听订阅状态变化的回调,只有当订阅状态(比如从未订阅到订阅、通知权限开关变更)发生改变时才会触发,并非只能执行一次。如果想在App每次启动时都获取当前订阅状态,需要在添加观察者后主动获取一次当前状态,而不是只等待回调触发:
// 添加订阅状态变化观察者 OneSignal.User.pushSubscription.addObserver((state) { // 状态变化时触发,处理最新状态 handleSubscriptionState(state.current); }); // App启动时主动获取当前订阅状态 void getCurrentSubscriptionState() { final currentState = OneSignal.User.pushSubscription.state; if (currentState != null) { handleSubscriptionState(currentState); } } // 统一处理订阅状态的方法 void handleSubscriptionState(PushSubscriptionState state) { bool isOptedIn = state.optedIn; String? playerId = state.id; String? pushToken = state.token; String stateJson = state.jsonRepresentation(); // 此处编写你的业务逻辑,比如存储PlayerId、上报服务器等 }
这样不管是状态变化触发的回调,还是App启动时的初始状态,都能获取到最新的订阅信息。如果需要在其他场景(比如进入某个页面)重复获取,直接调用getCurrentSubscriptionState方法即可,无需重复添加观察者。
内容的提问来源于stack exchange,提问作者thefrankie
相关产品推荐
相关产品推荐

