Aplicación iOS: ¿cómo borrar las notificaciones?

Tengo una aplicación iOS a la que se envían notificaciones push. Mi problema es que los mensajes / notificaciones permanecen en el Centro de notificaciones en iOS luego de que se tocan. ¿Cómo puedo eliminar una notificación para mi aplicación en el Centro de notificaciones la próxima vez que se abra la aplicación?

Encontré publicaciones donde las personas llaman a setApplicationIconBadgeNumber a un valor cero para borrar las notificaciones. Eso me parece muy extraño, ¿entonces creo que existe otra solución?

EDIT1:

Tengo algunos problemas para borrar las notificaciones. Por favor, mira mi código aquí:

 - (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]; } 

Estoy ejecutando la aplicación a través de Xcode. Cuando la aplicación se minimiza y comienzo la aplicación usando la notificación en el Centro de notificaciones, puedo ver en el registro que se llama a la llamada a la didReceiveRemoteNotification y utilizando los puntos de interrupción que puedo ver, que se ha ejecutado clearNotifications . Pero aún así la notificación se cuelga en el Centro de notificaciones. ¿Por qué?

Lo más probable es que debido a que el Centro de notificaciones es una función relativamente nueva, Apple no necesariamente quería impulsar un nuevo paradigma para la eliminación de notificaciones. Por lo tanto, en su lugar, [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; para borrar dichas notificaciones Puede parecer un poco raro, y Apple podría proporcionar una forma más intuitiva de hacerlo en el futuro, pero por el momento es la forma oficial.

Yo mismo uso este fragmento:

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

que nunca deja de borrar todas las notificaciones de la aplicación desde el Centro de notificaciones.

Solo para expandir la respuesta de pcperini. Como él menciona, necesitarás agregar el siguiente código a tu application:didFinishLaunchingWithOptions: method;

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

También necesita application:didReceiveRemoteNotification: y disminuir la insignia en su application:didReceiveRemoteNotification: método si está intentando borrar el mensaje del centro de mensajes para que cuando un usuario ingresa su aplicación al presionar una notificación, el centro de mensajes también se borre, es decir;

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

También podría tener sentido agregar una llamada a clearNotifications en applicationDidBecomeActive para que, en caso de que la aplicación esté en segundo plano y regrese, también borre las notificaciones.

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

Actualización para iOS 10 (Swift 3)

Para borrar todas las notificaciones locales en las aplicaciones iOS 10, debe usar el siguiente código:

 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() } 

Este código maneja la eliminación de notificaciones locales para iOS 10.x y todas las versiones anteriores de iOS. Tendrá que import UserNotifications para el código de iOS import UserNotifications

Si tiene notificaciones locales progtwigdas pendientes y no desea utilizar cancelAllLocalNotifications para borrar las antiguas en el Centro de notificaciones, también puede hacer lo siguiente:

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

Parece que si configura las scheduledLocalNotifications borra las antiguas en el Notification Center, y configurándolas a sí mismo, conserva las notificaciones locales pendientes.

Si vienes aquí preguntándote lo contrario (como yo), esta publicación puede ser para ti.

No pude entender por qué se borraron mis notificaciones cuando borré la insignia … Integro manualmente la insignia y luego quiero borrarla cuando el usuario ingresa a la aplicación. Sin embargo, eso no es motivo para limpiar el centro de notificaciones; es posible que aún quieran ver o actuar en esas notificaciones.

Negativo 1 hace el truco, afortunadamente:

 [UIApplication sharedApplication].applicationIconBadgeNumber = -1; 

Tal vez en caso de que haya alarmas progtwigdas y insignias de íconos de aplicaciones no borradas.

 NSArray *scheduledLocalNotifications = [application scheduledLocalNotifications]; NSInteger applicationIconBadgeNumber = [application applicationIconBadgeNumber]; [application cancelAllLocalNotifications]; [application setApplicationIconBadgeNumber:0]; for (UILocalNotification* scheduledLocalNotification in scheduledLocalNotifications) { [application scheduleLocalNotification:scheduledLocalNotification]; } [application setApplicationIconBadgeNumber:applicationIconBadgeNumber]; 

En Swift estoy usando el siguiente código dentro de mi AppDelegate:

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

Cuando tenga notificaciones repetidas en el futuro, no desea cancelar esas notificaciones, puede borrar el elemento en el centro de notificaciones de la siguiente manera:

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

No puede borrar la notificación cuando su aplicación está abierta en primer plano llamando al siguiente método inmediatamente después de recibir la notificación local, de lo contrario, recibirá decenas de cientos de notificaciones. Tal vez porque la misma notificación se aplica nuevamente, y ahora es el momento de disparar, por lo que debes mantener el fuego, aplicar nuevamente, disparar, aplicar …:

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

Cuando cierra la sesión desde su aplicación, en ese momento debe usar una línea de código debajo del método de clic del botón de cierre de sesión.

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

y esto funciona perfectamente en mi aplicación.

Debe agregar el código siguiente en su applicationDidBecomeActive AppDelegate applicationDidBecomeActive method.

 [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; 

Lo tengo desde aquí . Funciona para 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]; }