iOS-приложение: как убрать уведомления? - PullRequest
106 голосов
/ 30 декабря 2011

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

Ответы [ 12 ]

156 голосов
/ 30 декабря 2011

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

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

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

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

117 голосов
/ 10 февраля 2012

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

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

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

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
20 голосов
/ 18 июля 2012

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

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [self clearNotifications];
}
15 голосов
/ 05 января 2017

Обновление для 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 голосов
/ 25 июня 2015

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

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

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

3 голосов
/ 02 февраля 2016

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

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

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

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;
1 голос
/ 26 апреля 2016

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

func applicationDidBecomeActive(application: UIApplication) {
    application.applicationIconBadgeNumber = 0
    application.cancelAllLocalNotifications()
}
1 голос
/ 29 июля 2014

Может быть, в случае, если запланированные сигналы тревоги и значки приложений не очищены.

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 голосов
/ 12 июля 2017

Вам необходимо добавить приведенный ниже код в свой метод AppDelegate applicationDidBecomeActive.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
0 голосов
/ 01 июля 2016

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

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

, и это прекрасно работает в моем приложении.

...