Les notifications locales ne fonctionnent pas sur l'appareil mais sur un simulateur

J'ai lu quelques guides sur l'utilisation de UILocalNotification . J'ai donc essayé et n'ai pas réussi depuis mon premier essai. Pour save des notifications dans AppDelegate.m, j'utilise:

  - (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; } 

et pour recevoir une notification lorsque l' application est en cours d'exécution :

  - (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 fired 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 fired in inactive"); } else if (state == UIApplicationStateBackground){ NSLog(@"notification fired in background"); } } 

Et tout va bien sur le simulateur et sur l'appareil aussi – quand l'application est en cours d'exécution, je reçois ma notification sheduled. Mais j'ai besoin de recevoir des notifications lorsque l' application ne fonctionne pas, c'est-à-dire quand l'application est inactive (accueil pressé une fois)

Le problème est que si je publie ma notification sur le button presse par exemple, je l'obtiendrai sans aucun problème et il sera affiché dans le centre de notification et le badge sera ajouté sur l'icône de mon application comme je veux. Mais je veux recevoir une notification uniquement lorsque ma tâche AFNetworking sera terminée.

Pour paramétrer la notification, j'utilise la méthode suivante:

  -(void)getProgress{ [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; NSSsortingng *token = [defaults objectForKey:@"token"]; NSSsortingng *header = [NSSsortingng ssortingngWithFormat:@"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"]isEqualToSsortingng:@"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 = [NSSsortingng ssortingngWithFormat:@"Notification text!"]; localNotification.alertAction = @"Show"; localNotification.timeZone = [NSTimeZone defaultTimeZone]; localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1; [localNotification setSoundName:UILocalNotificationDefaultSoundName]; [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; // [[UIApplication sharedApplication]presentLocalNotificationNow:localNotification]; the same result as above } } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; NSLog(@"Error: %@", error); }]; } 

Le problème principal est que cette méthode ne fonctionne que sur simulateur avec iOS 8.0 et ne fonctionne pas sur iPhone 4 avec iOS 7.1.1 et iPhone 5c avec iOS 8.1.2 elle ne fonctionne pas non plus sur simulateur avec iOS 7.1. Sur les vrais appareils et simulateur avec iOS 7.1+ je n'ai jamais été remarqué à propos de la réception de notification en arrièreplan et je peux seulement l'get si j'ouvre l'application (alors il me montre l'alerte comme je l'ai défini dans AppDelegate.m ) des suggestions et de l'aide.

Je vois que vous utilisez Objective-C. Considérant que cette question a été posée il y a un an, vous avez probablement compris ou vous utilisez maintenant Swift 2.0. J'ai eu le même problème et j'ai été capable de le résoudre avec Swift 2.0 en ajoutant le code suivant.

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 } 

Vous pouvez voir ma réponse complète ici .

Le fait que vous receviez la notification dans le simulateur iOS 8.0+ constitue une limitation de l'exécution d'iOS Simulator. Sur l'appareil, lorsque votre application est en arrière-plan, elle n'est pas en cours d'exécution, la tâche est suspendue. Dans le simulateur iOS, la tâche continue à s'exécuter en arrière-plan.

Parfois, nous ne recevons pas de notification locale instantanément, mais après 1 heure, je reçois presque notification. Alors, attendez un moment particulier puis vérifiez à nouveau.