web-dev-qa-db-ja.com

Swift 3-デバイストークンは「32BYTES」として解析されるようになりました

Xcode 7から8 GMに更新し、Swift 3互換性の問題の中で、デバイストークンが機能しなくなったことに気付きました。現在は「32BYTES」のみを読み取ります。

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
    print(deviceToken) // Prints '32BYTES'
    print(String(data: deviceToken , encoding: .utf8)) // Prints nil
}

更新前は、サーバーにNSDataを送信するだけでしたが、トークンを実際に解析するのに苦労しています。

ここに何が欠けていますか?

編集:NSDataへの変換をテストしているだけで、期待どおりの結果が得られています。だから今、私はちょうど新しいデータ型について混乱しています。

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
    print(deviceToken) // Prints '32BYTES'
    print(String(data: deviceToken , encoding: .utf8)) // Prints nil

    let d = NSData(data: deviceToken)
    print(d) // Prints my device token
}
90
user1537360
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print(token)
}
183
Rok Gregorič

同じ問題がありました。これは私の解決策です:

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

16進数でエンコードされた16進文字列を取得するためのSwift 3拡張機能は次のとおりです。

extension Data {
    var hexString: String {
        return map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
    }
}
29
phatmann

デバイストークンは文字列ではなく、UTF-8でエンコードされた文字列ではありません。データです。 32バイトの不透明データです。

不透明なデータを文字列に変換する唯一の有効な方法は、それをエンコードすることです-通常はbase64エンコードを使用します。

Swift 3/iOS 10では、Data base64EncodedString(options:)メソッドを使用します。

26
rmaddy

これを試して:

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

   let token = String(data: deviceToken.base64EncodedData(), encoding: .utf8)?.trimmingCharacters(in: CharacterSet.whitespaces).trimmingCharacters(in: CharacterSet(charactersIn: "<>")) 
}
15
user

これを試して

if #available(iOS 10.0, *) {
   let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
}
8
bluenowhere

スイフト3

最良かつ最も簡単な方法。

deviceToken.base64EncodedString()
6
Maselko

これは公式の回答としては述べられていませんでした(コメントで見ました)が、最終的にトークンを正常に戻すためにやったことです。

let tokenData = deviceToken as NSData
let token = tokenData.description

// remove any characters once you have token string if needed
token = token.replacingOccurrences(of: " ", with: "")
token = token.replacingOccurrences(of: "<", with: ""
token = token.replacingOccurrences(of: ">", with: "")
4
Bill Burgess
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    let token = deviceToken.map({ String(format: "%02.2hhx", $0)}).joined()
     print("TOKEN: " + token)


}
4
PacoG

私はちょうどこれをやった、

let token = String(format:"%@",deviceToken as CVarArg).components(separatedBy: CharacterSet.alphanumerics.inverted).joined(separator: "")

それは同じ結果を与えました、

let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
3
satheeshwaran

適切な形式のデバイストークンを取得します。

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 
{
            var formattedToken = ""
            for i in 0..<deviceToken.count {
                formattedToken = formattedToken + String(format: "%02.2hhx", arguments: [deviceToken[i]])
            }
            print(formattedToken)
}
0
Basir Alam