iOS-Anwendung: Wie lösche ich Benachrichtigungen?

109

Ich habe eine iOS-Anwendung, an die Push-Benachrichtigungen gesendet werden. Mein Problem ist, dass die Nachrichten / Benachrichtigungen im Benachrichtigungscenter in iOS verbleiben, nachdem sie getippt wurden. Wie kann ich beim nächsten Öffnen der Anwendung eine Benachrichtigung für meine Anwendung im Benachrichtigungscenter entfernen?

Ich bin auf Posts gestoßen, bei denen Leute setApplicationIconBadgeNumbereinen Nullwert aufrufen , um die Benachrichtigungen zu löschen. Das kommt mir sehr komisch vor, also glaube ich, dass es vielleicht eine andere Lösung gibt?

EDIT1:

Ich habe einige Probleme beim Löschen der Benachrichtigungen. Bitte sehen Sie meinen Code hier:

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

Ich führe die App über Xcode aus. Wenn die App minimiert ist und ich die App mithilfe der Benachrichtigung im Benachrichtigungscenter starte, kann ich im Protokoll sehen, dass die App didReceiveRemoteNotificationaufgerufen wird und unter Verwendung von Haltepunkten, die ich sehen kann, dass die ausgeführt clearNotificationswurde. Die Benachrichtigung bleibt jedoch im Benachrichtigungscenter hängen. Warum?

dhrm
quelle

Antworten:

157

Da das Notification Center eine relativ neue Funktion ist, wollte Apple höchstwahrscheinlich nicht unbedingt ein völlig neues Paradigma für das Löschen von Benachrichtigungen vorantreiben. Stattdessen haben sie mehrere Ziele verfolgt [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];, um diese Benachrichtigungen zu löschen. Es mag etwas seltsam erscheinen, und Apple bietet möglicherweise eine intuitivere Möglichkeit, dies in Zukunft zu tun, aber vorerst ist es der offizielle Weg.

Ich selbst benutze dieses Snippet:

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

Dadurch werden immer alle Benachrichtigungen der App aus dem Notification Center gelöscht.

Patrick Perini
quelle
cancelAllLocalNotifications ist veraltet - developer.apple.com/documentation/uikit/uiapplication/… Sie müssen let center = UNUserNotificationCenter.current() center.removeAllDeliveredNotifications() // To remove all delivered notifications stackoverflow.com/a/40397907/1155650
Rohit Vipin Mathews
119

Nur um die Antwort von pcperini zu erweitern. Wie er erwähnt, müssen Sie Ihrer application:didFinishLaunchingWithOptions:Methode den folgenden Code hinzufügen .

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

Sie auch müssen Schritt dann das Abzeichen in Ihrer dekrementieren application:didReceiveRemoteNotification:Methode , wenn Sie versuchen , die Nachricht von der Nachrichtenzentrale zu löschen , so dass , wenn ein Benutzer eingibt Sie app aus einer Meldung das Nachrichtenzentrum drückt , wird auch klar, das heißt;

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
ADAM
quelle
Ich denke, cancelAllLocalNotifications ist nicht erforderlich. Arbeitete für mich ohne diese Zeile
Murali
@Murali würde das davon abhängen, ob Sie lokale Benachrichtigungen verwenden oder nicht ...?
Alejandro Iván
1
UPDATE :: "cancelAllLocalNotifications" ist veraltet: zuerst in iOS 10.0 veraltet. Wenn Ihre App-Version also höher als iOS 10.0 ist, sollten Sie dieses UNUserNotificationCenter verwenden. * Center = [UNUserNotificationCenter currentNotificationCenter]; [center removeAllDeliveredNotifications]; [center removeAllPendingNotificationRequests];
User18474728
21

Es kann auch sinnvoll sein, clearNotifications in applicationDidBecomeActive aufzurufen, damit die Benachrichtigungen auch gelöscht werden, falls sich die Anwendung im Hintergrund befindet und zurückkommt.

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

Update für iOS 10 (Swift 3)

Um alle lokalen Benachrichtigungen in iOS 10-Apps zu löschen, sollten Sie den folgenden Code verwenden:

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

Dieser Code behandelt das Löschen lokaler Benachrichtigungen für iOS 10.x und alle vorherigen Versionen von iOS. Sie müssen import UserNotificationsfür den iOS 10.x-Code.

James Stonehill
quelle
9

Wenn Sie geplante lokale Benachrichtigungen ausstehen und keine cancelAllLocalNotificationszum Löschen alter Benachrichtigungen im Benachrichtigungscenter verwenden möchten , können Sie auch Folgendes tun:

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

Wenn Sie das festlegen scheduledLocalNotifications, werden die alten im Notification Center gelöscht, und wenn Sie es auf sich selbst setzen, behalten Sie die ausstehenden lokalen Benachrichtigungen bei.

ospr
quelle
1
Dies funktioniert unter iOS 9 wie ein Zauber für mich. Ich wollte nicht alle meine Benachrichtigungen abbrechen, da sie sich rechtzeitig wiederholen (täglich oder wöchentlich). Und auf diese Weise lösche ich alles, ohne es zu löschen.
Superpuccio
1
Beste Lösung, die ich bisher gesehen habe. Weiß jemand, ob es unter iOS 8 funktioniert?
Duncanc4
@ duncanc4 Als ich es das letzte Mal unter iOS 8 getestet habe, hat es funktioniert.
ospr
Wo in der App würden Sie das nennen?
Alex Zavatone
Alex, du solltest es anrufen, wann immer du die Benachrichtigungen im Benachrichtigungscenter löschen musst. Ich nenne es sowohl meine AppDelegate der applicationDidBecomeActive:und application:didReceiveLocalNotification:Methoden.
ospr
3

In Swift verwende ich den folgenden Code in meinem AppDelegate:

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

Wenn Sie hierher kommen und sich das Gegenteil fragen (wie ich), ist dieser Beitrag möglicherweise für Sie.

Ich konnte nicht herausfinden, warum meine Benachrichtigungen gelöscht wurden, als ich den Ausweis löschte ... Ich erhöhe den Ausweis manuell und möchte ihn dann löschen, wenn der Benutzer die App betritt. Dies ist jedoch kein Grund, das Benachrichtigungscenter zu räumen. Möglicherweise möchten sie diese Benachrichtigungen weiterhin sehen oder darauf reagieren.

Negativ 1 macht zum Glück den Trick:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;
TahoeWolverine
quelle
1
Funktioniert es für Sie in iOS9? Ich habe keinen Unterschied beim Setzen eines Abzeichens auf 0 oder -1 bemerkt. In meinem Fall werden immer noch alle Remote-Benachrichtigungen gelöscht.
AlexeyVMP
Ja, das habe ich bei meiner App tatsächlich wieder bemerkt. Ich habe keine Ahnung, was sich geändert hat.
TahoeWolverine
Ich gebe auf, da Apple irgendwie entschieden hat, dass eine App ohne
Ausweisnummer
1

Möglicherweise für den Fall, dass geplante Alarme und nicht gelöschte App-Symbolabzeichen vorliegen.

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

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

for (UILocalNotification* scheduledLocalNotification in scheduledLocalNotifications) {
    [application scheduleLocalNotification:scheduledLocalNotification];
}
[application setApplicationIconBadgeNumber:applicationIconBadgeNumber];
Jong Su Park
quelle
0

Wenn Sie zukünftige Benachrichtigungen wiederholt haben und diese Benachrichtigungen nicht abbrechen möchten, können Sie das Element im Benachrichtigungscenter löschen, indem Sie:

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

Sie können die Benachrichtigung nicht löschen, wenn Ihre App im Vordergrund geöffnet ist, indem Sie die folgende Methode unmittelbar nach Erhalt der lokalen Benachrichtigung aufrufen. Andernfalls erhalten Sie zehntausende Benachrichtigungen. Vielleicht, weil die gleiche Benachrichtigung erneut gilt und jetzt die Zeit zum Feuern ist. Sie behalten also das Feuer, bewerben sich erneut, feuern, bewerben sich ....:

[UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;
zgjie
quelle
0

Wenn Sie sich von Ihrer App abmelden, müssen Sie zu diesem Zeitpunkt eine der folgenden Codezeilen für die Klickmethode der Abmeldeschaltfläche verwenden.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

und das funktioniert perfekt in meiner app.

Vaibhav Shiledar
quelle
0

Sie müssen den folgenden Code in Ihre AppDelegate- applicationDidBecomeActiveMethode einfügen .

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
Bhavesh Patel
quelle
-1

Habe es von hier bekommen . Es funktioniert für 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];
}
Dan L.
quelle