获取推送通知令牌 - iOS 10,Swift 3

use*_*098 19 notifications push-notification swift3 ios10

如何从iOS 10中的新xCode 8,Swift 3获取设备令牌?

这里注册通知的代码:

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

        DispatchQueue.main.async {
            let settings = UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil)
            UIApplication.shared.registerUserNotificationSettings(settings)
        }
        return true
    }

func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {
        if notificationSettings.types != UIUserNotificationType() {
            application.registerForRemoteNotifications()
        }
    }
Run Code Online (Sandbox Code Playgroud)

这里得到令牌,但是我收到错误"无法使用类型'(UnsafeRawPointer)'"的参数列表调用类型'UnsafePointer'的初始化程序:":

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let chars = UnsafePointer<CChar>((deviceToken as NSData).bytes)
        var token = ""

        for i in 0..<deviceToken.count {
            token += String(format: "%02.2hhx", arguments: [chars[i]])
        }

        print("Registration succeeded!")
        print("Token: ", token)
    }
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮忙解决它吗?

谢谢

chi*_*hah 34

此方法可以解决您在iOS 10及更高版本中的问题:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    var token = ""
    for i in 0..<deviceToken.count {
        token = token + String(format: "%02.2hhx", arguments: [deviceToken[i]])
    }
    print(token)
}
Run Code Online (Sandbox Code Playgroud)


小智 11

var pushToken = String(format: "%@", deviceToken as CVarArg)
pushToken = pushToken.trimmingCharacters(in: CharacterSet(charactersIn: "<>"))
pushToken = pushToken.replacingOccurrences(of: " ", with: "")
Run Code Online (Sandbox Code Playgroud)


Eti*_*tin 5

Swift 3示例来自raywenderlich.com.

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
    let tokenParts = deviceToken.map { data -> String in
        return String(format: "%02.2hhx", data)
    }  
    let token = tokenParts.joined()
    print(token)
}
Run Code Online (Sandbox Code Playgroud)


Sco*_*des 5

一条线:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let apnsDeviceToken = deviceToken.map {String(format: "%02.2hhx", $0)}.joined()
}
Run Code Online (Sandbox Code Playgroud)

从本教程。

或者模块化/封装/OOP方式:

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

然后你可以这样做:

let token = deviceToken.string
Run Code Online (Sandbox Code Playgroud)