2013-01-03 11 views
12

Esiste un modo per rimuovere/chiudere a livello di codice UILocalNotification dal vassoio di notifica. Sono in grado di annullare la notifica che rimuove le notifiche daRimozione di UILocalNotification dal vassoio di notifica programmaticamente

[[UIApplication sharedApplication] scheduledLocalNotifications] 

Ecco che cosa ho bisogno di fare

ho bisogno di respingere il UILocalNotification da NotificationTray dopo è stata eseguita l'azione (vale a dire dopo che l'utente tocca la notifica)

MODIFICA: Posso rimuovere le notifiche dallo NSNotificationCenter. Voglio rimuovere notifiche specifiche dal vassoio di notifica . Come se l'utente preme il pulsante di cancellazione per cancellare tutte le notifiche appartenenti ad una particolare applicazione.

+0

Vuoi dire il centro di notifica? –

+1

Intendo la barra delle notifiche che viene visualizzata all'esterno dell'app! –

risposta

2
[UIApplication sharedApplication].applicationIconBadgeNumber = 0; 

farà qualche trucco troppo

ma se didnot usare applicationIconBadgeNumber, non funzionerà, quindi trucco è impostato applicationIconBadgeNumber prima :)

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1]; 
1

Se l'applicazione non è in esecuzione , riceverai l'oggetto Notifica locale nello

-applicationDidF inishLaunchingWithOptions:

come:

UILocalNotification *localNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsLocalNotificationKey]; 

altrimenti si può ottenere in

  • (void) applicazione: (UIApplication *) didReceiveLocalNotification applicazione: (UILocalNotification *) notifica

Ora è possibile rimuoverlo dal Centro di notifica utilizzando

[[UIApplication sharedApplication] cancelLocalNotification: notificationToCancel];

15

È possibile annullare tutte le notifiche utilizzando:

[[UIApplication sharedApplication] cancelAllLocalNotifications]; 

Se si desidera rimuovere un particolare di notifica, è possibile utilizzare userinfo di oggetti di notifica, quando si crea una notifica locale aggiunge un ID unico per quella. Più tardi puoi usare quell'ID per rimuovere la notifica locale.

Per questo è possibile utilizzare il seguente codice:

NSString *notificationId = @"id_to_cancel"; 
UILocalNotification *notification = nil; 
for(UILocalNotification *notify in [[UIApplication sharedApplication] scheduledLocalNotifications]) 
{ 
    if([[notify.userInfo objectForKey:@"ID"] isEqualToString:notificationId]) 
    { 
    notification = notify; 
    break; 
    } 
} 
[[UIApplication sharedApplication] cancelLocalNotification:notification]; 
+9

Questo non funziona se la notifica è già stata visualizzata come 'scheduledLocalNotifications' restituirà zero voci (poiché non è più 'programmato' e ha già sparato). Qualunque altro modo per rimuovere una notifica quando viene toccato? – strange

5

Credo che ho avuto un problema simile.Quando l'app è entrata in primo piano, ho tentato di cancellare le notifiche precedenti per rimuovere eventuali notifiche precedenti dalla barra delle notifiche.

ho fatto qualcosa di simile per afferrare vecchie notifiche e rimuoverli:

NSArray *activeNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; 
NSArray *pastNotifications = [activeNotifications filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"firDate < %@", [NSDate date]]]; 
for (UILocalNotification *notification in pastNotifications) { 
    [[UIApplication sharedApplication] cancelLocalNotification:notification]; 
} 

Tuttavia, sembra che scheduledLocalNotifications non include posizioni la cui data di fuoco è già passato, anche se appaiono ancora nel centro di notifica.

La chiamata cancelAllLocalNotifications sembra rimuovere anche le notifiche passate. Quindi possiamo prendere tutte le notifiche correnti, cancellare tutto e quindi aggiungere quelle a cui siamo ancora interessati.

// Grab all the current notifications 
NSArray *activeNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; 

// Clear all notifications to remove old notifications 
[[UIApplication sharedApplication] cancelAllLocalNotifications]; 

// Add back the still relevant notifications 
for (UILocalNotification *notification in activeNotifications) { 
    [[UIApplication sharedApplication] scheduleLocalNotification:notification]; 
} 

Inoltre siamo in grado di fare un po 'di filtraggio delle notifiche prima di aggiungere di nuovo se alcuni non sono più necessari, e possiamo afferrare le notifiche attive quando l'applicazione diventa attiva, memorizzarli in una variabile di istanza, e solo aggiungere di nuovo quando l'applicazione si sposta verso il fondo

+0

grt! thnx. È wrkd. – mars

1
// deletes a pushnotification with userInfo[id] = id 
-(void)deleteLocalPushNotificationWithId:(NSString*)id{ 
    for(UILocalNotification *notification in [[UIApplication sharedApplication] scheduledLocalNotifications]){ 
    if([[notification.userInfo objectForKey:@"id"] isEqualToString:id]){ 
     [[UIApplication sharedApplication] cancelLocalNotification:notification]; 
    } 
    } 
} 

// deletes all fired pushnotifications 
-(void)clearLocalPushNotifications{ 
    NSArray *activeNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; 

    // Clear all notifications to remove old notifications 
    [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

    // Add back the still relevant notifications 
    for (UILocalNotification *notification in activeNotifications) { 
    [[UIApplication sharedApplication] scheduleLocalNotification:notification]; 
    } 
} 
1

mi stava armeggiando con un po 'di codice e mi chiedevo perché le notifiche locali vengono memorizzati nel centro di notifica se l'applicazione è in primo piano. Probabilmente è perché Apple non sa cosa stai facendo con loro e onestamente non importa; così fanno il loro lavoro.

Per quanto riguarda la questione, faccio la seguente:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    if (application.applicationState == UIApplicationStateActive) 
    { 
     NSLog(@"active"); 

     // display some foreground notification; 
     [application cancelLocalNotification:notification]; 
    } 
    else 
    { 
     NSLog(@"inactive"); 
    } 
} 
Problemi correlati