OneSignal:是否存在类似addListenerForNotificationOpened的用户订阅通知事件?
Great question! OneSignal确实有对应的机制来监听用户的订阅行为,完全能实现你在用户刚完成订阅时发送tags的需求,它和addListenerForNotificationOpened类似,但专门针对订阅状态变化。
Web端实现方式
在Web环境下,你可以使用OneSignal.on('subscriptionChange', callback)来监听订阅状态的变化。当用户从“未订阅”切换到“已订阅”时,回调函数会触发,这时候你就可以在里面调用sendTags方法。
示例代码:
// 初始化OneSignal之后设置监听 OneSignal.on('subscriptionChange', function(isSubscribed) { // 确认用户是刚完成订阅 if (isSubscribed) { // 准备要发送的tags数据 const userTags = { subscriber_type: 'new', subscribed_timestamp: new Date().toISOString() }; // 发送tags OneSignal.sendTags(userTags) .then(function(response) { console.log('Tags成功发送给新订阅用户:', response); }) .catch(function(error) { console.error('发送tags失败:', error); }); } });
注意:这个事件会在用户首次订阅、或者取消订阅后重新订阅时触发,所以一定要通过isSubscribed判断状态,避免重复执行逻辑。
移动端(iOS/Android)实现方式
如果你是在移动端开发,OneSignal也提供了对应的观察者模式来监听订阅状态变化:
iOS(Swift示例)
你需要实现OSSubscriptionObserver协议,并注册观察者:
import OneSignal class SubscriptionListener: NSObject, OSSubscriptionObserver { override init() { super.init() // 注册订阅状态观察者 OneSignal.add(self as OSSubscriptionObserver) } func onOSSubscriptionChanged(_ stateChanges: OSSubscriptionStateChanges!) { // 判断是否是订阅成功的状态变化 if stateChanges.to.subscribed { let tags = [ "subscriber_type": "new", "subscribed_timestamp": Date().iso8601Format() ] // 发送tags OneSignal.sendTags(tags, onSuccess: { result in print("Tags发送成功:", result ?? "无返回数据") }, onFailure: { error in print("发送tags失败:", error?.localizedDescription ?? "未知错误") }) } } } // 在AppDelegate的didFinishLaunchingWithOptions中初始化 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 初始化OneSignal... _ = SubscriptionListener() return true }
Android(Kotlin示例)
通过SubscriptionObserver来监听:
import com.onesignal.OneSignal import com.onesignal.subscriptions.SubscriptionObserver import com.onesignal.subscriptions.SubscriptionStateChanges class SubscriptionListener : SubscriptionObserver { init { OneSignal.addSubscriptionObserver(this) } override fun onSubscriptionChanged(stateChanges: SubscriptionStateChanges) { if (stateChanges.to.isSubscribed) { val tags = mapOf( "subscriber_type" to "new", "subscribed_timestamp" to java.util.Date().toString() ) OneSignal.sendTags(tags, successCallback = { result -> println("Tags发送成功: $result") }, failureCallback = { error -> println("发送tags失败: ${error?.message}") } ) } } } // 在Application类或者MainActivity的onCreate中初始化 class MyApplication : Application() { override fun onCreate() { super.onCreate() // 初始化OneSignal... SubscriptionListener() } }
这个机制完美匹配你的需求:在用户完成订阅的瞬间触发逻辑,然后通过Promise或回调确认tags发送完成。
内容的提问来源于stack exchange,提问作者H.C
相关产品推荐
相关产品推荐

