Отклонить уже доставленное UILocalNotification?

Можно ли сделать это? UIApplication'sscheduledLocalNotifications похоже, не возвращает уведомления, которые уже были доставлены в центр уведомлений пользователя, поэтому я думаю, что это может быть сделано намеренно, но я не могу найти никаких документально подтвержденных доказательств этого.

Кто-нибудь знает?

Спасибо!

РЕДАКТИРОВАТЬ: нашел это:

Вы можете отменить определенное запланированное уведомление, вызвав cancelLocalNotification: для объекта приложения, и вы можете отменить все запланированные уведомления, вызвав cancelAllLocalNotifications. Оба эти метода также программно отклоняют в настоящее время

Здесь: http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html

Тем не менее, как я могу получить ссылку на уже доставленное уведомление, если 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);

Не уверен, поможет ли это кому-нибудь, но это отлично сработало для моей ситуации.

Попробуйте эту ссылку:

Apple Doc

Некоторый учебник

И локальное уведомление регистрируется в центре уведомлений устройства, а не в вашем приложении.

Но, если ваше приложение работает, и время уведомления, вы можете получить параметры уведомления в игре в:

-(void) application:(UIApplication*)app didReceiveLocalNotification:(UILocalNotification*) notification
{
// local notification is geted
}

Вы можете сделать это при планировании уведомления, если вы также сохраните его в NSUserDefaults, используя NSKeyedArchiver для преобразования его в NSData.

Чтобы вернуть его как UILocalNotification, вы используете NSKeyedUnarchiver. Затем вы можете удалить его, используя метод cancelLocalNotification.

Полностью объяснено здесь (версия Swift + ссылка на оригинальное решение Obj-C)

После просмотра обновленного кода вам кажется, что вы заинтересованы в отмене всех уведомлений с помощью цикла for, так что вы можете использовать -

 [[UIApplication sharedApplication] cancelAllLocalNotifications];
Другие вопросы по тегам