CrossBridge Lab

技術ネタ、デバイスネタを...

【Swift3】Swift3でプッシュ通知のデバイストークンを文字列にする

 iOSのPUSH通知のDeviceTokenを文字列(NSString / String)に変換するには単純に以下のようにはいきませんでした。

var token: String = NSString(data:deviceToken, encoding:NSUTF8StringEncoding)

 なのでSwift2.3までは以下のように受け取ったDatadescriptionを取得して<>と空白を取り除くというアクロバティックな方法を取っていました。

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    var characterSet: NSCharacterSet = NSCharacterSet( charactersInString: "<>" )  
    var token: String = ( deviceToken.description as NSString )
        .stringByTrimmingCharactersInSet( characterSet )
        .stringByReplacingOccurrencesOfString( " ", withString: "" ) as String
        print(token)
}

 が!Swift3で同じように変換しようとすると32 bytesという素敵な文字列になってしまいます。descriptionで帰ってくる文字列が変わったってことですね。そもそも変則的な方法でしたがSwift3では以下の方法でに文字列に変換することができます。

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