Las notifications locales no funcionan en el dispositivo pero funcionan en el simulador

He leído algunas guías sobre cómo usar UILocalNotification . Entonces, he intentado y no he tenido éxito desde mi primer bash. Para registrar notifications en AppDelegate.m, uso:

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... //if it is iOS 8 if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge|UIUserNotificationTypeAlert|UIUserNotificationTypeSound) categories:nil]; [application registerUserNotificationSettings:settings]; } else // if iOS 7 { UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound; [application registerForRemoteNotificationTypes:myTypes]; } UILocalNotification *locationNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; if (locationNotification) { // Set icon badge number to zero application.applicationIconBadgeNumber = 0; } return YES; } 

y recibir una notificación cuando la aplicación se está ejecutando :

  - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { NSLog(@"notification recieved %@",notification.alertBody); // NSLog(@"notification userinfo %@",notification.userInfo); UIApplicationState state = [application applicationState]; if (state == UIApplicationStateActive) { NSLog(@"notification finetworking in foreground"); UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Notification!" message:notification.alertBody delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [message show]; } else if (state == UIApplicationStateInactive){ NSLog(@"notification finetworking in inactive"); } else if (state == UIApplicationStateBackground){ NSLog(@"notification finetworking in background"); } } 

Y todo está bien en el simulador y también en el dispositivo: cuando la aplicación se está ejecutando, recibo mi notificación descartada. Pero necesito recibir notifications cuando la aplicación no se está ejecutando, es decir, cuando la aplicación está inactiva (inicio presionado una vez)

El problema es que si borro mi notificación al presionar el button, por ejemplo, lo obtendré sin ningún problema y se mostrará en el centro de notifications y la insignia se agregará en el icono de mi aplicación como desee. Pero quiero recibir una notificación solo cuando AFNetworking mi tarea AFNetworking .

Para configurar la notificación utilizo el siguiente método:

  -(void)getProgress{ [[UIApplication shanetworkingApplication] setNetworkActivityIndicatorVisible:YES]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; NSString *token = [defaults objectForKey:@"token"]; NSString *header = [NSString stringWithFormat:@"Bearer %@",token]; NSDictionary *params = @{@"lang": @"en",@"project":projId}; manager.responseSerializer = [AFJSONResponseSerializer serializer]; [manager.requestSerializer setValue:header forHTTPHeaderField:@"Authorization"]; [manager POST:@"http://example.com/api/get-progress" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { if ([[responseObject objectForKey:@"result"]isEqualToString:@"success"]){ progCreate = [responseObject objectForKey:@"progress"]; if ([progCreate intValue]==100){ //shedule notification for immediately showing UILocalNotification* localNotification = [[UILocalNotification alloc] init]; localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:0]; localNotification.alertBody = [NSString stringWithFormat:@"Notification text!"]; localNotification.alertAction = @"Show"; localNotification.timeZone = [NSTimeZone defaultTimeZone]; localNotification.applicationIconBadgeNumber = [[UIApplication shanetworkingApplication] applicationIconBadgeNumber] + 1; [localNotification setSoundName:UILocalNotificationDefaultSoundName]; [[UIApplication shanetworkingApplication] scheduleLocalNotification:localNotification]; // [[UIApplication shanetworkingApplication]presentLocalNotificationNow:localNotification]; the same result as above } } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [[UIApplication shanetworkingApplication] setNetworkActivityIndicatorVisible:NO]; NSLog(@"Error: %@", error); }]; } 

El problema principal es que este método funciona solo en el simulador con la versión 8.0 de iOS y no funciona en el iPhone 4 con iOS 7.1.1 y el iPhone 5c con iOS 8.1.2. Tampoco funciona en el simulador con iOS 7.1. En dispositivos reales y simuladores con iOS 7.1+, nunca me he notado acerca de la recepción de notifications en segundo plano y solo puedo getlas si abro la aplicación (entonces me muestra alerta como la puse en AppDelegate.m ). Me alegraré cualquier sugerencia y cualquier ayuda.

Veo que estás usando Objective-C. Teniendo en count que se hizo esta pregunta hace un año, es probable que ya hayas descubierto esto o ahora estás usando Swift 2.0. Tuve el mismo problema y pude resolverlo con Swift 2.0 agregando el siguiente código.

AppDelegate.swift :

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)) application.beginBackgroundTaskWithName("showNotification", expirationHandler: nil) return true } 

Puedes ver mi respuesta completa aquí .

El hecho de que reciba la notificación en iOS 8.0+ Simulator es una limitación del time de ejecución de iOS Simulator. En el dispositivo, cuando su aplicación está en segundo plano, no se está ejecutando, la tarea se suspende. En el simulador de iOS, la tarea continúa ejecutándose en segundo plano.

A veces no recibimos notificación local al instante, pero después de 1 hora casi recibo la notificación. Entonces, espere un momento en particular y vuelva a verificar.