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, podía simplemente 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 de nuevo a NSData y veo los resultados esperados. Así que ahora estoy confundido acerca del 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
}
NSData
simplemente imprime eldescription
deNSData
. Todavía no obtienes una cadena de eso.Respuestas:
fuente
%02x
también está bien.%02.2hhx
y%02x
nshipster.com/apns-device-tokens/#overturned-in-ios-13Yo tuve el mismo problema. Esta es mi solucion:
fuente
NSData
en una cadena. Sugerí usar la codificación base64 en mi respuesta. Esto usa codificación base16.Aquí está mi extensión Swift 3 para obtener una cadena hexadecimal codificada en base 16:
fuente
El token del dispositivo nunca ha sido una cadena y, desde luego, tampoco una cadena codificada en 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:)
método.fuente
NSData
oData
no importa. Los bytes de los datos no son y nunca han sido una cadena. La documentación establece claramente que es un conjunto de datos opaco. El hecho de que tu código solía funcionar es suerte. Siempre fue la forma incorrecta de manejarlo. Simplemente convierta los datos en una cadena codificando en base64 los datos. Esa es la solución adecuada ahora y antes.Prueba esto:
fuente
prueba esto
fuente
La mejor y más sencilla forma.
fuente
Esta no se declaró como una respuesta oficial (la vi en un comentario), pero es lo que finalmente hice para volver a poner mi token en orden.
fuente
as NSData
allí. cuando pones como NSData, no los datos devolverán el valor correcto incluso en iOS 10fuente
Acabo de hacer esto,
dio el mismo resultado que,
fuente
Obtenga el token del dispositivo con el formato adecuado.
fuente