2011-12-30 17 views
103

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

Ho trovato post in cui le persone chiamano setApplicationIconBadgeNumber un valore zero per cancellare le notifiche. Sembra strano per me, quindi credo che forse esiste un'altra soluzione?

Edit1:

Sto avendo alcuni problemi di compensazione 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 di notifica, è possibile vedere nel registro che viene chiamato il numero didReceiveRemoteNotification e che utilizzo i punti di interruzione che posso vedere, che è stato eseguito il clearNotifications. Tuttavia, la notifica si blocca nel Centro notifiche. Perché?

risposta

149

Molto probabilmente perché il Centro notifiche è una funzionalità relativamente nuova, Apple non ha voluto necessariamente spingere un paradigma completamente nuovo per la cancellazione delle notifiche. Quindi, invece, hanno deciso di aggiungere le due notifiche allo [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];. 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, io uso questo frammento:

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

che non riesce mai a cancellare tutte le notifiche dell'app dal Centro di notifica.

115

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

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

È anche necessità di incrementare poi decrementare il distintivo nel metodo application:didReceiveRemoteNotification: se si sta cercando di cancellare il messaggio dal centro servizi messaggi in modo che quando un utente si immette applicazione di premere una notifica Il centro messaggi anche chiaro, cioè;

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

Grande condividi .... Grazie mille ..... –

+1

magica dare u ... 1 plz rendere vera questa risposta .. –

+0

Penso cancelAllLocalNotifications non è required.Worked per me senza quella linea – Murali

20

Potrebbe anche avere un senso di aggiungere una chiamata a clearNotifications in applicationDidBecomeActive modo che in caso l'applicazione è in background e torna sarà anche cancellare le notifiche.

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

allarmi Forse nel caso in cui non ci sono in programma e non liquidati app icona badge.

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

Se si è in attesa di programma notifiche locali e non si desidera utilizzare cancelAllLocalNotifications per cancellare quelli vecchi in Centro di notifica, è possibile anche effettuare le seguenti operazioni:

Sembra che se si imposta lo scheduledLocalNotifications cancella quelli precedenti nel Centro di notifica e, impostandolo su sé stesso, mantiene le notifiche locali in sospeso.

+1

Funziona come un fascino per me su iOS 9. Non volevo cancellare tutte le mie notifiche perché si ripetono in tempo (giornaliero o settimanale). E in questo modo rimuovo tutte le cose senza cancellarle. – superpuccio

+1

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

+0

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

-1

Ottenuto da here. Si lavora 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]; 
} 
+0

non funziona davvero –

3

Se venite qui a chiedermi il contrario (come mi è stato), this postale può essere per voi.

Non riuscivo a capire perché le mie notifiche si stavano cancellando quando ho cancellato il badge ... Aumento manualmente il badge e poi voglio cancellarlo quando l'utente entra nell'app. Non è un motivo per cancellare il centro di notifica, però; possono ancora voler vedere o agire su quelle notifiche.

negativo 1 fa il trucco, per fortuna:

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

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

+0

Ya, in realtà ho iniziato a notarlo di nuovo con la mia app; Non ho idea di cosa sia cambiato. – TahoeWolverine

+0

Mi sto arrendendo da quando Apple in qualche modo ha deciso che l'app senza numero di badge non dovrebbe ricevere notifiche – AlexeyVMP

1

In Swift Sto utilizzando il seguente codice all'interno del mio AppDelegate:

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

Dopo aver ripetuto le notifiche in futuro, non è necessario desidera annullare tali notifiche, è possibile cancellare l'elemento nel centro di notifica da:

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

Si non è possibile cancellare la notifica quando la tua app è aperta in primo piano chiamando il metodo di seguito immediatamente dopo aver ricevuto la notifica locale, altrimenti riceverai decine di centinaia di notifiche. Forse perché la stessa notifica si applica ancora una volta, e ora è il momento di sparare, in modo da mantenere il fuoco, applicare ancora una volta, il fuoco, si applicano ....:

0

Quando il logout dalla tua app, in quel momento è necessario utilizzare una riga di codice sotto il metodo di clic del pulsante di disconnessione.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; 

[[UIApplication sharedApplication] cancelAllLocalNotifications]; 

e questo funziona perfettamente nella mia app.

9

Aggiornamento per iOS 10 (Swift 3)

Al fine di cancellare tutte le notifiche locali in iOS 10 applicazioni, è necessario utilizzare 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 il cancellazione delle notifiche locali per iOS 10.x e tutte le precedenti versioni di iOS. È necessario import UserNotifications per il codice iOS 10.x.

+0

Grazie amico !!!!! –

0

È necessario aggiungere il codice seguente nel metodo AppDelegate applicationDidBecomeActive.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; 
Problemi correlati