2012-05-18 6 views
9

Ist es möglich, dies zu tun? UIApplication'sscheduledLocalNotifications scheint keine Benachrichtigungen zurückzuliefern, die bereits an das Benachrichtigungscenter des Benutzers gesendet wurden. Daher denke ich, dass dies beabsichtigt ist, aber ich kann keine dokumentierten Beweise dafür finden.Eine bereits ausgelieferte UILocalNotification ablehnen?

Wer weiß?

Danke!

EDIT: Gefunden dies:

Sie können durch Aufruf cancelLocalNotification eine bestimmte geplante Ankündigung kündigen: auf dem Anwendungsobjekt, und Sie können durch Aufruf cancelAllLocalNotifications alle geplanten Mitteilungen abzubrechen. Beide Methoden programmatisch auch ein derzeit

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

, wie bekomme ich einen Verweis auf eine bereits gelieferte Benachrichtigung, wenn scheduledLocalNotifications nicht geben Sie mir Benachrichtigungen, die bereits gewesen geliefert?

EDIT 2:

Hier ist, was ich zu tun habe versucht, nachdem ich einige Mitteilungen registriert haben:

UIApplication *app = [UIApplication sharedApplication]; 

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

Das Problem ist, dass, sobald sie geliefert sind, sind sie nicht mehr in "geplanteLokaleNotifikationen".

+0

können Sie Code anzeigen, wie Sie verwenden? – rishi

+0

Sicher, gerade aktualisierte Frage mit etwas Code. – elsurudo

Antwort

9

Sie können dieses Problem lösen, indem Sie Ihre neu erstellten Benachrichtigungen an Ihre eigene NSMutableArray von Benachrichtigungen und prüfen Sie, dass Array statt app.scheduledLocalNotifications hinzufügen. Etwas wie dieses:

Fügen Sie Ihren Viewcontrollern ein NSMutableArray hinzu.h-Datei:

NSMutableArray *currentNotifications; 

es einleiten, wenn der Viewcontroller initiieren

currentNotifications = [[NSMutableArray alloc] init]; 

Wenn eine Benachrichtigung initiiert, fügen Sie auch zu Ihrem Array:

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

Später, wenn Sie diese Meldung abbrechen möchten , suchen Sie stattdessen in Ihrem Array nach. Auch aus Ihrem Array entfernen:

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

Dies funktioniert so lange, wie Ihre App resident bleibt. Sobald es zurücktritt, wird "currentNotifications" getoast sein. Ich wünschte, es gäbe auch einen Weg, gelieferte Benachrichtigungen aufzulisten, @elsurudo. – steveluscher

+0

Dies ist nur eine Arbeit um –

+0

dies funktioniert nicht für mich mit ios 9.3.5, Benachrichtigung bleibt in der Benachrichtigungszentrale –

1

Versuchen Sie diese Links:

Apple doc

Some tutorial

und lokale Benachrichtigung Gerät Notification Center registriert, nicht in Ihrer Anwendung.

Aber, wenn Ihre Anwendung läuft, und ist eine Benachrichtigung Zeit, dann können Sie Benachrichtigungsparameter in Spiel in erhalten:

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

Yup, ich habe diese schon gelesen. Aber was ich tun möchte, ist eine bestimmte Benachrichtigung zu einem späteren (willkürlichen) Zeitpunkt zu entfernen, nicht nur, wenn es zuerst empfangen wird. – elsurudo

0

Nach dem aktualisierten Code zu sehen, es scheint, dass Sie daran interessiert sind, löschen Sie alle Benachrichtigungen mit-in für Schleife, können Sie so verwenden -

[[UIApplication sharedApplication] cancelAllLocalNotifications]; 
+0

Oh, oops. In meinem tatsächlichen Code habe ich eine Bedingung um [app cancelLocalNotification: localNotification], also cancelAllLocalNotifications wird nicht den Trick tun. Ich werde mein Code-Snippet entsprechend aktualisieren. – elsurudo

2

Ich habe auch eine Antwort auf diese suchen. Mein Problem war, dass ich alle App-bezogenen Benachrichtigungen, die im Benachrichtigungscenter gespeichert waren, "bereinigen" wollte, falls der Benutzer die App über sein Dock-Symbol öffnet (da dies nichts zu den zuvor gefeuerten Benachrichtigungen ...)

Zum Glück scheint es, dass cancelAllNotifications nicht nur geplante, sondern alles abbricht. Also habe ich einfach auf eine Referenz der bestehenden geplanten Meldungen gehalten, bevor sie strahlen, und dann nachgeholt sie entsprechend:

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); 

nicht sicher, ob das jemand hilft, aber das hat super funktioniert für meine Situation.

1

Sie können dies tun, wenn Sie die Benachrichtigung planen, wenn Sie sie auch in NSUserDefaults speichern und NSKeyedArchiver verwenden, um sie in NSData zu konvertieren.

Um es als UILocalNotification zurück zu bekommen, verwenden Sie NSKeyedUnarchiver. Dann können Sie es mit der Methode cancelLocalNotification löschen.

erklärt Voll here (Swift-Version + Link zur Original-Obj-C-Lösung)

3

Seit iOS10 es jetzt native Unterstützung für das ist, wenn Sie mit UNUserNotificationCenter umgestellt haben.

Der Apple docs Zustand:

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

Bietet Ihnen eine Liste der Meldungen der App, die noch in Notification Center angezeigt werden.

func removeDeliveredNotifications(withIdentifiers: [String])

Entfernt die angegebenen Benachrichtigungen von Notification Center.

func removeAllDeliveredNotifications()

Entfernt alle Benachrichtigungen für den App von Notification Center.