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

109

У меня есть приложение для iOS, куда отправляются push-уведомления. Моя проблема в том, что сообщения / уведомления остаются в Центре уведомлений в 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
Рохит Випин Мэтьюз,
119

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

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

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

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
АДАМ
источник
Я думаю, что cancelAllLocalNotifications не требуется. Работал у меня без этой строки
Murali
@Murali, будет ли это зависеть от того, используете ли вы локальные уведомления или нет ...?
Алехандро Иван
1
ОБНОВЛЕНИЕ :: «cancelAllLocalNotifications» устарело: впервые устарело в iOS 10.0 ». Поэтому, если версия вашего приложения выше iOS10.0, вам следует использовать этот UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter]; [центр removeAllDeliveredNotifications]; [центр removeAllPendingNotificationRequests];
User18474728 09
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он очищает старые в Центре уведомлений, и, установив его на себя, вы сохраняете ожидающие локальные уведомления.

ospr
источник
1
Для меня это работает как шарм на iOS 9. Я не хотел отменять все свои уведомления, потому что они повторяются во времени (ежедневно или еженедельно). И таким образом я очищаю все, не удаляя их.
superpuccio
1
Лучшее решение, которое я видел до сих пор. Кто-нибудь знает, работает ли он на iOS 8?
duncanc4 04
@ duncanc4 в прошлый раз, когда я тестировал его на iOS 8, он работал.
ospr 04
Где в приложении вы бы это назвали?
Alex Zavatone
Алекс, звони в него всякий раз, когда тебе нужно убрать уведомления в Центре уведомлений. Я вызываю это как в моем AppDelegate, так applicationDidBecomeActive:и в application:didReceiveLocalNotification:методах.
ospr
3

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

func applicationDidBecomeActive(application: UIApplication) {
    application.applicationIconBadgeNumber = 0
    application.cancelAllLocalNotifications()
}
Antoine
источник
3

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

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

К счастью, отрицательный 1 помогает:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;
TahoeWolverine
источник
1
У вас работает в iOS9? Я не заметил никакой разницы в установке значка на 0 или на -1. В моем случае он по-прежнему очищает все удаленные уведомления.
AlexeyVMP
Да, я снова начал замечать это в своем приложении; Понятия не имею, что изменилось.
TahoeWolverine
Я
сдаюсь,
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;
zgjie
источник
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];
}
Дэн Л
источник