web-dev-qa-db-fra.com

comment annuler une notification locale en appuyant simplement sur un bouton?

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")
}
17
sumesh

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().removeAllPendingNotificat‌​ionRequests()
47
Renan Kosicki

Solution pour iOS 10+ Swift 3.1

let center = UNUserNotificationCenter.current()
center.removeAllDeliveredNotifications() // To remove all delivered notifications
center.removeAllPendingNotificationRequests()
4

Vous pouvez annuler une notification en utilisant son identifiant:

let center = UNUserNotificationCenter.current()
center.removeDeliveredNotifications(withIdentifiers: [String])
center.removePendingNotificationRequests(withIdentifiers: [String])
2
glemoulant

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;
    }
}
1
Chengappa C D

Pour Swift 3.0 et iOS 10:

UNUserNotificationCenter.current().removeAllDeliveredNotifications()
1
Phạm Tuấn Anh