如何在iOS中获取One Signal用户的唯一播放器ID?

16

如何在iOS中检索OneSignal用户的唯一播放器ID? 我只发现了OneSignal官方文档中的iOS SDK设置。

如果有任何建议,谢谢。

8个回答

39

您需要使用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的文档。


我认为这件事太难了。OneSignal 应该在日志中打印玩家 ID。 - Timur Bernikovich
onOSSubscriptionChanged 没有被调用。 - reza_khalafi
在我的情况下,ononOSSubscriptionChanged 没有被调用。请建议为什么它仍然没有被调用,即使 objserver 已经添加到 didFinishLaunching 方法中。 - Protocol

27

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

最终我使用了这段代码:

let userId = OneSignal.getPermissionSubscriptionState().subscriptionStatus.userId

嗨@MBH,当我使用你的代码 let userId = OneSignal.getPermissionSubscriptionState().subscriptionStatus.userId 时,我遇到了以下错误"MUST PROVIDE A VALID CALLBACK"。 - Venkatesh Somu

3
这对我很有帮助,因为其他解决方案已经过时:

这是我成功的方法:

let userId = OneSignal.getDeviceState().userId

请确保您已导入OneSignal:

import OneSignal

onesignal 5.0.0 - 6.0.0没有这些功能。 - undefined
1
谢谢 @Donat,这显示了subscriptionID的正确信息。 - undefined

1
    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)")

0
在基于 WebViewGold 的 iOS 应用程序(WKWebView / UIWebView)中与 OneSignal 结合使用时,您可能需要一些后端工作来将其连接到我们的 OneSignal API:您应该将 ?onesignal_push_id=XYZ 参数保存在数据库中,并在推送通知应发送时立即为该特定用户触发 OneSignal API(https://documentation.onesignal.com/docs/onesignal-api)。这必须由您的后端/ Web 服务器完成。WebViewGold 仅提供内置的 OneSignal API 和能够将 ?onesignal_push_id=XYZ 附加项传递给您的 WebView URL 调用的功能。
因此,请在 Config.swift 中激活“kPushEnhanceUrl”选项(通过将值从 false 切换为 true),以通过 ?onesignal_push_id=XYZ 将个人用户 ID 附加到您的 WebView URL。
如果您的WebView URL是https://www.example.org,WebViewGold将调用https://www.example.org?onesignal_push_id=XYZ。只有您的第一个URL请求会获得该GET变量,因此请将其保存在会话或cookie中以便在链接的页面上访问它。另一种替代或附加方式是通过JavaScript在任何页面上检索和处理信息:
<script>

window.location.href = "getonesignalplayerid://";

alert(onesignalplayerid);

</script>

0
IOS使用'OneSignal/OneSignal'插件,版本要求在5.0.0以上,但小于6.0。你可以从中获得以下内容:
func getOneSignalUserId()-> String {

        let playerId : String  = OneSignal.User.pushSubscription.id ?? ""
        return playerId
    }

-1

现在一个更好的解决方案是使用:

OneSignal.appId()

这是OneSignal平台内的一个独特的应用程序ID。 - Sajjad Sarkoobi

-8

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

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

您可以通过查看字典表示来了解用户默认设置中存储的其他内容:UserDefaults.standard.dictionaryRepresentation()


实际上是一个很好的答案。OneSignal默认将Player ID存储在SharePrefrence(Android)和UserDefaults(iOS)中。 - Kashif Ahmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接