приложение 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 ответов:
скорее всего, поскольку Центр уведомлений является относительно новой функцией, 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]; }