Приложение iOS: как очистить уведомления?

У меня есть приложение 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. Но уведомление уведомляется в Центре уведомлений. Почему?

Ответ 1

Скорее всего, потому, что Notification Center является относительно новой функцией, Apple не обязательно хочет подтолкнуть совершенно новую парадигму для очистки уведомлений. Поэтому вместо этого они многоцелевые [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];, чтобы очистить указанные уведомления. Это может показаться немного странным, и Apple может предоставить более интуитивный способ сделать это в будущем, но на данный момент это официальный путь.

Я сам использую этот фрагмент:

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

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

Ответ 2

Просто чтобы расширить ответ на pcperini. Как он упоминает, вам нужно добавить следующий код к вашему методу application:didFinishLaunchingWithOptions:;

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

Вы Кроме того, нужно увеличить, а затем уменьшите значок в методе application:didReceiveRemoteNotification:, если вы пытаетесь очистить сообщение от центра сообщений, чтобы при вводе пользователем приложения из нажатия уведомления центр сообщений также будет очищен, т.е.

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

Ответ 3

Также может быть полезно добавить вызов clearNotifications в applicationDidBecomeActive, чтобы в случае, если приложение находится в фоновом режиме и возвращается, оно также очистит уведомления.

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

Ответ 4

Если у вас есть ожидающие запланированные локальные уведомления и вы не хотите использовать cancelAllLocalNotifications для очистки старых в Notification Center, вы также можете сделать следующее:

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

Похоже, что если вы установите scheduledLocalNotifications, он очистит старые в Центре уведомлений и, установив его самому себе, сохранит ожидающие локальные уведомления.

Ответ 5

Обновление для 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.

Ответ 6

Если вы идете сюда, думая об обратном (как и я), этот может быть для вас.

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

Отрицательный 1 делает трюк, к счастью:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

Ответ 7

Возможно, в случае наличия запланированных аварийных сигналов и нечистых значков значков приложений.

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

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

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

Ответ 8

В Swift я использую следующий код внутри своего AppDelegate:

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

Ответ 9

Если у вас есть повторные уведомления в будущем, вы не хотите отменять эти уведомления, вы можете очистить элемент в центре уведомлений:

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

Вы не можете очистить уведомление, когда ваше приложение открыто на переднем плане, вызвав метод ниже сразу после получения локального уведомления, иначе вы получите десятки сотен уведомлений. Может быть, потому, что одно и то же уведомление применяется снова, и сейчас самое время стрелять, поэтому вы стреляете, снова применяете, стреляйте, применяйте....:

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

Ответ 10

Когда вы выходите из своего приложения, в это время вам нужно использовать приведенную ниже строку кода при нажатии на кнопку выхода из системы.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

и это отлично работает в моем приложении.

Ответ 11

Вам нужно добавить код ниже в свой метод AppDelegate applicationDidBecomeActive.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

Ответ 12

Получил его от здесь. Он работает для 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];
}