Я только что обновился с 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
}
NSData
просто печатаетdescription
изNSData
. Вы по-прежнему не получаете ни строчки из этого.Ответы:
источник
%02x
тоже хорошо.%02.2hhx
и%02x
nshipster.com/apns-device-tokens/#overturned-in-ios-13У меня такая же проблема. Это мое решение:
источник
NSData
в строку. В своем ответе я предложил использовать кодировку base64. Используется кодировка base16.Вот мое расширение Swift 3 для получения шестнадцатеричной строки в кодировке base-16:
источник
Маркер устройства никогда не был строкой и уж тем более строкой в кодировке UTF-8. Это данные. Это 32 байта непрозрачных данных.
Единственный допустимый способ преобразовать непрозрачные данные в строку - это закодировать их - обычно с помощью кодировки base64.
В Swift 3 / iOS 10 просто используйте этот
Data base64EncodedString(options:)
метод.источник
NSData
илиData
это не имеет значения. Байты данных не являются и никогда не были строкой. В документации четко указано, что это непрозрачный набор данных. Тот факт, что ваш код работал, - это удача. Это всегда был неправильный способ справиться с этим. Просто преобразуйте данные в строку, кодируя данные base64. Это подходящее решение сейчас и раньше.Попробуй это:
источник
попробуй это
источник
Самый лучший и простой способ.
источник
Этот ответ не был заявлен как официальный (видел его в комментарии), но именно это я в конечном итоге сделал, чтобы вернуть свой токен в порядок.
источник
as NSData
. когда вы укажете NSData not Data, вернет правильное значение даже на iOS 10источник
Я только что сделал это,
результат был таким же, как,
источник
Получите токен устройства в правильном формате.
источник