我怎样才能在swift 4中获得deviceToken?

San*_*ill 1 apple-push-notifications devicetoken ios swift

我正在使用此代码获取设备令牌它在swift 3中工作但不在swift 4中工作请帮我解决它.


if #available(iOS 10.0, *) {
      let center = UNUserNotificationCenter.current()
      center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
          }
}
 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

     let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    print(deviceTokenString)
}

Ahm*_*d F 19

假设您已经检查过所有内容都已设置正确,基于您的代码,它似乎应该正常工作,您所要做的就是更改格式%02.2hhx而不是%02X获取适当的十六进制字符串.因此,你应该得到一个有效的.

作为一种好的做法,您可以将数据扩展添加到项目中以获取字符串:

import Foundation

extension Data {
    var hexString: String {
        let hexString = map { String(format: "%02.2hhx", $0) }.joined()
        return hexString
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let deviceTokenString = deviceToken.hexString
    print(deviceTokenString)
}
Run Code Online (Sandbox Code Playgroud)

  • %02.2hhx 会做什么?你能解释一下吗? (3认同)
  • 我的控件没有调用 didRegisterForRemoteNotificationsWithDeviceToken 委托。 (2认同)

Nik*_*ani 8

在iOS 11或更高版本,Swift 4中获取deviceToken的工作代码

请求用户权限

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    let notificationTypes: UIUserNotificationType = [UIUserNotificationType.alert,UIUserNotificationType.badge, UIUserNotificationType.sound]
    let pushNotificationSettings = UIUserNotificationSettings(types: notificationTypes, categories: nil)

    application.registerUserNotificationSettings(pushNotificationSettings)
    application.registerForRemoteNotifications()

    return true        
}
Run Code Online (Sandbox Code Playgroud)

获取设备令牌

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print(token) 
}
Run Code Online (Sandbox Code Playgroud)

发生错误时

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {

    print("i am not available in simulator :( \(error)")
}
Run Code Online (Sandbox Code Playgroud)