2012-05-18 4 views
9

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

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

Спасибо!

EDIT: Нашел:

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

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

Однако, как я могу получить ссылку на уже поставляемом уведомление, если scheduledLocalNotifications не дает мне уведомления, которые уже были доставлен?

EDIT 2:

Вот что я пытаюсь сделать, после того как я зарегистрировал несколько уведомлений:

UIApplication *app = [UIApplication sharedApplication]; 

for (UILocalNotification *localNotification in app.scheduledLocalNotifications) 
{ 
    if (someCondition) { 
      [app cancelLocalNotification:localNotification]; 
     } 
    } 
} 

Проблема не в том, что, как только они доставлены, они больше не в 'scheduleLocalNotifications'.

+0

Вы можете показать код, как вы используете? – rishi

+0

Несомненно, только что обновленный вопрос с некоторым кодом. – elsurudo

ответ

9

вы можете решить эту проблему, добавляя вновь созданные уведомления своего собственного NSMutableArray уведомлений и проверить этот массив вместо app.scheduledLocalNotifications. Что-то вроде этого:

Добавить NSMutableArray в свои Viewcontrollers.ч файла:

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]; 
    } 
} 
+1

Это будет работать, пока ваше приложение останется резидентом. Как только он уйдет в отставку, «currentNotifications» будет тост. Хотелось бы, чтобы был список отправленных уведомлений, @elsurudo. – steveluscher

+0

Это только работа вокруг –

+0

, это не работает для меня с ios 9.3.5, уведомление остается в центре уведомлений –

1

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

Apple doc

Some tutorial

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

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

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

Да, я уже их читал. Но я хочу удалить конкретное уведомление в более позднее (произвольное) время, а не только когда оно будет получено первым. – elsurudo

0

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

[[UIApplication sharedApplication] cancelAllLocalNotifications]; 
+0

Ой, упс. В моем фактическом коде у меня есть условие вокруг [app cancelLocalNotification: localNotification], поэтому cancelAllLocalNotifications не будет делать трюк. Я буду обновлять свой фрагмент кода, чтобы соответствовать этому. – elsurudo

2

Я искал ответ на это, а также. Моя проблема заключалась в том, что я хотел «очистить» все уведомления, связанные с приложениями, сидящие в центре уведомлений, только если пользователь откроет приложение из своего значка док-станции (так как это делает ничего ранее уволенным уведомлениям ...)

К счастью, оказалось, что 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); 

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

1

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

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

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

3

С iOS10 есть теперь нативная поддержка для этого, если вы перешли на использование UNUserNotificationCenter.

В Apple документы состояние:

func getDeliveredNotifications(completionHandler: @escaping ([UNNotification]) -> Void)

Предоставляет вам список уведомлений о приложении, которые по-прежнему отображаются в Центре уведомлений.

func removeDeliveredNotifications(withIdentifiers: [String])

Удаляет указанные уведомления из Центра уведомлений.

func removeAllDeliveredNotifications()

Удаляет все уведомления приложения от Notification Center.

Смежные вопросы