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

109

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

Me encontré con publicaciones en las que las personas están llamando setApplicationIconBadgeNumbera un valor cero para borrar las notificaciones. Eso me parece muy extraño, así que creo que tal vez exista otra solución.

EDIT1:

Tengo algunos problemas para borrar las notificaciones. Por favor vea 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 e inicio la aplicación usando la notificación en el centro de notificaciones, puedo ver en el registro que didReceiveRemoteNotificationse llama y usando puntos de interrupción puedo ver que se clearNotificationsha ejecutado. Pero aún así, la notificación se cuelga en el Centro de notificaciones. ¿Por qué?

dhrm
fuente

Respuestas:

157

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 paradigma completamente nuevo para borrar las notificaciones. Así que, en cambio, se propusieron [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];con múltiples propósitos borrar dichas notificaciones. Puede parecer un poco extraño, y Apple podría proporcionar una forma más intuitiva de hacer esto 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 del Centro de notificaciones.

Patrick Perini
fuente
cancelAllLocalNotifications está obsoleto - developer.apple.com/documentation/uikit/uiapplication/… Debe usar let center = UNUserNotificationCenter.current() center.removeAllDeliveredNotifications() // To remove all delivered notifications stackoverflow.com/a/40397907/1155650
Rohit Vipin Mathews
119

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

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

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

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
ADÁN
fuente
Creo que no se requiere cancelAllLocalNotifications. Trabajó para mí sin esa línea
Murali
@Murali, ¿eso dependería de que uses notificaciones locales o no ...?
Alejandro Iván
1
ACTUALIZACIÓN :: "cancelAllLocalNotifications 'está en desuso: primero en desuso en iOS 10.0" Entonces, si la versión de su aplicación es superior a iOS10.0, entonces debe usar este UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter]; [centro removeAllDeliveredNotifications]; [centro removeAllPendingNotificationRequests];
Usuario18474728
21

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];
}
bert
fuente
15

Actualización para iOS 10 (Swift 3)

Para borrar todas las notificaciones locales en las aplicaciones de 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.xy todas las versiones anteriores de iOS. Necesitará import UserNotificationsel código iOS 10.x.

James Stonehill
fuente
9

Si tiene notificaciones locales programadas pendientes y no desea utilizarlas cancelAllLocalNotificationspara borrar las antiguas en el Centro de notificaciones, también puede hacer lo siguiente:

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

Parece que si configura el scheduledLocalNotifications, borra los antiguos en el Centro de notificaciones y, al configurarlo para sí mismo, conserva las notificaciones locales pendientes.

ospr
fuente
1
Esto funciona de maravilla para mí en iOS 9. No quería cancelar todas mis notificaciones porque se repiten en el tiempo (diaria 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
@ duncanc4 la última vez que lo probé en iOS 8 estaba funcionando.
ospr
¿En qué parte de la aplicación llamarías a esto?
Alex Zavatone
Alex, debes llamarlo cada vez que necesites borrar las notificaciones en el Centro de notificaciones. Lo llamo tanto en mi AppDelegate applicationDidBecomeActive:como en los application:didReceiveLocalNotification:métodos.
ospr
3

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

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

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

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

El negativo 1 funciona, afortunadamente:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;
TahoeWolverine
fuente
1
¿Te funciona 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
Sí, de hecho comencé a notar eso con mi aplicación nuevamente; No tengo idea de lo que cambió.
TahoeWolverine
Me estoy rindiendo desde que Apple de alguna manera decidió que la aplicación sin número de placa no debería tener notificaciones
AlexeyVMP
1

Tal vez en caso de que haya alarmas programadas e insignias de iconos de aplicaciones sin borrar.

NSArray *scheduledLocalNotifications = [application scheduledLocalNotifications];
NSInteger applicationIconBadgeNumber = [application applicationIconBadgeNumber];

[application cancelAllLocalNotifications];
[application setApplicationIconBadgeNumber:0];

for (UILocalNotification* scheduledLocalNotification in scheduledLocalNotifications) {
    [application scheduleLocalNotification:scheduledLocalNotification];
}
[application setApplicationIconBadgeNumber:applicationIconBadgeNumber];
Parque Jong Su
fuente
0

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 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 nuevamente, y ahora es el momento de disparar, así que mantienes el fuego, aplica de nuevo, dispara, aplica ....:

[UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;
zgjie
fuente
0

Cuando cierre la sesión de su aplicación, en ese momento tendrá que utilizar una línea de código a continuación en el 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.

Vaibhav Shiledar
fuente
0

Debe agregar el siguiente código en su applicationDidBecomeActivemétodo AppDelegate .

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
Bhavesh Patel
fuente
-1

Lo conseguí de 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];
}
Dan L
fuente