2012-05-18 9 views
9

È possibile farlo? UIApplication'sscheduledLocalNotifications non sembra restituire notifiche che sono già state consegnate al centro di notifica dell'utente, quindi penso che questo possa essere dovuto alla progettazione, ma non riesco a trovare alcuna prova documentata di ciò.Ignora una UILocalNotification già consegnata?

Qualcuno sa?

Grazie!

EDIT: Ho trovato questo:

È possibile annullare una specifica comunicazione pianificata chiamando cancelLocalNotification: sull'oggetto applicazione, e si può annullare tutte le notifiche in programma chiamando cancelAllLocalNotifications. Entrambi questi metodi anche a livello di codice respingere un momento

Qui: http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html

Tuttavia, come ottengo un riferimento a una notifica già consegnate, se scheduledLocalNotifications non darmi le notifiche che sono già stati consegnato?

EDIT 2:

Ecco quello che sto cercando di fare, dopo che mi sono registrato alcune notifiche:

UIApplication *app = [UIApplication sharedApplication]; 

for (UILocalNotification *localNotification in app.scheduledLocalNotifications) 
{ 
    if (someCondition) { 
      [app cancelLocalNotification:localNotification]; 
     } 
    } 
} 

Il problema è che una volta che sono consegnati, non sono più in 'scheduledLocalNotifications'.

+0

puoi mostrare un po 'di codice, come stai usando? – rishi

+0

Certo, domanda appena aggiornata con un po 'di codice. – elsurudo

risposta

9

È possibile risolvere questo problema aggiungendo le notifiche di nuova creazione al proprio NSMutableArray delle notifiche e verificare tale matrice, invece di app.scheduledLocalNotifications. Qualcosa del genere:

Aggiungi un NSMutableArray ai Viewcontrollers.h di file:

NSMutableArray *currentNotifications; 

iniziarla quando si inizia la tua ViewController

currentNotifications = [[NSMutableArray alloc] init]; 

Quando si inizia una notifica, aggiungi anche al vostro array:

UILocalNotification *notification = [[UILocalNotification alloc] init]; 
... 
[currentNotifications addObject:notification]; 
[[UIApplication sharedApplication] presentLocalNotificationNow:notification]; 

Più tardi, quando si desidera annullare tale notifica , cercalo invece nel tuo array. Anche rimuovere dal vostro array:

for (UILocalNotification *notification in currentNotifications) { 
    if (someCondition) { 
     [[UIApplication sharedApplication] cancelLocalNotification:notification]; 
     [currentNotifications removeObject:notification]; 
    } 
} 
+1

Funzionerà finché la tua app non risiederà. Appena si dimette, 'currentNotifications' sarà brindato. Vorrei che ci fosse un modo per elencare anche le notifiche consegnate, @elsurudo. – steveluscher

+0

Questo è solo un lavoro intorno a –

+0

questo non funziona per me con iOS 9.3.5, la notifica rimane nel centro di notifica –

1

Prova questa link:

Apple doc

Some tutorial

e locali di notifica è la registrazione al centro di notifica del dispositivo, non nella vostra applicazione.

Ma, se la vostra applicazione è in esecuzione, ed è un tempo di notifica, allora si può ottenere parametri di notifica in gioco su:

-(void) application:(UIApplication*)app didReceiveLocalNotification:(UILocalNotification*) notification 
{ 
// local notification is geted 
} 
+0

Sì, ho già letto quelli. Ma quello che voglio fare è rimuovere una notifica specifica in un secondo momento (arbitrario), non solo quando è stata ricevuta per la prima volta. – elsurudo

0

Dopo aver visto il codice aggiornato, a quanto pare siete interessati ad annullare tutte le le notifiche con-in per ciclo, in modo da poter usare -

[[UIApplication sharedApplication] cancelAllLocalNotifications]; 
+0

Oh, oops. Nel mio codice attuale, ho una condizione intorno a [app cancelLocalNotification: localNotification], quindi cancelAllLocalNotifications non farà il trucco. Aggiornerò il mio snippet di codice per abbinarlo. – elsurudo

2

Ho cercato una risposta a questo. Il mio problema era che volevo "ripulire" tutte le notifiche relative alle app che si trovano nel centro di notifica nel caso in cui l'utente apra l'app dall'icona del dock (dal momento che non fa niente alle notifiche precedentemente sparate ...)

Fortunatamente, sembrerebbe che cancelAllNotifications non cancelli solo quelli programmati, ma TUTTO. Così ho semplicemente tenuto a un punto di riferimento delle notifiche pianificate esistenti prima di saltare, e poi riprogrammate conseguenza:

UIApplication *app = [UIApplication sharedApplication]; 

NSLog(@"\nScheduled notif count (prior) = %d", app.scheduledLocalNotifications.count); 

NSArray *scheduledNotifs = app.scheduledLocalNotifications; // hold on to a reference 

[[UIApplication sharedApplication] cancelAllLocalNotifications]; // blast everything 

NSLog(@"\nScheduled notif count (post-wipeout) = %d", app.scheduledLocalNotifications.count); 

for (UILocalNotification *notif in scheduledNotifs) { 
    [app scheduleLocalNotification:notif]; // put them back 
} 

NSLog(@"\nScheduled notif count (post-repopulation) = %d", app.scheduledLocalNotifications.count); 

Non sono sicuro se questo aiuta nessuno, ma questo era perfetto per la mia situazione.

1

È possibile farlo quando si pianifica la notifica se si salva anche in NSUserDefaults, utilizzando NSKeyedArchiver per convertirlo in NSData.

Per tornare indietro come UILocalNotification si utilizza NSKeyedUnarchiver. Quindi puoi eliminarlo usando il metodo cancelLocalNotification.

pienamente spiegato here (versione Swift + link originale soluzione Obj-C)

3

Dal iOS10 v'è ora il supporto nativo per questo se si sia passato al utilizzando UNUserNotificationCenter.

L'Apple docs Stato:

func getDeliveredNotifications(completionHandler: @escaping ([UNNotification]) -> Void)

fornisce un elenco delle notifiche dell'app che sono ancora visualizzato nel Centro di notifica.

func removeDeliveredNotifications(withIdentifiers: [String])

Rimuove le notifiche specificati dal Centro di notifica.

func removeAllDeliveredNotifications()

rimuove tutti notifiche dell'app dal Centro di notifica.

Problemi correlati