ios ios8

Obtén el token del dispositivo en iOS 8



ios8 (7)

Necesito el token del dispositivo para implementar la notificación de inserción en mi aplicación.
¿Cómo puedo obtener el token del dispositivo desde que el método didRegisterForRemoteNotificationsWithDeviceToken no funciona en iOS 8. didRegisterForRemoteNotificationsWithDeviceToken este código en el delegado de la aplicación pero no me da el token del dispositivo?

[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; [[UIApplication sharedApplication] registerForRemoteNotifications];


Lea el código en UIApplication.h.

Sabrás cómo hacer eso.

Primero:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

agregar código como este

#ifdef __IPHONE_8_0 //Right, that is the point UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert) categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; #else //register to receive notifications UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound; [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes]; #endif

Si no usa Xcode 5 y Xcode 6 , intente este código

if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert) categories:nil]; [application registerUserNotificationSettings:settings]; } else { UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound; [application registerForRemoteNotificationTypes:myTypes]; }

(Gracias por el recordatorio de @zeiteisen @dmur)

Segundo:

Añadir esta función

#ifdef __IPHONE_8_0 - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { //register to receive notifications [application registerForRemoteNotifications]; } - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler { //handle the actions if ([identifier isEqualToString:@"declineAction"]){ } else if ([identifier isEqualToString:@"answerAction"]){ } } #endif

Y tu puedes conseguir el dispositivoToken en

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

Si aún no funciona, use esta función y NSLog el error

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error


Agregando una pequeña validación a la respuesta de @ Madao en caso de que tenga fallas en versiones anteriores de iOS:

#ifdef __IPHONE_8_0 if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; } #endif UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeNewsstandContentAvailability; [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];

Lo que hace la macro __IPHONE_8_0 es solo permitirle compilar en versiones anteriores de xCode / iOS, no recibe advertencias ni errores de compilación, pero ejecutar el código en dispositivos con iOS 7 o inferior causará un bloqueo.


Aparte del resto de las respuestas condescendientes a esta pregunta, la razón más probable de que este problema pueda ocurrir para un desarrollador informado que haya implementado todos los métodos de delegado requeridos es que están usando un perfil de aprovisionamiento de comodines (¿por qué no lo haría? ¡Es tan fácil crear y probar aplicaciones de desarrollo!)

En este caso, probablemente verá el error Error Domain=NSCocoaErrorDomain Code=3000 "no valid ''aps-environment'' entitlement string found for application"

Para probar las notificaciones, debe volver al año 2000 y más tarde, iniciar sesión en developer.apple.com y configurar su perfil de aprovisionamiento específico de la aplicación con las notificaciones push habilitadas.

  1. Cree una ID de aplicación correspondiente al identificador de paquete de su aplicación. Asegúrate de marcar "notificaciones push" (actualmente la segunda opción desde la parte inferior).
  2. Cree un perfil de aprovisionamiento para esa ID de aplicación.
  3. Repase el resto de los horribles pasos de aprovisionamiento que a todos nos encantaría olvidar.
  4. ?
  5. ¡Lucro!

Aquí está la solución.

en applicationDidFinishLaunchingWithOptions:

{ UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings]; } - (void)application:(UIApplication*)application didRegisterUserNotificationSettings:(nonnull UIUserNotificationSettings *)notificationSettings { [application registerForRemoteNotifications]; } - (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(nonnull NSError *)error { NSLog(@" Error while registering for remote notifications: %@", error); } - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(nonnull NSData *)deviceToken { NSLog(@"Device Token is : %@", deviceToken); }


En su cuenta de desarrollador, asegúrese de tener sus notificaciones push configuradas correctamente en su ID de aplicación y luego necesita volver a generar y descargar su perfil de aprovisionamiento. Mi problema era que había descargado el perfil de aprovisionamiento pero xcode estaba ejecutando el incorrecto. Para solucionar este problema, diríjase a la Configuración de creación de destino, desplácese hacia abajo hasta la Firma de código, en la sección de perfil de aprovisionamiento, asegúrese de utilizar el perfil de aprovisionamiento correcto que coincida con el nombre que generó (debería haber un menú desplegable con opciones si han instalado más de uno).


La respuesta de @madoa es absolutamente correcta. Solo tenga en cuenta que no está funcionando en el simulador .

En este caso

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error

se llama con un error REMOTE_NOTIFICATION_SIMULATOR_NOT_SUPPORTED_NSERROR


Para obtener el token del dispositivo en iOS8 +

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //This code will work in iOS 8.0 xcode 6.0 or later if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } else { [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeNewsstandContentAvailability| UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; } return YES; } - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { NSString* deviceToken = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""] stringByReplacingOccurrencesOfString: @" " withString: @""] ; NSLog(@"Device_Token -----> %@/n",deviceToken); }