web-dev-qa-db-ja.com

アプリが既に設定しているローカル通知のリストを見つける

私のアプリでは、ユーザーが将来的にいくつかのリマインダーを設定できます。アプリが起動したら、どのリマインダー(通知)が既に設定されているかを知りたいです。

設定した通知を読み戻すことはできますか、それともアプリ(Core DataやPlistなど)に保存する必要がありますか?

32
Recycled Steel

UIApplicationには scheduledLocalNotifications というプロパティがあり、これを使用できます。

42

Swift 3.0およびSwift 4.0

忘れずにimport UserNotifications

これはiOS10 +およびwatchOS3 +で機能していますクラスUNUserNotificationCenterは古いバージョンでは使用できないため( 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

スコットは正しい。

UIApplicationのプロパティ scheduledLocalNotifications

コードは次のとおりです。

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

    }

}

詳細については、これを確認してください: scheduledLocalNotifications example UIApplication ios

21
Comradsky

@Scott Berrevoetsが正しい答えを出しました。それらを実際にリストするには、配列内のオブジェクトを列挙するのが簡単です。

[[[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

スイフト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.

        }
    }
})

これを使用して、同じ週ごとの通知が既に設定されていて、アプリが開くときに再び設定されるバグを修正しました。

2
Jose Ramirez

iOS 10、新しいUserNotificationsフレームワークを使用:

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

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

Swiftで、現在スケジュールされているすべてのローカル通知をコンソールに表示するには:

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