web-dev-qa-db-fra.com

Rechercher la liste des notifications locales que l'application a déjà définies

Mon application permet aux utilisateurs de définir un certain nombre de rappels à l'avenir. Lorsque l'application démarre, je veux savoir quels rappels (notifications) ont déjà été définis.

Puis-je relire les notifications que j'ai définies ou dois-je stocker dans mon application (par exemple, Core Data ou Plist)?

32
Recycled Steel

UIApplication possède une propriété appelée scheduledLocalNotifications que vous pouvez utiliser.

42
Scott Berrevoets

Pour Swift 3.0 et Swift 4.0

n'oubliez pas de faire import UserNotifications

Cela fonctionne pour iOS10 + et watchOS3 + depuis la classe UNUserNotificationCenter n'est pas disponible pour les anciennes versions ( link )

let center = UNUserNotificationCenter.current()

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    center.getPendingNotificationRequests { (notifications) in
        print("Count: \(notifications.count)")
        for item in notifications {
          print(item.content)
        }
    }
}
22
Frizzo

Scott a raison.

Propriété de UIApplicationscheduleLocalNotifications

Voici le code:

NSMutableArray *notifications = [[NSMutableArray alloc] init];
[notifications addObject:notification];
app.scheduledLocalNotifications = notifications;
//Equivalent: [app setScheduledLocalNotifications:notifications];

UIApplication *app = [UIApplication sharedApplication];
NSArray *eventArray = [app scheduledLocalNotifications];
for (int i=0; i<[eventArray count]; i++)
{
    UILocalNotification* oneEvent = [eventArray objectAtIndex:i];
    NSDictionary *userInfoCurrent = oneEvent.userInfo;
    NSString *uid=[NSString stringWithFormat:@"%@",[userInfoCurrent valueForKey:@"uid"]];
    if ([uid isEqualToString:uidtodelete])
    {
        //Cancelling local notification
        [app cancelLocalNotification:oneEvent];
        break;
    }
}

NSArray *arrayOfLocalNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications] ;

for (UILocalNotification *localNotification in arrayOfLocalNotifications) {

    if ([localNotification.alertBody isEqualToString:savedTitle]) {
        NSLog(@"the notification this is canceld is %@", localNotification.alertBody);

        [[UIApplication sharedApplication] cancelLocalNotification:localNotification] ; // delete the notification from the system

    }

}

Pour plus d'informations, consultez ceci: exemple ScheduledLocalNotifications UIApplication ios

21
Comradsky

@Scott Berrevoets a donné la bonne réponse. Pour les répertorier, il est simple d'énumérer les objets du tableau:

[[[UIApplication sharedApplication] scheduledLocalNotifications] enumerateObjectsUsingBlock:^(UILocalNotification *notification, NSUInteger idx, BOOL *stop) {
    NSLog(@"Notification %lu: %@",(unsigned long)idx, notification);
}];
6
siburb

Swift 3.0.2:

UIApplication.shared.scheduledLocalNotifications
4
Jim Wilson

Swift 4

UNUserNotificationCenter.current().getPendingNotificationRequests(completionHandler: { (requests) in

    for request in requests {

        if request.identifier == "IDENTIFIER YOU'RE CHECKING IF EXISTS" {

            //Notification already exists. Do stuff.

        } else if request === requests.last {

            //All requests have already been checked and notification with identifier wasn't found. Do stuff.

        }
    }
})

J'ai utilisé cela pour corriger un bug où la même notification hebdomadaire était déjà définie et était de nouveau définie lorsque l'application s'ouvrirait, de sorte qu'elle continuerait de réinitialiser le minuteur pour apparaître, ce qui signifie qu'il ne s'est jamais produit.

2
Jose Ramirez

Dans iOS 10, en utilisant le nouveau framework UserNotifications:

UNUserNotificationCenter.current().getPendingNotificationRequests { (notificationRequests) in

        print("Requests: \(notificationRequest)")
}
2
gabriel_vincent

Dans Swift, pour voir toutes vos notifications locales actuellement planifiées imprimées dans la console:

print(UIApplication.sharedApplication().scheduledLocalNotifications)
1
Dave G