provisional identifiers certificates apple and ios xcode push-notification apple-push-notifications provisioning-profile

ios - identifiers - provisioning portal apple



didRegisterForRemoteNotificationsWithDeviceToken nunca llamado en un dispositivo especĂ­fico (4)

En primer lugar, estoy en iPhone 6 Plus / iOS 8.1 y lo he intentado todo aquí: ¿por qué no se llama a RegistrarParaRotirarNotificacionesConDispositivoToken?

Todavía no sirve de nada. Para resumir:

  • He comprobado que mi identificador de paquete coincide con el del perfil de aprovisionamiento / portal de desarrollo
  • He creado un nuevo certificado de desarrollo APNS
  • He creado un nuevo certificado de desarrollo.
  • He creado un nuevo perfil de aprovisionamiento para ese certificado de desarrollo
  • He descargado tanto el certificado como el perfil de aprovisionamiento y, obviamente, hice doble clic en ellos para instalarlos.
  • He comprobado que todo está correcto en el Portal de desarrollador: todos los certificados y perfiles de aprovisionamiento son válidos, se habilitan de forma automática y están configurados con mi nuevo certificado APNS
  • He cargado mi nuevo certificado APNS en Parse (es irrelevante en este paso, pero de todos modos) ya que estoy usando Parse para mi backend
  • Me he asegurado de que estoy usando el par de perfil de aprovisionamiento / certificado correcto en Xcode para codificar
  • He comprobado la configuración de las notificaciones en caso de que mi aplicación no tenga permiso para recibir notificaciones, no está allí
  • He intentado establecer la fecha manualmente para mañana y he intentado volver a instalar la aplicación
  • He eliminado la aplicación de mi dispositivo
  • He eliminado todos los perfiles de aprovisionamiento relacionados de mi dispositivo
  • He reiniciado mi dispositivo varias veces

En application:didFinishLaunchingWithOptions: llamo:

if([application respondsToSelector:@selector(registerUserNotificationSettings:)]){ //iOS 8+ [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; }else{ //pre-iOS 8 [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; }

En application:didRegisterUserNotificationSettings: llamo:

[application registerForRemoteNotifications];

Lo he comprobado con un punto de interrupción, se llama. También he implementado dos métodos:

application:didRegisterForRemoteNotificationsWithDeviceToken:

y

application:didFailToRegisterForRemoteNotificationsWithError:

Sin embargo, ninguno de ellos es llamado. No es un error, nada. No hay error en la consola tampoco. (He tenido un problema con los derechos anteriores hoy, pero al crear un nuevo perfil de aprovisionamiento / certificado se solucionó)

¿Cual podría ser el problema?

ACTUALIZACIÓN: Aquí hay algo. En la application:didRegisterUserNotificationSettings: he comprobado la configuración de notificación y esto es lo que tengo:

(lldb) po notificationSettings <UIUserNotificationSettings: 0x170031cc0; types: (none);>

ACTUALIZACIÓN 2: Revisé las notificaciones nuevamente y descubrí que ahora mi aplicación se agrega a las notificaciones en Configuración, está habilitada, dados los permisos. Pero aún así, el manejador no se llama. Los tipos son ninguno. Estoy 99% seguro de que está relacionado con el problema.

ACTUALIZACIÓN 3: Lo he probado en otro dispositivo (iPod touch, iOS 8.1) y no tengo problemas allí. Inmediatamente llamó a la application:didRegisterForRemoteNotificationsWithDeviceToken: método con su token. El problema es específico de mi iPhone.


Me pidieron que depurara un comportamiento similar en una aplicación de clientes, bajo iOS9.

Resulta que la aplicación estaba llamando a registerUserNotificationSettings y registerForRemoteNotifications desde la appDelegate como es común.

Sin embargo, también lo estaba haciendo por segunda vez poco después en un control de permisos posterior.

Si un usuario rechazó la solicitud resultante de appDelegate, los intentos subsiguientes para permitir notificaciones después de que un usuario hubiera visto una justificación para permitirlo (las segundas llamadas desde el controlador de control de permisos) se configuraron con tipos establecidos en cero igual que las llamadas appDelegate.

Eliminando las llamadas iniciales a appDelegate y teniendo solo los permisos presentes en el controlador, resolví esto.


Otra cosa para verificar es el estado del sistema de APNS en Apple https://developer.apple.com/system-status/ .

Me estaba arrancando el pelo preguntándome por qué no podía registrar mi dispositivo mientras el sistema APNS estaba "experimentando problemas".


Tengo un problema similar, el código ya estaba implementado y funcionaba bien. De repente, después de algunos ajustes, simplemente ya no funciona.

El escenario que se ejecutaba en el dispositivo era:

  • Llame a registerForRemoteNotifications en didFinishLaunchingWithOptions .
  • El didRegisterForRemoteNotificationsWithDeviceToken no llamará
  • ni didFailToRegisterForRemoteNotificationsWithError no llamará.

Lo intenté todo, casi reinicié todas las configuraciones, certificados y perfiles de aprovisionamiento, etc. Todos los dispositivos con la última versión funcionaban, pero cuando instalo la nueva versión, simplemente ya no funciona.

Para resolver esto, acabo de hacer esto:

  1. Fue a las capacidades de destino;
  2. Apague la notificación de inserción ;
  3. Crea y ejecuta la aplicación en el dispositivo y espera;
  4. Deja de ejecutar la aplicación;
  5. Vuelva a activar la notificación de inserción .
  6. Crea y ejecuta la aplicación en el dispositivo;
  7. Y como la magia, funcionó de nuevo.

Después de 6h peleando con Xcode, esa fue mi solución, sin ninguna explicación.

Espero que esto ayude a alguien.


intente usar esto: (funciona bien), la pila apesadumbrada no parece formatear tan bien

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { NSLog(@"iOS 8 Requesting permission for push notifications..."); // iOS 8 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes: UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [UIApplication.sharedApplication registerUserNotificationSettings:settings]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } else { NSLog(@"iOS 7 Registering device for push notifications..."); // iOS 7 and earlier [UIApplication.sharedApplication registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound]; } return YES; } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { UIApplicationState state = [application applicationState]; if (state == UIApplicationStateActive) { NSLog(@"received a notification while active..."); } else if ( application.applicationState == UIApplicationStateInactive || application.applicationState == UIApplicationStateBackground ) { //opened from a push notification when the app was on background NSLog(@"i received a notification..."); NSLog(@"Message: %@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]); NSLog(@"whole data: %@",userInfo); } } - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { self.token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]]; self.token = [self.token stringByReplacingOccurrencesOfString:@" " withString:@""]; [[NSUserDefaults standardUserDefaults] setObject:self.token forKey:@"deviceToken"]; [[NSUserDefaults standardUserDefaults] synchronize]; NSLog(@"-->> TOKEN:%@",self.token); } - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{ NSLog(@"Registering device for push notifications..."); // iOS 8 [application registerForRemoteNotifications]; } - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)notification completionHandler:(void(^)())completionHandler { NSLog(@"Received push notification: %@, identifier: %@", notification, identifier); // iOS 8 s completionHandler(); } - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { // Respond to any push notification registration errors here. NSLog(@"Failed to get token, error: %@", error); }