2011-12-30 14 views
103

Tengo una aplicación de 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?iOS aplicación: ¿cómo borrar las notificaciones?

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

EDIT1:

estoy teniendo algunos problemas en la eliminación de las notificaciones. Por favor, consulte 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 se minimiza la aplicación y comienzo la aplicación usando la notificación en el Centro de notificaciones, puedo ver en el registro que se llama al didReceiveRemoteNotification y puedo usar los puntos de interrupción que se ejecutó clearNotifications. Pero aún así la notificación se cuelga en el Centro de notificaciones. ¿Por qué?

Respuesta

149

Lo más probable es que debido a que el Centro de notificaciones es una característica relativamente nueva, Apple no necesariamente quería impulsar un nuevo paradigma para la eliminación de notificaciones. Por lo tanto, en su lugar, se propusieron varias veces [[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, yo uso este fragmento:

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

que nunca deja de desactivar todas las notificaciones de la aplicación desde el centro de notificaciones.

115

Solo para ampliar la respuesta de pcperini. Como él menciona, necesitará agregar el siguiente código a su método application:didFinishLaunchingWithOptions:;

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

Usted también necesidad de incrementar continuación, disminuir la insignia en su método application:didReceiveRemoteNotification: si usted está tratando de borrar el mensaje desde el centro de mensajes para que cuando un usuario que entra en aplicación del prensado de una notificación del centro de mensajes también claro, es decir;

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

Gran compartir .... Muchas gracias ..... –

+1

dar mágica u 1 ... PLZ hacer realidad esta respuesta .. –

+0

creo cancelAllLocalNotifications no se required.Worked para mí sin esa línea – Murali

20

También podría tener sentido para añadir una llamada a clearNotifications en applicationDidBecomeActive para que en caso de la aplicación está en el fondo y regresa también se borrará las notificaciones.

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

Tal vez en caso de que haya alarmas programadas y insignias de iconos 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]; 
9

Si ha programado pendiente notificaciones locales y no desea utilizar cancelAllLocalNotifications para borrar los antiguos en el centro de notificaciones, también puede hacer lo siguiente:

Parece ser que si se establece el scheduledLocalNotifications borra los antiguos en el Centro de notificaciones y, configurándolo a sí mismo, conserva las notificaciones locales pendientes.

+1

Esto funciona como un encanto para mí en iOS 9. No quería cancelar todas mis notificaciones porque se repiten a tiempo (diariamente o semanalmente). Y de esta manera borro todas las cosas sin borrarlas. – superpuccio

+1

La mejor solución que he visto hasta ahora. Alguien sabe si funciona en iOS 8? – duncanc4

+0

@ duncanc4 la última vez que lo probé en iOS 8 estaba funcionando. – ospr

-1

Conseguí esto de here. 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]; 
} 
+0

realmente no funciona –

3

Si viene aquí preguntando lo contrario (como yo), this puesto puede ser para usted.

No pude entender por qué mis notificaciones se estaban borrando 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, por suerte:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1; 
+1

¿Funciona para usted en iOS9? No noté ninguna diferencia al establecer una insignia en 0 o en -1. Todavía borra todas las notificaciones remotas en mi caso. – AlexeyVMP

+0

Ya, de hecho comencé a notar eso con mi aplicación de nuevo; No tengo idea de qué cambió. – TahoeWolverine

+0

Me estoy rindiendo desde que Apple de alguna manera decidió que la aplicación sin número de placa no debería tener ninguna notificación – AlexeyVMP

1

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

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

Cuando haya repetido notificaciones en el futuro, no lo hace desea cancelar esas notificaciones, puede borrar el artículo en el centro de notificaciones por:

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

Usted no puede borrar la notificación cuando su aplicación está abierta en primer plano llamando al método a continuación 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 de nuevo, y ahora es el momento de disparar, por lo que mantener el fuego, solicitar de nuevo, fuego, aplicar ....:

0

Al cerrar la sesión de su aplicación, en ese momento se tiene que 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.

9

Actualización para iOS 10 (Swift 3)

Para borrar todas las notificaciones locales en iOS 10 aplicaciones, se debe utilizar 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 se encarga de la liberación de notificaciones locales para iOS 10.x y todas las versiones anteriores de iOS. Necesitará import UserNotifications para el código iOS 10.x.

+0

¡¡¡Gracias hombre !!!!! –

0

Necesita agregar el código siguiente en su método AppDelegate applicationDidBecomeActive.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; 
Cuestiones relacionadas