Je planifie un emplacement basé sur UILocalNotification
en cliquant sur un bouton. Mais lorsque j'essaie d'annuler la notification locale en cliquant à nouveau sur le même bouton, cela n'annule pas la notification. J'utilise UIApplication.sharedApplication().cancelLocalNotification(localNotification)
pour annuler ma notification locale basée sur l'emplacement prévu. Qu'est-ce que je fais mal ? voici ma mise en œuvre
@IBAction func setNotification(sender: UIButton!) {
if sender.tag == 999 {
sender.setImage(UIImage(named: "NotificationFilled")!, forState: .Normal)
sender.tag = 0
regionMonitor() //function where notification get scheduled
} else {
sender.setImage(UIImage(named: "Notification")!, forState: .Normal)
sender.tag = 999 }
que dois-je entrer dans le bloc else pour que la notification programmée soit annulée. Impossible d'effacer toutes les notifications. voici le code de bloc didEnterRegion
où je déclenche la notification locale
func locationManager(manager: CLLocationManager!, didEnterRegion region: CLRegion!) {
localNotification.regionTriggersOnce = true
localNotification.alertBody = "Stack Overflow is great"
UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
NSLog("Entering region")
}
Vous pouvez essayer de supprimer toutes les notifications si cela est acceptable dans votre contexte. Comme ça:
for notification in UIApplication.sharedApplication().scheduledLocalNotifications as! [UILocalNotification] {
UIApplication.sharedApplication().cancelLocalNotification(notification)
}
Ou comme indiqué par Logan:
UIApplication.sharedApplication().cancelAllLocalNotifications()
Ou comme indiqué par Gerard Grundy pour Swift 4:
UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
Solution pour iOS 10+ Swift 3.1
let center = UNUserNotificationCenter.current()
center.removeAllDeliveredNotifications() // To remove all delivered notifications
center.removeAllPendingNotificationRequests()
Vous pouvez annuler une notification en utilisant son identifiant:
let center = UNUserNotificationCenter.current()
center.removeDeliveredNotifications(withIdentifiers: [String])
center.removePendingNotificationRequests(withIdentifiers: [String])
Vous pouvez enregistrer une valeur unique pour la clé dans les informations utilisateur de votre notification locale et l'annuler en obtenant la notification locale à l'aide de la valeur de cette clé. Essayez ceci (pour l'objectif C):
NSArray *notifArray = [[UIApplication sharedApplication] scheduledLocalNotifications];
for (int i=0; i<[notifArray count]; i++)
{
UILocalNotification* notif = [notifArray objectAtIndex:i];
NSDictionary *userInfoDict = notif.userInfo;
NSString *uniqueKeyVal=[NSString stringWithFormat:@"%@",[userInfoDict valueForKey:@"UniqueKey"]];
if ([uniqueKeyVal isEqualToString:keyValToDelete])
{
[[UIApplication sharedApplication] cancelLocalNotification:notif];
break;
}
}
Pour Swift 3.0 et iOS 10:
UNUserNotificationCenter.current().removeAllDeliveredNotifications()