Додаток iOS: як очистити сповіщення?


109

У мене є програма для iOS, куди надсилаються деякі повідомлення Push Notification. Моя проблема полягає в тому, що після цього повідомлення / сповіщення залишаються в Центрі сповіщень в iOS, після чого вибираються. Як я можу видалити сповіщення про свою заяву в Центрі повідомлень наступного разу, коли програма відкриється?

Я натрапив на пости, де люди дзвонять setApplicationIconBadgeNumberіз нульовим значенням, щоб очистити сповіщення. Це здається мені дуже дивним, тому я вважаю, що, можливо, існує інше рішення?

EDIT1:

У мене є проблеми з очищенням сповіщень. Будь ласка, дивіться мій код тут:

- (void) clearNotifications {
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (launchOptions != nil)
    {
        NSDictionary* dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (dictionary != nil)
        {
            NSLog(@"Launched from push notification: %@", dictionary);

            [self clearNotifications];
        }
    }

    return YES;
}

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
{    
    NSLog(@"Received notification: %@", userInfo);
    [self clearNotifications];
}

Я запускаю додаток через Xcode. Коли додаток зведено до мінімуму, і я запускаю додаток, використовуючи сповіщення в Центрі сповіщень, я можу побачити в журналі, що didReceiveRemoteNotificationвикликається, і за допомогою точок прориву я бачу, що clearNotificationsзапустився. Але повідомлення все ще висить у Центрі сповіщень. Чому?

Відповіді:


157

Швидше за все, оскільки Центр сповіщень є відносно новою функцією, Apple не обов'язково хотіла просувати цілком нову парадигму для очищення сповіщень. Тому замість цього вони намагалися [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];очистити вказані сповіщення. Це може здатися трохи дивним, і Apple може запропонувати більш інтуїтивний спосіб зробити це в майбутньому, але поки що це офіційний шлях.

Я сам використовую цей фрагмент:

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

який ніколи не зможе очистити всі сповіщення програми від Центру сповіщень.


cancelAllLocalNotifications застаріло - developer.apple.com/documentation/uikit/uiapplication/… Вам потрібно використовувати let center = UNUserNotificationCenter.current() center.removeAllDeliveredNotifications() // To remove all delivered notifications stackoverflow.com/a/40397907/1155650
Rohit Vipin Mathews

119

Просто для розширення відповіді pcperini. Як він згадує, вам потрібно буде додати наступний код до вашого application:didFinishLaunchingWithOptions:методу;

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

Вам також потрібно збільшити, а потім зменшити значок вашого application:didReceiveRemoteNotification:методу, якщо ви намагаєтесь очистити повідомлення від центру повідомлень, щоб, коли користувач заходить до вас у програму після натискання повідомлення, центр повідомлень також очиститься, тобто;

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

Думаю, скасувати всі локальні повідомлення не потрібно. Працював для мене без цього рядка
Муралі

@Murali це буде залежати від вас, використовуючи місцеві сповіщення чи ні ...?
Алехандро Іван

1
ОНОВЛЕННЯ :: "cancelAllLocalNotifications" застаріло: спочатку заставлено в iOS 10.0 "Отже, якщо ваша програма додатка вище iOS10.0, то вам слід використовувати цей центр UNUserNotificationCenter = [UNUserNotificationCenter currentNotificationCenter]; [центр RemoveAllDeliveredNotifications]; [центр deleteAllPendingNotificationRequests];
Користувач18474728

21

Можливо, також є сенс додати виклик до clearNotifications в applicationDidBecomeActive, щоб у випадку, коли програма перебуває у фоновому режимі та повертається, вона також очистить сповіщення.

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [self clearNotifications];
}

15

Оновлення для iOS 10 (Swift 3)

Щоб очистити всі локальні сповіщення в додатках iOS 10, слід скористатися таким кодом:

import UserNotifications

...

if #available(iOS 10.0, *) {
    let center = UNUserNotificationCenter.current()
    center.removeAllPendingNotificationRequests() // To remove all pending notifications which are not delivered yet but scheduled.
    center.removeAllDeliveredNotifications() // To remove all delivered notifications
} else {
    UIApplication.shared.cancelAllLocalNotifications()
}

Цей код обробляє очищення локальних сповіщень для iOS 10.x та всіх попередніх версій iOS. Вам знадобиться import UserNotificationsкод для iOS 10.x.


9

Якщо у вас є заплановані місцеві сповіщення та ви не хочете використовувати cancelAllLocalNotificationsдля очищення старих в Центрі сповіщень, ви також можете зробити наступне:

[UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;

Здається, що якщо встановити це, scheduledLocalNotificationsвін очищатиме старі в Центрі сповіщень і, встановивши його під себе, ви зберігаєте очікувані локальні сповіщення.


1
Це працює як шарм для iOS 9. Я не хотів скасовувати всі сповіщення, оскільки вони повторюються в часі (щодня або щотижня). І таким чином я очищаю всі речі, не видаляючи їх.
superpuccio

1
Найкраще рішення, яке я бачив досі. Хтось знає, чи працює він на iOS 8?
duncanc4

@ duncanc4 востаннє тестував його на iOS 8, він працював.
ospr

Де в додатку ви б це назвали?
Олексій Заватоне

Алекс, ти повинен телефонувати, коли потрібно видалити сповіщення в Центрі сповіщень. Я називаю це як у моїх AppDelegate, так applicationDidBecomeActive:і в application:didReceiveLocalNotification:методах.
ospr

3

У Swift я використовую такий код у своєму AppDelegate:

func applicationDidBecomeActive(application: UIApplication) {
    application.applicationIconBadgeNumber = 0
    application.cancelAllLocalNotifications()
}

3

Якщо ви приходите сюди, дивуючись навпаки (як я), це публікація може бути для вас.

Я не міг зрозуміти, чому мої сповіщення видаляються, коли я очищаю значок ... Я вручну збільшую значок, а потім хочу очистити його, коли користувач заходить у додаток. Це не є причиною очищати центр сповіщень; вони все ще можуть бачити або діяти над цими сповіщеннями.

Негативний 1 робить трюк, на щастя:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

1
Це працює для вас в iOS9? Я не помітив різниці у встановленні значка 0 або -1. Він все одно очищає всі віддалені сповіщення в моєму випадку.
ОлексійВМП

Так, я насправді знову почав помічати це з моїм додатком; Я поняття не маю, що змінилося.
TahoeWolverine

Я здаюсь, оскільки Apple якось вирішила, що додаток без номера значка не повинен отримувати жодних сповіщень
AlexeyVMP

1

Можливо на випадок запланованих тривожних сигналів та знаків, що не видаляються, додаток.

NSArray *scheduledLocalNotifications = [application scheduledLocalNotifications];
NSInteger applicationIconBadgeNumber = [application applicationIconBadgeNumber];

[application cancelAllLocalNotifications];
[application setApplicationIconBadgeNumber:0];

for (UILocalNotification* scheduledLocalNotification in scheduledLocalNotifications) {
    [application scheduleLocalNotification:scheduledLocalNotification];
}
[application setApplicationIconBadgeNumber:applicationIconBadgeNumber];

0

Якщо в майбутньому ви повторно отримуєте сповіщення, ви не хочете скасовувати ці сповіщення, ви можете очистити елемент у центрі повідомлень:

func clearNotificationCenter() {
    UIApplication.sharedApplication().applicationIconBadgeNumber = 1
    UIApplication.sharedApplication().applicationIconBadgeNumber = 0
}

Ви не можете очистити сповіщення, коли ваш додаток відкрито на передньому плані, зателефонувавши за методом нижче відразу після отримання місцевого сповіщення, інакше ви отримаєте десятки сотень сповіщень. Можливо тому, що те саме повідомлення знову застосовується, і тепер настав час стріляти, тож ти продовжуєш вогонь, застосовувати знову, вогонь, застосовувати ....:

[UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;

0

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

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

і це прекрасно працює в моєму додатку.


0

Вам потрібно додати код нижче у своєму applicationDidBecomeActiveметоді AppDelegate .

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

-1

Зрозумів з тут . Він працює для iOS 9

UIApplication *app = [UIApplication sharedApplication];
NSArray *eventArray = [app scheduledLocalNotifications];
for (int i=0; i<[eventArray count]; i++)
{
    UILocalNotification* oneEvent = [eventArray objectAtIndex:i];
    //Cancelling local notification
    [app cancelLocalNotification:oneEvent];
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.