ios - programming - Swift 3: los tokens de dispositivo ahora se analizan como ''32BYTES''
xcode (11)
Swift 3
La mejor y más fácil manera.
deviceToken.base64EncodedString()
Acabo de actualizar de Xcode 7 a 8 GM y, en medio de los problemas de compatibilidad de Swift 3, noté que los tokens de mi dispositivo dejaron de funcionar. Ahora solo leen ''32BYTES''.
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
print(deviceToken) // Prints ''32BYTES''
print(String(data: deviceToken , encoding: .utf8)) // Prints nil
}
Antes de la actualización, simplemente podía enviar el NSData a mi servidor, pero ahora estoy teniendo dificultades para analizar el token.
¿Que me estoy perdiendo aqui?
Editar: solo estoy probando la conversión a NSData y veo los resultados esperados. Así que ahora estoy confundido sobre el nuevo tipo de datos.
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
}
Acabo de hacer esto
let token = String(format:"%@",deviceToken as CVarArg).components(separatedBy: CharacterSet.alphanumerics.inverted).joined(separator: "")
dio el resultado igual que,
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
Aquí está mi extensión Swift 3 para obtener una cadena hexadecimal codificada en base 16:
extension Data {
var hexString: String {
return map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
}
}
El token del dispositivo nunca ha sido una cadena y ciertamente no es una cadena codificada UTF-8. Son datos. Son 32 bytes de datos opacos.
La única forma válida de convertir los datos opacos en una cadena es codificarlos, comúnmente a través de una codificación base64.
En Swift 3 / iOS 10, simplemente use el
Data base64EncodedString(options:)
.
Esta no se indicó como respuesta oficial (lo vi en un comentario), pero es lo que finalmente hice para que mi token vuelva a estar en orden.
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: "")
Prueba esto:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = String(data: deviceToken.base64EncodedData(), encoding: .utf8)?.trimmingCharacters(in: CharacterSet.whitespaces).trimmingCharacters(in: CharacterSet(charactersIn: "<>"))
}
Yo tuve el mismo problema. Esta es mi solución:
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)
}
prueba esto
if #available(iOS 10.0, *) {
let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
}
Obtenga el token del dispositivo con el formato adecuado.
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)
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.map({ String(format: "%02.2hhx", $0)}).joined()
print("TOKEN: " + token)
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print(token)
}