Ответ 1
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print(token)
}
Я только что обновил с 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
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print(token)
}
У меня была та же проблема. Это мое решение:
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)
}
Вот мое расширение Swift 3 для получения шестнадцатеричной строки с кодировкой base-16:
extension Data {
var hexString: String {
return map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
}
}
Маркер устройства никогда не был строкой и, конечно же, не кодированной кодировкой UTF-8. Это данные. Это 32 байта непрозрачных данных.
Единственным допустимым способом преобразования непрозрачных данных в строку является его кодирование - обычно через кодировку base64.
В Swift 3/iOS 10 просто используйте метод Data base64EncodedString(options:)
.
Попробуйте следующее:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = String(data: deviceToken.base64EncodedData(), encoding: .utf8)?.trimmingCharacters(in: CharacterSet.whitespaces).trimmingCharacters(in: CharacterSet(charactersIn: "<>"))
}
попробуйте это
if #available(iOS 10.0, *) {
let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
}
Swift 3
Самый лучший и простой способ.
deviceToken.base64EncodedString()
Этот не был указан как официальный ответ (видел это в комментарии), но это то, что я в конечном итоге сделал, чтобы вернуть мой токен в порядок.
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: "")
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.map({ String(format: "%02.2hhx", $0)}).joined()
print("TOKEN: " + token)
}
Я только что сделал это,
let token = String(format:"%@",deviceToken as CVarArg).components(separatedBy: CharacterSet.alphanumerics.inverted).joined(separator: "")
он дал результат такой же, как,
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
Получить маркер устройства с соответствующим форматом.
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)
}
В Swift 4.2 вы можете попробовать с этим кодом
приложение func (_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {print (deviceToken)//печатает print '32BYTES' (String (data: deviceToken, кодировка:.utf8) как любое)
let deviceToken = NSData(data: deviceToken)
print(deviceToken)
}