【问题标题】:One Signal - idsAvailable is deprecated一个信号 - idsAvailable 已弃用
【发布时间】:2017-04-05 11:40:11
【问题描述】:

OneSignal 的最新构建版本生成警告,如“idsAvailable”已弃用。如何使用 getPermissionSubscriptionState() 而不是 idsAvailable 获取“playerID”,如下所示?

    OneSignal.idsAvailable({ (userId, pushToken) in

        if (pushToken != nil) {

            if let playerID = userId {

                // do something

            }
        }
    })

【问题讨论】:

    标签: ios swift onesignal


    【解决方案1】:

    OneSignal 保留了非常好的文档。

    对于android,您可以使用idsAvailable 方法获取用户ID,该方法返回用户ID 和注册ID。

    userID aka playerID 是 OneSignal UUID 格式的字符串。 (每个应用每个设备唯一) registrationID 是 Google 分配的标识符(每个设备每个应用程序和重新安装时的更改都是唯一的)。

    对于 iOS,您可以通过相同的方式获取用户 ID,但在原生 iOS SDK 版本 2.5.0+ 中添加了 getPermissionSubscriptionState 方法和 addSubscriptionObserver。

    您可以按如下方式获取 Swift 的 OSPermissionSubscriptionState:

    let status: OSPermissionSubscriptionState = OneSignal.getPermissionSubscriptionState()
    
    let hasPrompted = status.permissionStatus.hasPrompted
    print("hasPrompted = \(hasPrompted)")
    let userStatus = status.permissionStatus.status
    print("userStatus = \(userStatus)")
    
    let isSubscribed = status.subscriptionStatus.subscribed
    print("isSubscribed = \(isSubscribed)")
    let userSubscriptionSetting = status.subscriptionStatus.userSubscriptionSetting
    print("userSubscriptionSetting = \(userSubscriptionSetting)")
    let userID = status.subscriptionStatus.userId
    print("userID = \(userID)")
    let pushToken = status.subscriptionStatus.pushToken
    print("pushToken = \(pushToken)")
    

    对于 Objective-C:

    OSPermissionSubscriptionState* status = [OneSignal getPermissionSubscriptionState];
    status.permissionStatus.hasPrompted
    status.permissionStatus.status
    
    status.subscriptionStatus.subscribed
    status.subscriptionStatus.userSubscriptionSetting
    status.subscriptionStatus.userId
    status.subscriptionStatus.pushToken
    

    所以你上面的代码现在看起来像这样:

    let status: OSPermissionSubscriptionState = OneSignal.getPermissionSubscriptionState()
    
    let userID = status.subscriptionStatus.userId
        print("userID = \(userID)")
    let pushToken = status.subscriptionStatus.pushToken
        print("pushToken = \(pushToken)")
    
    if pushToken != nil {
        if let playerID = userID {
            // do something
        }
    }
    

    【讨论】:

      【解决方案2】:

      我刚刚在文档中发现,看起来“userID”的意思是“playerID”。

      https://documentation.onesignal.com/docs/ios-native-sdk#section--getpermissionsubscriptionstate-

      【讨论】:

        【解决方案3】:

        userIdplayerId 相同,将它们放在我在 Swift 4 应用程序中使用的一些示例分析(单例)类中:

        class Analytics : NSObject, OSSubscriptionObserver {
        
            ///the singleton
            static let shared = Analytics()
        
        
            func setupOneSignal(launchOptions: [UIApplicationLaunchOptionsKey : Any]?) {
                OneSignal.setLogLevel(.LL_VERBOSE, visualLevel: .LL_NONE)
                OneSignal.add(self as OSSubscriptionObserver)
        
                let settings : [String : Any] = [kOSSettingsKeyInAppLaunchURL : false]
                OneSignal.initWithLaunchOptions(
                    launchOptions,
                    appId:Environment.oneSignalAppId,
                    handleNotificationReceived: {
                        (osnotification) in
                       //.....
                },
                    handleNotificationAction: {
                        (osNotificationOpenedResult) in
                       //.....
        
                },
                    settings: settings)
            }
        
            func onOSSubscriptionChanged(_ stateChanges: OSSubscriptionStateChanges!) {
                if  let state = OneSignal.getPermissionSubscriptionState(),
                    let userId = state.subscriptionStatus.userId,
                    let pushToken = state.subscriptionStatus.pushToken {
                    print("onesignal.userId : \(userId)")
                    print("onesignal.pushToken : \(pushToken)")
                }
            }
        
        }
        

        【讨论】:

          【解决方案4】:

          使用此代码

          public class MainActivity extends Activity implements OSSubscriptionObserver {
            protected void onCreate(Bundle savedInstanceState) {
              OneSignal.addSubscriptionObserver(this);
            }
            
            public void onOSSubscriptionChanged(OSSubscriptionStateChanges stateChanges) {
              if (!stateChanges.getFrom().getSubscribed() &&
                  stateChanges.getTo().getSubscribed()) {
                   new AlertDialog.Builder(this)
                       .setMessage("You've successfully subscribed to push notifications!")
                       .show();
                  // get player ID
                  stateChanges.getTo().getUserId();
                }
             
                Log.i("Debug", "onOSSubscriptionChanged: " + stateChanges);
            }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-08-04
            • 2014-02-12
            • 2012-06-25
            • 1970-01-01
            • 2021-10-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-18
            相关资源
            最近更新 更多