如何在 iOS 中获取 One Signal 用户的唯一玩家 ID?

How to get One Signal user's unique player id in iOS?

如何在 iOS 中检索 OneSignal 用户的唯一玩家 ID? 我只在 OneSignal 官方文档中找到 iOS SDK 设置。

如果有任何建议,谢谢。

您需要使用 OneSignal 的观察者,例如 OSSubscriptionObserver.

// Add OSSubscriptionObserver after UIApplicationDelegate
class AppDelegate: UIResponder, UIApplicationDelegate, OSSubscriptionObserver {

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
      // Add your AppDelegate as an subscription observer
      OneSignal.add(self as OSSubscriptionObserver)
   }

   // After you add the observer on didFinishLaunching, this method will be called when the notification subscription property changes. 
   func onOSSubscriptionChanged(_ stateChanges: OSSubscriptionStateChanges!) {
      if !stateChanges.from.subscribed && stateChanges.to.subscribed {
         print("Subscribed for OneSignal push notifications!")
      }
      print("SubscriptionStateChange: \n\(stateChanges)")

      //The player id is inside stateChanges. But be careful, this value can be nil if the user has not granted you permission to send notifications. 
      if let playerId = stateChanges.to.userId {
         print("Current playerId \(playerId)")
      }
   }
}

为了更好的解释,这里是 addSubscriptionObserver

的文档

您可以在 standardUserDefaults 中找到它。您可以使用以下方法检索它。我相信它是在第一次启动应用程序时设置的,但是,它可能不会在第一次调用 application:didFinishLaunchingWithOptions: 时设置。

UserDefaults.standard.string(forKey: "GT_PLAYER_ID")

您可以通过查看字典表示来了解用户默认值中还存储了什么:UserDefaults.standard.dictionaryRepresentation()

我确实需要在代码中的某处获取玩家 ID(或用户 ID),但我不想将其保存在任何地方。

我最终使用了这段代码:

let userId = OneSignal.getPermissionSubscriptionState().subscriptionStatus.userId
    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 // This one
    print("userID = \(userID)")
    let pushToken = status.subscriptionStatus.pushToken
    print("pushToken = \(pushToken)")