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
}

Ответ 1

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

Ответ 2

У меня была та же проблема. Это мое решение:

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

Ответ 3

Вот мое расширение Swift 3 для получения шестнадцатеричной строки с кодировкой base-16:

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

Ответ 4

Маркер устройства никогда не был строкой и, конечно же, не кодированной кодировкой UTF-8. Это данные. Это 32 байта непрозрачных данных.

Единственным допустимым способом преобразования непрозрачных данных в строку является его кодирование - обычно через кодировку base64.

В Swift 3/iOS 10 просто используйте метод Data base64EncodedString(options:).

Ответ 5

Попробуйте следующее:

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

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

Ответ 6

попробуйте это

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

Ответ 7

Swift 3

Самый лучший и простой способ.

deviceToken.base64EncodedString()

Ответ 8

Этот не был указан как официальный ответ (видел это в комментарии), но это то, что я в конечном итоге сделал, чтобы вернуть мой токен в порядок.

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: "")

Ответ 9

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

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


}

Ответ 10

Я только что сделал это,

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

он дал результат такой же, как,

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

Ответ 11

Получить маркер устройства с соответствующим форматом.

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

Ответ 12

В Swift 4.2 вы можете попробовать с этим кодом

приложение func (_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {print (deviceToken)//печатает print '32BYTES' (String (data: deviceToken, кодировка:.utf8) как любое)

    let deviceToken = NSData(data: deviceToken)
    print(deviceToken) 


}