Приложение iOS: как очистить уведомления?
У меня есть приложение iOS, в которое отправляется сообщение Push Notification. Моя проблема заключается в том, что сообщения/уведомления остаются в Центре уведомлений в 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
. Но уведомление уведомляется в Центре уведомлений. Почему?
Ответы
Ответ 1
Скорее всего, потому, что Notification Center является относительно новой функцией, Apple не обязательно хочет подтолкнуть совершенно новую парадигму для очистки уведомлений. Поэтому вместо этого они многоцелевые [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
, чтобы очистить указанные уведомления. Это может показаться немного странным, и Apple может предоставить более интуитивный способ сделать это в будущем, но на данный момент это официальный путь.
Я сам использую этот фрагмент:
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
который никогда не удаляет все уведомления о приложении из Центра уведомлений.
Ответ 2
Просто чтобы расширить ответ на pcperini. Как он упоминает, вам нужно добавить следующий код к вашему методу application:didFinishLaunchingWithOptions:
;
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
Вы Кроме того, нужно увеличить, а затем уменьшите значок в методе application:didReceiveRemoteNotification:
, если вы пытаетесь очистить сообщение от центра сообщений, чтобы при вводе пользователем приложения из нажатия уведомления центр сообщений также будет очищен, т.е.
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
Ответ 3
Также может быть полезно добавить вызов clearNotifications в applicationDidBecomeActive, чтобы в случае, если приложение находится в фоновом режиме и возвращается, оно также очистит уведомления.
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[self clearNotifications];
}
Ответ 4
Если у вас есть ожидающие запланированные локальные уведомления и вы не хотите использовать cancelAllLocalNotifications
для очистки старых в Notification Center, вы также можете сделать следующее:
[UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;
Похоже, что если вы установите scheduledLocalNotifications
, он очистит старые в Центре уведомлений и, установив его самому себе, сохранит ожидающие локальные уведомления.
Ответ 5
Обновление для 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.
Ответ 6
Если вы идете сюда, думая об обратном (как и я), этот может быть для вас.
Я не мог понять, почему мои уведомления были очищены, когда я очистил значок... Я вручную увеличиваю значок и затем хочу очистить его, когда пользователь входит в приложение. Однако никаких оснований для отказа от центра уведомления; они могут по-прежнему хотеть видеть или использовать эти уведомления.
Отрицательный 1 делает трюк, к счастью:
[UIApplication sharedApplication].applicationIconBadgeNumber = -1;
Ответ 7
Возможно, в случае наличия запланированных аварийных сигналов и нечистых значков значков приложений.
NSArray *scheduledLocalNotifications = [application scheduledLocalNotifications];
NSInteger applicationIconBadgeNumber = [application applicationIconBadgeNumber];
[application cancelAllLocalNotifications];
[application setApplicationIconBadgeNumber:0];
for (UILocalNotification* scheduledLocalNotification in scheduledLocalNotifications) {
[application scheduleLocalNotification:scheduledLocalNotification];
}
[application setApplicationIconBadgeNumber:applicationIconBadgeNumber];
Ответ 8
В Swift я использую следующий код внутри своего AppDelegate:
func applicationDidBecomeActive(application: UIApplication) {
application.applicationIconBadgeNumber = 0
application.cancelAllLocalNotifications()
}
Ответ 9
Если у вас есть повторные уведомления в будущем, вы не хотите отменять эти уведомления, вы можете очистить элемент в центре уведомлений:
func clearNotificationCenter() {
UIApplication.sharedApplication().applicationIconBadgeNumber = 1
UIApplication.sharedApplication().applicationIconBadgeNumber = 0
}
Вы не можете очистить уведомление, когда ваше приложение открыто на переднем плане, вызвав метод ниже сразу после получения локального уведомления, иначе вы получите десятки сотен уведомлений. Может быть, потому, что одно и то же уведомление применяется снова, и сейчас самое время стрелять, поэтому вы стреляете, снова применяете, стреляйте, применяйте....:
[UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;
Ответ 10
Когда вы выходите из своего приложения, в это время вам нужно использовать приведенную ниже строку кода при нажатии на кнопку выхода из системы.
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
и это отлично работает в моем приложении.
Ответ 11
Вам нужно добавить код ниже в свой метод AppDelegate applicationDidBecomeActive
.
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
Ответ 12
Получил его от здесь. Он работает для 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];
}