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


у меня есть приложение 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 104

12 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

минус 1 делает трюк, к счастью:

[UIApplication sharedApplication].applicationIconBadgeNumber = -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];

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

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

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

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

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

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

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

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

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

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

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

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