2016-09-19 116 views
16

如何从iOS 10中的新xCode 8,Swift 3获取设备令牌?获取推送通知令牌 - iOS 10,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() 
     } 
    } 

这里获得令牌,但我得到的错误“无法引用类型‘UnsafePointer’初始化与类型的参数列表‘(UnsafeRawPointer)’” :

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) 
    } 

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

感谢

+0

http://stackoverflow.com/questions/37956482/registering-for-push-notifications-in-xcode-8-swift-3-0的可能的复制 – Moritz

+0

您可以按照目标C这个链接其但你可以得到一些想法http://stackoverflow.com/questions/39572897/ios-10-push-notification-issue-solved –

回答

11
var pushToken = String(format: "%@", deviceToken as CVarArg) 
pushToken = pushToken.trimmingCharacters(in: CharacterSet(charactersIn: "<>")) 
pushToken = pushToken.replacingOccurrences(of: " ", with: "") 
0

它可以工作:

let chars = UnsafePointer<CChar>((deviceToken as NSData).bytes.assumingMemoryBound(to:CChar.self)) 

谢谢!

26

这种方法可以解决你的问题在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) 
} 
+0

为什么downvote?请提供理由 –

1

以下snnipet正在与埃里克绫解决方案:

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

感谢所有帮助:)

3

面对的同样的问题,这是唯一帮助我的东西:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
    let token = String(format: "%@", deviceToken as CVarArg) 
     .trimmingCharacters(in: CharacterSet(charactersIn: "<>")) 
     .replacingOccurrences(of: " ", with: "") 
} 
2

斯威夫特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) 
}