UILocalNotification toutes les 30 secondes

UILocalNotification de configurer un UILocalNotification pour courir toutes les 30 secondes en utilisant la logique suivante, mais il semble se conduire mal. Il y a 2 problèmes:

  1. Lorsque les notifications sont renvoyées, il semble y en avoir beaucoup à la fois, plutôt que 1 toutes les 30 secondes.
  2. Le numéro de badge d'icône d'application ne semble pas augmenter. Il rest juste à 1.

S'il vous plaît, quelqu'un peut-il m'aider à déterminer ce que j'ai fait de mal?

 // Create 'base' notification we can use UILocalNotification *baseNotification = [[UILocalNotification alloc] init]; baseNotification.timeZone = [NSTimeZone defaultTimeZone]; baseNotification.repeatInterval = NSMinuteCalendarUnit; baseNotification.alertBody = @"My Message."; baseNotification.alertAction = @"My Alert Action"; baseNotification.soundName = UILocalNotificationDefaultSoundName; UILocalNotification *alertOne = [baseNotification copy]; alertOne.applicationIconBadgeNumber++; alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; [[UIApplication sharedApplication] scheduleLocalNotification:alertOne]; UILocalNotification *alertTwo = [baseNotification copy]; alertTwo.applicationIconBadgeNumber++; alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60]; [[UIApplication sharedApplication] scheduleLocalNotification:alertTwo]; 

Il n'y a actuellement aucun moyen possible de réaliser des répétitions personnalisées avec des intervalles.

Toutefois, le système de notification peut mettre en queue jusqu'à 64 notifications. La solution la plus proche consiste à définir manuellement autant de notifications que vous le souhaitez (avec un numéro différent pour le badge et un autre fireDate). mis à jour en définissant de nouveaux lorsque vous êtes à court d'eux.

Cela renverra le nombre de notifications que vous avez en queue:

 [[[UIApplication sharedApplication] scheduledLocalNotifications] count] 

Il y a aussi ce post que je vous recommand de lire pour plus d'aide:

Mise à jour en direct du numéro de badge iOS

Bonne chance!

Essaye celui-là.

 UILocalNotification *baseNotification = [[UILocalNotification alloc] init]; baseNotification.timeZone = [NSTimeZone defaultTimeZone]; baseNotification.repeatInterval = NSMinuteCalendarUnit; baseNotification.alertBody = @"My Message."; baseNotification.alertAction = @"My Alert Action"; baseNotification.soundName = UILocalNotificationDefaultSoundName; UILocalNotification *alertOne = [baseNotification copy]; alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; alertOne.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1; UILocalNotification *alertTwo = [baseNotification copy]; alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60]; alertTwo.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1; 

En ce qui concerne le deuxième point, vous augmentez le numéro de badge de la copy et non la notification d'origine. Et puisque l'original a un numéro de badge nul, vous aurez toujours une copy avec le numéro de badge zéro et l'augmenter le fera toujours 1.

La solution consiste à augmenter le badge de la notification d'origine juste avant de faire la copy:

 ... baseNotification.applicationIconBadgeNumber++; UILocalNotification *alertOne = [baseNotification copy]; alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; [[UIApplication sharedApplication] scheduleLocalNotification:alertOne]; baseNotification.applicationIconBadgeNumber++; UILocalNotification *alertTwo = [baseNotification copy]; alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60]; [[UIApplication sharedApplication] scheduleLocalNotification:alertTwo]; 

Selon la reference de class NSObject:

copy – Retourne l'object renvoyé par copyWithZone:

Et copyWithZone renvoie une copy superficielle. Donc c'est comme toutes les notifications ont les mêmes propriétés. Par conséquent, le numéro de badge est toujours "1" et le paramètre fireDate est identique pour toutes les notifications. c'est-à-dire le dernier que vous appliquez. Par conséquent, les notifications sont déclenchées en même time.

J'espère que cela aide.

Je pense que vous recevez beaucoup de notifications toutes les 30 secondes parce que vous n'avez pas annulé les notifications précédentes. Ajoutez cette ligne en haut de votre code.

 [[UIApplication sharedApplication] cancelAllLocalNotifications];