Estoy implementando notificaciones push. Me gustaría guardar mi token APNS como una cadena.
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken
{
NSString *tokenString = [NSString stringWithUTF8String:[newDeviceToken bytes]]; //[[NSString alloc]initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
NSLog(@"%@", tokenString);
NSLog(@"%@", newDeviceToken);
}
La primera línea de código imprime nulo. el segundo imprime la ficha. ¿Cómo puedo obtener mi newDeviceToken como NSString?
ios
objective-c
apple-push-notifications
nsstring
nsdata
Sheehan Alam
fuente
fuente
NSLog
, el que imprimenewDeviceToken
?Respuestas:
utilizar este :
fuente
Si alguien está buscando una manera de hacer esto en Swift:
Editar: para Swift 3
Swift 3 introduce el
Data
tipo, con semántica de valor. Para convertir eldeviceToken
en una cadena, puede hacer lo siguiente:fuente
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
qiita.com/mono0926/items/3cf0dca3029f32f54a09"%02.2hhx
?Alguien me ayudó con esto. Estoy de paso
fuente
const unsigned *tokenBytes = [deviceToken bytes]; NSMutableString *hexToken = [NSMutableString string]; for (NSUInteger byteCount = 0; byteCount * 4 < [deviceToken length]; byteCount++) { [hexToken appendFormat:@"%08x", ntohl(tokenBytes[byteCount])]; }
Important: APNs device tokens are of variable length. Do not hard-code their size.
Dice Apple.Podrías usar esto
fuente
description
.[token appendFormat:@"%02.2hhx", data[i]];
como Amazon SNS requiere minúsculas.Para aquellos que quieran en Swift 3 y el método más fácil
fuente
deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
Explicación de
%02.2hhx
en la respuesta de alta votación :%
: Presenta elx
especificador de conversión.02
: El ancho mínimo del valor convertido es 2. Si el valor convertido tiene menos bytes que el ancho del campo, se rellenará0
a la izquierda..2
: Proporciona el número mínimo de dígitos que deben aparecer para elx
especificador de conversión.hh
: Especifica que elx
especificador de conversión se aplica a un argumento con carácter firmado o sin signo (el argumento se habrá promocionado de acuerdo con las promociones de enteros, pero su valor se convertirá en carácter con signo o sin signo antes de imprimir).x
: El argumento sin signo se convertirá al formato hexadecimal sin signo en el estilo "dddd"; se usan las letras "abcdef". La precisión especifica el número mínimo de dígitos a aparecer; Si el valor que se está convirtiendo puede representarse en menos dígitos, se expandirá con ceros a la izquierda. La precisión predeterminada es 1. El resultado de convertir cero con una precisión explícita de cero no será caracteres.Para obtener más detalles, consulte la especificación IEEE printf .
Basado en la explicación anterior, creo que es mejor cambiar
%02.2hhx
a%02x
o%.2x
.Para Swift 5, los siguientes métodos son factibles:
La prueba es la siguiente:
fuente
Es mi solución y funciona bien en mi aplicación:
NSData
aNSString
constringWithFormat
fuente
-description
, por lo que no es más seguro que la respuesta aceptada.description
al dispositivo Tomado como dice jszumski.description
si lo llamas directamente o si lo usas a través de otro método, porque el formato de la cadena devuelta podría cambiarse en cualquier momento. La solución correcta está aquí: stackoverflow.com/a/16411517/108105Creo que la conversión de deviceToken a hexadecimal no tiene sentido. ¿Por qué? Lo enviará a su backend, donde se transformará de nuevo a bytes para ser enviado a APNS. Entonces, use el método de NSData
base64EncodedStringWithOptions
, empújelo al servidor y luego use datos codificados en base64 inversa :) Eso es mucho más fácil :)fuente
En iOS 13
description
se romperá, así que usa estoPara mayor claridad, analicemos esto y expliquemos cada parte:
El método de mapa opera en cada elemento de una secuencia. Como los datos son una secuencia de bytes en Swift, el cierre pasado se evalúa para cada byte en deviceToken. El inicializador String (formato :) evalúa cada byte en los datos (representados por el parámetro anónimo $ 0) utilizando el especificador de formato% 02x, para producir una representación hexadecimal de 2 dígitos con relleno de cero del byte / entero de 8 bits. Después de recopilar cada representación de byte creada por el método de mapa, join () concatena cada elemento en una sola cadena.
La descripción de no usar PS da una cadena diferente en iOS 12 e iOS 13 y no es segura según el alcance futuro. Los desarrolladores no deberían haberse basado en un formato específico para la descripción de un objeto.
Para más información lea esto .
fuente
En iOS 13, la descripción estará en un formato diferente. Utilice amablemente el siguiente código para obtener el token del dispositivo.
fuente
length
en el bucle for debe cambiarse alen
. Aparentemente un cambio demasiado pequeño para que yo pueda hacer una edición ... ¡Pero si no funciona perfectamente!Esta es una solución un poco más corta:
fuente
Versión Swift funcional
Un trazador de líneas:
Aquí hay un formulario de extensión reutilizable y auto documentable:
Alternativamente, use en
reduce("", combine: +)
lugar dejoinWithSeparator("")
ser visto como un maestro funcional por sus pares.Editar: cambié String ($ 0, radix: 16) a String (formato: "% 02x", $ 0), porque los números de un dígito necesitaban tener un cero de relleno
(Todavía no sé cómo marcar una pregunta como un duplicado de esta otra , así que acabo de publicar mi respuesta nuevamente)
fuente
2020
token como texto ...
o si lo prefieres
(el resultado es el mismo)
fuente
Lanzando mi respuesta en la pila. Evite usar el análisis de cadenas; Los documentos no garantizan que NSData.description siempre funcione de esa manera.
Implementación de Swift 3:
fuente
He intentado probar dos métodos diferentes con formato
"%02.2hhx"
y"%02x"
y el resultado es que el más rápido es
"%02x"
en promedio 2.0 vs 2.6 para la versión reducida:fuente
El uso de updateAccumulatingResult es más eficiente que los otros enfoques que se encuentran aquí, así que esta es la forma más rápida de stringificar sus
Data
bytes:fuente
Para Swift:
fuente
¿Qué pasa con la solución de una línea?
C objetivo
Rápido
fuente
Así es como lo haces en Xamarin.iOS
fuente
fuente
Rápido:
fuente
fuente
Rápido
fuente
Utilice excelente categoría!
// archivo .h
// archivo .m
@final
// AppDelegate.m
¡Funciona bien!
fuente
Swift 3:
Si alguien está buscando una forma de obtener el token del dispositivo en Swift 3. Utilice el fragmento modificado a continuación.
fuente
fuente
La solución @kulss publicada aquí, aunque carece de elegancia pero tiene la virtud de la simplicidad, ya no funciona en iOS 13, ya
description
que funcionará de manera diferente para NSData. SindebugDescription
embargo, aún puedes usarlo .fuente
Pruebe este a menos que los datos estén terminados en nulo.
NSString* newStr = [[NSString alloc] initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
fuente
fuente