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



如何在iOS 10中从new xCode 8Swift 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()
    }
}

这里我得到了token,但我得到了以下错误

Cannot invoke initializer for type 'UnsafePointer<CChar>' with an argument list of type '(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)
}
谁能帮我解决这个问题?

这个方法可以解决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)
}
var pushToken = String(format: "%@", deviceToken as CVarArg)
pushToken = pushToken.trimmingCharacters(in: CharacterSet(charactersIn: "<>"))
pushToken = pushToken.replacingOccurrences(of: " ", with: "")

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

一行:

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

从本教程。

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

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

然后你可以这样做:

let token = deviceToken.string

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

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

下面的代码是Eric Aya的解决方案:

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

谢谢大家的帮助

获取推送通知令牌的工作代码- iOS 11及以上版本,Swift 4

请求用户权限

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        
}

获取设备令牌

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print(token) 
}

出错

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("i am not available in simulator (error)")
}

它可以工作:

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

谢谢!

Mixpanel库代码

    let tokenChars = (deviceToken as NSData).bytes.assumingMemoryBound(to: CChar.self)
    var tokenString = ""
    for i in 0..<deviceToken.count {
        tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }

由于您可能在不同的方法(如firebase, web engage, branch等)中需要此令牌,因此您可以使用自定义类从包含datastring的数据中初始化APNS

public class APNS {
    public init(deviceToken data: Data) {
        self.data = data
        self.string = data.map { data in String(format: "%02.2hhx", data) } .joined()
    }
    public let data: Data
    public let string: String
}

那么你可以在任何你需要的地方使用它:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = APNS(deviceToken: deviceToken)
    print(token.string)
}

最新更新