Извлечение UILocalNotification из лотка для уведомлений программно
Есть ли способ программно удалить/отклонить UILocalNotification
из лотка уведомлений.
Я могу отменить уведомление, которое удаляет уведомления из
[[UIApplication sharedApplication] scheduledLocalNotifications]
Вот что мне нужно сделать
Мне нужно отменить UILocalNotification
из NotificationTray после того, как действие было выполнено (т.е. после того, как пользователь отбраковал уведомление)
EDIT:
Я могу удалить уведомления из NSNotificationCenter
. Я хочу удалить определенные уведомления из лотка уведомлений. Как пользователь нажимает кнопку очистки, чтобы очистить все уведомления, относящиеся к определенному приложению.
Ответы
Ответ 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");
}
}