para - Token del dispositivo Iphone-NSData o NSString
itune no reconoce el iphone (6)
Estoy recibiendo un token de dispositivo de iPhone en forma de objeto NSData
. Cuando probé mi función de script de notificaciones, solo copié ese objeto del registro y las notificaciones fueron bien. Sin embargo, cuando intento ahora hacerlo automáticamente, envío el token del dispositivo como una cadena codificada en ASCII en forma de variable
self.deviceToken = [[NSString alloc] initWithData:webDeviceToken encoding:NSASCIIStringEncoding];
La cadena que estoy recibiendo tiene algunos caracteres funky y se ve similar a esta "å-0¾fZÿ÷ʺÎUQüRáqEªfÔk«"
Cuando el script del servidor envía la notificación a ese token, no recibo nada.
¿Necesito decodificar algo y cómo?
Regardz
Encontré esta solución mejor ya que iOS puede cambiar el uso de la descripción en futuras versiones, por lo que usar la propiedad de descripción en los datos puede no ser confiable en el futuro. Podemos usar esto directamente creando un Token hexadecimal a partir de los bytes del token de datos.
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
const unsigned *tokenBytes = [deviceToken bytes];
NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
[[MyModel sharedModel] setApnsToken:hexToken];
}
También podemos almacenar el token del dispositivo en nuestros NSUserdefaults y usarlo más tarde para enviarlo a nuestro servidor.
No creo que sea una buena solución, ya que tienes que reconstruir la cadena antes de enviar las notificaciones a los servidores de Apple. Use la codificación Base64 para transmitir las cadenas o algo similar.
Ok, encontré una solución. Si alguien tiene el mismo problema, olvídate de la codificación ASCII, simplemente haz la cadena con las siguientes líneas:
NSString *deviceToken = [[webDeviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];
Otra forma de convertir el token de dispositivo en una cadena decimal hexadecimal
NSUInteger capacity = [deviceToken length] * 2;
NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:capacity];
const unsigned char *dataBuffer = [deviceToken bytes];
NSInteger i;
for (i=0; i<[deviceToken length]; ++i) {
[stringBuffer appendFormat:@"%02X", (NSUInteger)dataBuffer[i]];
}
NSLog(@"token string buffer is %@",stringBuffer);
Si alguien está buscando una manera de hacer esto en Swift:
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
var tokenString = ""
for i in 0..<deviceToken.length {
tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
}
print("tokenString: /(tokenString)")
}
Editar: para Swift 3
Swift 3 introduce el tipo de Data
, con semántica de valores. Para convertir deviceToken
en una Cadena, puede hacer lo siguiente:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
var token: String = ""
for i in 0..<deviceToken.count {
token += String(format: "%02.2hhx", deviceToken[i] as CVarArg)
}
print(token)
}
Para Swift 3:
var tokenString: String = ""
for i in 0..<deviceToken.count {
tokenString += String(format: "%02.2hhx", deviceToken[i] as CVarArg)
}
print(tokenString)
Otro método
Crear extensión de datos para obtener hexstring
extension Data {
var hexString: String {
return map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
}
}
Y llama a esta extensión
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let tokenString = deviceToken.hexString()
print("token: /(tokenString)")
}