Applicazione iOS: come cancellare le notifiche?


109

Ho un'applicazione iOS a cui vengono inviate alcune notifiche push. Il mio problema è che i messaggi / notifiche rimangono nel Centro notifiche in iOS dopo di che vengono toccati. Come posso rimuovere una notifica per la mia applicazione nel Centro notifiche la prossima volta che l'applicazione si apre?

Mi sono imbattuto in post in cui le persone chiamano setApplicationIconBadgeNumberun valore zero per cancellare le notifiche. Mi sembra molto strano, quindi credo che forse esiste un'altra soluzione?

Edit1:

Ho dei problemi a cancellare le notifiche. Si prega di vedere il mio codice qui:

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

Sto eseguendo l'app tramite Xcode. Quando l'app è ridotta a icona e avvio l'app utilizzando la notifica nel Centro notifiche, posso vedere nel registro che didReceiveRemoteNotificationè stata chiamata e utilizzando i punti di interruzione posso vedere che clearNotificationsè stata eseguita. Ma la notifica si blocca ancora nel Centro notifiche. Perché?

Risposte:


157

Molto probabilmente poiché Notification Center è una funzionalità relativamente nuova, Apple non voleva necessariamente spingere un paradigma completamente nuovo per la cancellazione delle notifiche. Quindi, invece, hanno più scopi [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];per cancellare dette notifiche. Potrebbe sembrare un po 'strano e Apple potrebbe fornire un modo più intuitivo per farlo in futuro, ma per il momento è il modo ufficiale.

Io stesso, utilizzo questo frammento:

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

che non manca mai di cancellare tutte le notifiche dell'app dal Centro notifiche.


cancelAllLocalNotifications è deprecato - developer.apple.com/documentation/uikit/uiapplication/… Devi usare let center = UNUserNotificationCenter.current() center.removeAllDeliveredNotifications() // To remove all delivered notifications stackoverflow.com/a/40397907/1155650
Rohit Vipin Mathews

119

Giusto per espandere la risposta di pcperini. Come menzionato dovrai aggiungere il seguente codice al tuo application:didFinishLaunchingWithOptions:metodo;

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

Devi anche aumentare e poi diminuire il badge nel tuo application:didReceiveRemoteNotification:metodo se stai tentando di cancellare il messaggio dal centro messaggi in modo che quando un utente accede alla tua app premendo una notifica, anche il centro messaggi si cancella, cioè;

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

Penso che cancelAllLocalNotifications non sia richiesto. Ha funzionato per me senza quella linea
Murali

@Murali dipenderebbe da te che usi le notifiche locali o no ...?
Alejandro Iván

1
UPDATE :: "cancelAllLocalNotifications 'is deprecated: first deprecated in iOS 10.0" Quindi, se la versione della tua app è superiore a iOS10.0, dovresti usare questo UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter]; [center removeAllDeliveredNotifications]; [center removeAllPendingNotificationRequests];
Utente18474728

21

Potrebbe anche avere senso aggiungere una chiamata a clearNotifications in applicationDidBecomeActive in modo che, nel caso in cui l'applicazione sia in background e ritorni, cancellerà anche le notifiche.

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

15

Aggiornamento per iOS 10 (Swift 3)

Per cancellare tutte le notifiche locali nelle app iOS 10, dovresti usare il seguente codice:

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

Questo codice gestisce la cancellazione delle notifiche locali per iOS 10.xe tutte le versioni precedenti di iOS. Sarà necessario import UserNotificationsper il codice iOS 10.x.


9

Se hai notifiche locali pianificate in sospeso e non desideri utilizzarle cancelAllLocalNotificationsper cancellare quelle vecchie nel Centro notifiche, puoi anche fare quanto segue:

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

Sembra che se si imposta scheduledLocalNotificationscancella quelli vecchi nel Centro notifiche e impostandolo su se stesso, si mantengono le notifiche locali in sospeso.


1
Questo funziona come un fascino per me su iOS 9. Non volevo cancellare tutte le mie notifiche perché si ripetono nel tempo (quotidianamente o settimanalmente). E in questo modo pulisco tutte le cose senza eliminarle.
superpuccio

1
La migliore soluzione che ho visto finora. Qualcuno sa se funziona su iOS 8?
duncanc4

@ duncanc4 l'ultima volta che l'ho provato su iOS 8 funzionava.
OSPR

Dove lo chiameresti all'interno dell'app?
Alex Zavatone

Alex, dovresti chiamarlo ogni volta che devi cancellare le notifiche nel Centro notifiche. Io lo chiamo sia nel mio AppDelegate di applicationDidBecomeActive:e application:didReceiveLocalNotification:metodi.
ospr

3

In Swift sto usando il seguente codice all'interno del mio AppDelegate:

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

3

Se vieni qui chiedendoti il ​​contrario (come me), questo post potrebbe essere per te.

Non sono riuscito a capire perché le mie notifiche venissero cancellate quando ho cancellato il badge ... Incremento manualmente il badge e poi voglio cancellarlo quando l'utente accede all'app. Non c'è motivo per svuotare il centro notifiche, però; potrebbero comunque voler vedere o agire in base a tali notifiche.

Il negativo 1 fa il trucco, fortunatamente:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

1
Funziona per te in iOS9? Non ho notato alcuna differenza con l'impostazione di un badge su 0 o -1. Cancella ancora tutte le notifiche remote nel mio caso.
AlexeyVMP

Sì, effettivamente ho iniziato a notarlo di nuovo con la mia app; Non ho idea di cosa sia cambiato.
TahoeWolverine

Mi arrendo poiché Apple in qualche modo ha deciso che l'app senza numero di badge non dovrebbe avere alcuna notifica
AlexeyVMP

1

Forse nel caso in cui ci siano allarmi programmati e badge delle icone delle app non cancellati.

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

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

for (UILocalNotification* scheduledLocalNotification in scheduledLocalNotifications) {
    [application scheduleLocalNotification:scheduledLocalNotification];
}
[application setApplicationIconBadgeNumber:applicationIconBadgeNumber];

0

Quando in futuro sono presenti notifiche ripetute, non si desidera annullare tali notifiche, è possibile cancellare l'elemento nel centro notifiche:

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

Non puoi cancellare la notifica quando la tua app è aperta in primo piano chiamando il metodo seguente subito dopo aver ricevuto la notifica locale, altrimenti riceverai decine di centinaia di notifiche. Forse perché la stessa notifica si applica di nuovo e ora è il momento di sparare, quindi continua a sparare, applica di nuovo, spara, applica ...:

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

0

Quando ti disconnetti dalla tua app, in quel momento devi utilizzare una riga di codice sotto il metodo di clic del pulsante di disconnessione.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

e funziona perfettamente nella mia app.


0

Devi aggiungere sotto il codice nel tuo applicationDidBecomeActivemetodo AppDelegate .

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

-1

Capito da qui . Funziona per 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];
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.