Estoy trabajando en notificaciones automáticas. Escribí el siguiente código para obtener un token de dispositivo.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// Add the view controller's view to the window and display.
[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];
NSLog(@"Registering for push notifications...");
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
return YES;
}
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
NSLog(@"This is device token%@", deviceToken);
}
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSString *str = [NSString stringWithFormat: @"Error: %@", err];
NSLog(@"Error %@",err);
}
Puedo ejecutar la aplicación en el dispositivo correctamente, pero no puedo obtener la identificación del dispositivo en la consola.
No tengo problemas con la certificación y los perfiles de aprovisionamiento.
Respuestas:
NOTA: La siguiente solución ya no funciona en dispositivos iOS 13+; devolverá datos basura .
En su lugar, utilice el siguiente código:
+ (NSString *)hexadecimalStringFromData:(NSData *)data { NSUInteger dataLength = data.length; if (dataLength == 0) { return nil; } const unsigned char *dataBuffer = (const unsigned char *)data.bytes; NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)]; for (int i = 0; i < dataLength; ++i) { [hexString appendFormat:@"%02x", dataBuffer[i]]; } return [hexString copy]; }
Solución que funcionó antes de iOS 13:
C objetivo
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]]; token = [token stringByReplacingOccurrencesOfString:@" " withString:@""]; NSLog(@"this will return '32 bytes' in iOS 13+ rather than the token", token); }
Swift 3.0
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) print("this will return '32 bytes' in iOS 13+ rather than the token \(tokenString)") }
fuente
Para obtener Token Device, puede seguir algunos pasos :
1) Habilite APNS (Apple Push Notification Service) tanto para la Certificación de desarrollador como para la Certificación de distribución, luego vuelva a descargar esos dos archivos.
2) Vuelva a descargar el archivo de aprovisionamiento de desarrollador y de aprovisionamiento distribuido.
3) En la interfaz Xcode: la configuración del aprovisionamiento para PROJECT y TARGETS con dos archivos de aprovisionamiento tiene descarga.
4) Finalmente, debe agregar el código a continuación en el archivo AppDelegate para obtener Token Device (nota: ejecutar la aplicación en el dispositivo real).
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self.window addSubview:viewController.view]; [self.window makeKeyAndVisible]; NSLog(@"Registering for push notifications..."); [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; return YES; } - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken]; NSLog(@"%@", str); } - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { NSString *str = [NSString stringWithFormat: @"Error: %@", err]; NSLog(@"%@",str); }
fuente
Usar
description
tantas de estas respuestas sugiere que es el enfoque incorrecto , incluso si lo hace funcionar, se romperá en iOS 13+.En su lugar, debe asegurarse de utilizar los datos binarios reales, no simplemente una descripción de los mismos. Andrey Gagan abordó la solución Objective C bastante bien, pero afortunadamente es mucho más simple en rápido:
Swift 4.2 funciona en iOS 13+
// credit to NSHipster (see link above) // format specifier produces a zero-padded, 2-digit hexadecimal representation let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()
fuente
Objective C para iOS 13+ , cortesía de la respuesta de Wasif Saood
Copie y pegue el código siguiente en AppDelegate.m para imprimir el token APN del dispositivo.
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSUInteger dataLength = deviceToken.length; if (dataLength == 0) { return; } const unsigned char *dataBuffer = (const unsigned char *)deviceToken.bytes; NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)]; for (int i = 0; i < dataLength; ++i) { [hexString appendFormat:@"%02x", dataBuffer[i]]; } NSLog(@"APN token:%@", hexString); }
fuente
El siguiente código se utiliza para recuperar el token del dispositivo.
// Prepare the Device Token for Registration (remove spaces and < >) NSString *devToken = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<"withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString: @" " withString: @""]; NSString *str = [NSString stringWithFormat:@"Device Token=%@",devToken]; UIAlertView *alertCtr = [[[UIAlertView alloc] initWithTitle:@"Token is " message:devToken delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease]; [alertCtr show]; NSLog(@"device token - %@",str);
fuente
description
.Y la versión Swift de la respuesta de Wasif:
Rápido 2.x
var token = deviceToken.description.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>")) token = token.stringByReplacingOccurrencesOfString(" ", withString: "") print("Token is \(token)")
Actualización para Swift 3
let deviceTokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
fuente
description
en datos binarios (vea cualquier otra respuesta)Si aún no obtiene el token del dispositivo, intente poner el siguiente código para registrar su dispositivo para la notificación automática.
También funcionará en ios8 o más.
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 if ([UIApplication respondsToSelector:@selector(registerUserNotificationSettings:)]) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeAlert|UIUserNotificationTypeSound categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } else { [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound]; } #else [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound]; #endif
fuente
A partir de iOS 13, Apple ha cambiado de
[deviceToken description]
salida. Ahora es así,{length=32,bytes=0x0b8823aec3460e1724e795cba45d22e8...af8c09f971d0dabc}
que es incorrecto para el token del dispositivo.Sugiero usar este fragmento de código para resolver un problema:
+ (NSString *)stringFromDeviceToken:(NSData *)deviceToken { NSUInteger length = deviceToken.length; if (length == 0) { return nil; } const unsigned char *buffer = deviceToken.bytes; NSMutableString *hexString = [NSMutableString stringWithCapacity:(length * 2)]; for (int i = 0; i < length; ++i) { [hexString appendFormat:@"%02x", buffer[i]]; } return [hexString copy]; }
Funcionará para iOS13 y versiones anteriores.
fuente
description
siempre fue incorrecta. Y esta es solo una posible solución para convertir el token en una cadena. Una solución mucho más simple es convertir elNSData
a unaNSString
codificación base64 estándar.Obtener token de dispositivo en Swift 3
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) print("Device token: \(deviceTokenString)") }
fuente
En su AppDelegate, en el
didRegisterForRemoteNotificationsWithDeviceToken
método:Actualizado para Swift:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { print("\(deviceToken.reduce("") { $0 + String(format: "%02.2hhx", arguments: [$1]) })") }
fuente
Swift 4 Esto funciona para mí:
Paso 1 en OBJETIVOS Haga clic en agregar capacidad y seleccione Notificaciones automáticas
Paso 2 en AppDelegate.swift agregue el siguiente código:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound]) { (didAllow, error) in } UIApplication.shared.registerForRemoteNotifications() return true } //Get device token func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) print("The token: \(tokenString)") }
fuente
En una configuración de compilación, establezca el perfil de provisión de firma de código si tiene el certificado APN Enable, definitivamente obtendrá la identificación del token. y quitar
Perfil de suministro: automático
y establecer en
Perfil de provisión: su certificado de perfil de provisión.
fuente
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenParts = deviceToken.map { data -> String in return String(format: "%02.2hhx", data) } let token = tokenParts.joined() print("Token\(token)") }
fuente
Para obtener el token del dispositivo, use el siguiente código, pero puede obtener el token del dispositivo solo usando un dispositivo físico. Si es obligatorio enviar el token del dispositivo, mientras usa el simulador, puede poner la siguiente condición.
if(!(TARGET_IPHONE_SIMULATOR)) { [infoDict setValue:[[NSUserDefaults standardUserDefaults] valueForKey:@"DeviceToken"] forKey:@"device_id"]; } else { [infoDict setValue:@"e79c2b66222a956ce04625b22e3cad3a63e91f34b1a21213a458fadb2b459385" forKey:@"device_id"]; } - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { NSLog(@"My token is: %@", deviceToken); NSString * deviceTokenString = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""] stringByReplacingOccurrencesOfString: @" " withString: @""]; NSLog(@"the generated device token string is : %@",deviceTokenString); [[NSUserDefaults standardUserDefaults] setObject:deviceTokenString forKey:@"DeviceToken"]; }
fuente