Отклонить уже доставленное UILocalNotification?
Можно ли сделать это? UIApplication's
scheduledLocalNotifications
похоже, не возвращает уведомления, которые уже были доставлены в центр уведомлений пользователя, поэтому я думаю, что это может быть сделано намеренно, но я не могу найти никаких документально подтвержденных доказательств этого.
Кто-нибудь знает?
Спасибо!
РЕДАКТИРОВАТЬ: нашел это:
Вы можете отменить определенное запланированное уведомление, вызвав cancelLocalNotification: для объекта приложения, и вы можете отменить все запланированные уведомления, вызвав cancelAllLocalNotifications. Оба эти метода также программно отклоняют в настоящее время
Тем не менее, как я могу получить ссылку на уже доставленное уведомление, если scheduledLocalNotifications
не дает мне уведомления, которые уже были доставлены?
РЕДАКТИРОВАТЬ 2:
Вот что я пытаюсь сделать после регистрации некоторых уведомлений:
UIApplication *app = [UIApplication sharedApplication];
for (UILocalNotification *localNotification in app.scheduledLocalNotifications)
{
if (someCondition) {
[app cancelLocalNotification:localNotification];
}
}
}
Проблема в том, что, как только они доставлены, они больше не находятся в "scheduleLocalNotifications".
6 ответов
Вы можете решить эту проблему, добавив недавно созданные уведомления в свои NSMutableArray
уведомлений и проверить этот массив вместо app.scheduledLocalNotifications
, Что-то вроде этого:
Добавить NSMutableArray
в ваш файл Viewcontrollers.h:
NSMutableArray *currentNotifications;
Инициируйте его при запуске вашего ViewController
currentNotifications = [[NSMutableArray alloc] init];
При инициировании уведомления также добавьте его в свой массив:
UILocalNotification *notification = [[UILocalNotification alloc] init];
...
[currentNotifications addObject:notification];
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
Позже, когда вы захотите отменить это уведомление, поищите его в своем массиве. Также удалите его из вашего массива:
for (UILocalNotification *notification in currentNotifications) {
if (someCondition) {
[[UIApplication sharedApplication] cancelLocalNotification:notification];
[currentNotifications removeObject:notification];
}
}
Начиная с iOS10 теперь есть встроенная поддержка для этого, если вы перешли на использование UNUserNotificationCenter
,
Документы Apple утверждают:
func getDeliveredNotifications(completionHandler: @escaping ([UNNotification]) -> Void)
Предоставляет вам список уведомлений приложения, которые все еще отображаются в Центре уведомлений.
func removeDeliveredNotifications(withIdentifiers: [String])
Удаляет указанные уведомления из Центра уведомлений.
func removeAllDeliveredNotifications()
Удаляет все уведомления приложения из Центра уведомлений.
Я тоже искал ответ на этот вопрос. Моя проблема заключалась в том, что я хотел "очистить" все связанные с приложением уведомления, находящиеся в центре уведомлений, на тот случай, если пользователь откроет приложение из его значка в доке (поскольку это ничего не делает с ранее запущенными уведомлениями...)
К счастью, похоже, что cancelAllNotifications
не просто отменить запланированные, но ВСЕ. Поэтому я просто держался за ссылку на существующие запланированные уведомления перед их обработкой, а затем перенес их соответственно:
UIApplication *app = [UIApplication sharedApplication];
NSLog(@"\nScheduled notif count (prior) = %d", app.scheduledLocalNotifications.count);
NSArray *scheduledNotifs = app.scheduledLocalNotifications; // hold on to a reference
[[UIApplication sharedApplication] cancelAllLocalNotifications]; // blast everything
NSLog(@"\nScheduled notif count (post-wipeout) = %d", app.scheduledLocalNotifications.count);
for (UILocalNotification *notif in scheduledNotifs) {
[app scheduleLocalNotification:notif]; // put them back
}
NSLog(@"\nScheduled notif count (post-repopulation) = %d", app.scheduledLocalNotifications.count);
Не уверен, поможет ли это кому-нибудь, но это отлично сработало для моей ситуации.
Попробуйте эту ссылку:
И локальное уведомление регистрируется в центре уведомлений устройства, а не в вашем приложении.
Но, если ваше приложение работает, и время уведомления, вы можете получить параметры уведомления в игре в:
-(void) application:(UIApplication*)app didReceiveLocalNotification:(UILocalNotification*) notification
{
// local notification is geted
}
Вы можете сделать это при планировании уведомления, если вы также сохраните его в NSUserDefaults, используя NSKeyedArchiver для преобразования его в NSData.
Чтобы вернуть его как UILocalNotification, вы используете NSKeyedUnarchiver. Затем вы можете удалить его, используя метод cancelLocalNotification.
Полностью объяснено здесь (версия Swift + ссылка на оригинальное решение Obj-C)
После просмотра обновленного кода вам кажется, что вы заинтересованы в отмене всех уведомлений с помощью цикла for, так что вы можете использовать -
[[UIApplication sharedApplication] cancelAllLocalNotifications];