Подтвердить что ты не робот

Извлечение UILocalNotification из лотка для уведомлений программно

Есть ли способ программно удалить/отклонить UILocalNotification из лотка уведомлений. Я могу отменить уведомление, которое удаляет уведомления из

[[UIApplication sharedApplication] scheduledLocalNotifications]

Вот что мне нужно сделать

Мне нужно отменить UILocalNotification из NotificationTray после того, как действие было выполнено (т.е. после того, как пользователь отбраковал уведомление)

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

4b9b3361

Ответ 1

Вы можете отменить все уведомления, используя:

[[UIApplication sharedApplication] cancelAllLocalNotifications];

Если вы хотите удалить конкретное уведомление, вы можете использовать userinfo объекта уведомления, когда вы создаете локальное уведомление, добавьте к нему уникальный идентификатор. Позже вы можете использовать этот идентификатор для удаления локального уведомления.

Для этого вы можете использовать следующий код:

NSString *notificationId = @"id_to_cancel";
UILocalNotification *notification = nil;
for(UILocalNotification *notify in [[UIApplication sharedApplication] scheduledLocalNotifications])
{
  if([[notify.userInfo objectForKey:@"ID"] isEqualToString:notificationId])
  {
     notification = notify;
     break;
  }
}
[[UIApplication sharedApplication] cancelLocalNotification:notification];

Ответ 2

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

Я сделал что-то подобное, чтобы получить старые уведомления и удалить их:

NSArray *activeNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];
NSArray *pastNotifications = [activeNotifications filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"firDate < %@", [NSDate date]]];
for (UILocalNotification *notification in pastNotifications) {
    [[UIApplication sharedApplication] cancelLocalNotification:notification];
}

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

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

// Grab all the current notifications
NSArray *activeNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];

// Clear all notifications to remove old notifications
[[UIApplication sharedApplication] cancelAllLocalNotifications];

// Add back the still relevant notifications
for (UILocalNotification *notification in activeNotifications) {
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
}

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

Ответ 3

[UIApplication sharedApplication].applicationIconBadgeNumber = 0;

тоже сделает трюк

но если вы не использовали applicationIconBadgeNumber, это не сработает, поэтому установлен трюк applicationIconBadgeNumber сначала:)

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];

Ответ 4

Если приложение не запущено, вы будете получать объект Local Notification в

-applicationDidFinishLaunchingWithOptions:

как:

UILocalNotification *localNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsLocalNotificationKey];

иначе вы можете получить его в

  • (void) приложение: (UIApplication *) приложение didReceiveLocalNotification: (UILocalNotification *) уведомление

Теперь вы можете удалить его из Центра уведомлений с помощью

[[UIApplication sharedApplication] cancelLocalNotification: notificationToCancel];

Ответ 5

// deletes a pushnotification with userInfo[id] = id
-(void)deleteLocalPushNotificationWithId:(NSString*)id{
  for(UILocalNotification *notification in [[UIApplication sharedApplication] scheduledLocalNotifications]){
    if([[notification.userInfo objectForKey:@"id"] isEqualToString:id]){
        [[UIApplication sharedApplication] cancelLocalNotification:notification];
    }
  }
}

// deletes all fired pushnotifications
-(void)clearLocalPushNotifications{
  NSArray *activeNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];

  // Clear all notifications to remove old notifications
  [[UIApplication sharedApplication] cancelAllLocalNotifications];

  // Add back the still relevant notifications
  for (UILocalNotification *notification in activeNotifications) {
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
  }
}

Ответ 6

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

Что касается вопроса, я делаю следующее:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    if (application.applicationState == UIApplicationStateActive)
    {
        NSLog(@"active");

        // display some foreground notification;
        [application cancelLocalNotification:notification];
    }
    else
    {
        NSLog(@"inactive");
    }
}