it-swarm.com.de

iOS-Anwendung: Wie werden Benachrichtigungen gelöscht?

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

Ich bin auf Beiträge gestoßen, in denen setApplicationIconBadgeNumber mit einem Nullwert aufgerufen wird, um die Benachrichtigungen zu löschen. Das erscheint mir sehr seltsam, also glaube ich, dass vielleicht eine andere Lösung existiert?

EDIT1:

Ich habe 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 lasse die App über Xcode laufen. Wenn die App minimiert ist und ich die App mit der Benachrichtigung im Benachrichtigungscenter starte, kann ich im Protokoll sehen, dass die didReceiveRemoteNotification aufgerufen wird, und bei Verwendung von Haltepunkten sehe ich, dass die clearNotifications ausgeführt wurde. Die Benachrichtigung bleibt jedoch im Benachrichtigungscenter hängen. Warum?

104
dhrm

Wahrscheinlich, weil Notification Center eine relativ neue Funktion ist, wollte Apple nicht unbedingt ein völlig neues Paradigma für das Löschen von Benachrichtigungen entwickeln. Stattdessen haben sie [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; für mehrere Zwecke eingesetzt, um die Benachrichtigungen zu löschen. Es mag ein bisschen komisch erscheinen, und Apple könnte dies in der Zukunft vielleicht intuitiver machen, aber für den Moment ist es der offizielle Weg.

Ich selbst benutze diesen Ausschnitt:

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

dabei werden stets alle Benachrichtigungen der App vom Notification Center gelöscht.

154
Patrick Perini

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 das Badge in Ihrer application:didReceiveRemoteNotification:-Methode erhöhen, wenn Sie versuchen, die Nachricht aus dem Message Center zu löschen. dh; 

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
116
ADAM

Es kann auch sinnvoll sein, clearNotifications in applicationDidBecomeActive aufzurufen, um die Benachrichtigungen zu löschen, falls sich die Anwendung im Hintergrund befindet und zurückkommt. 

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

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. Für den iOS 10.x-Code müssen Sie import UserNotifications eingeben.

13
James Stonehill

Wenn Sie über geplante lokale Benachrichtigungen verfügen und cancelAllLocalNotifications nicht zum Löschen alter Benachrichtigungen in Notification Center verwenden möchten, können Sie auch die folgenden Aktionen ausführen:

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

Wenn Sie die Variable scheduledLocalNotifications festlegen, werden die alten in Notification Center gelöscht. Wenn Sie sie auf sich selbst setzen, behalten Sie die ausstehenden lokalen Benachrichtigungen bei.

9
ospr

Wenn Sie hierher kommen und sich das Gegenteil fragen (wie ich es war), könnte dieser Beitrag für Sie sein.

Ich konnte nicht herausfinden, warum meine Benachrichtigungen gelöscht wurden, als ich das Badge löschte ... Ich erhöhe das Badge manuell und möchte es dann löschen, wenn der Benutzer die App öffnet. Das ist jedoch kein Grund, das Benachrichtigungscenter zu löschen. Möglicherweise möchten sie diese Benachrichtigungen jedoch noch sehen oder darauf reagieren.

Negativ 1 macht den Trick, zum Glück:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;
3
TahoeWolverine

In Swift verwende ich den folgenden Code in meiner AppDelegate:

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

Möglicherweise gibt es geplante Alarme und nicht gelöschte App-Symbolabzeichen.

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

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

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

Wenn Sie zu einem späteren Zeitpunkt weitere Benachrichtigungen erhalten 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 Dutzende von Benachrichtigungen. Vielleicht, weil die gleiche Benachrichtigung erneut gilt, und jetzt ist es an der Zeit zu schießen, also halten Sie Feuer, wenden Sie erneut an, schießen Sie, wenden Sie sich an ...:

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

In Ihrer AppDelegate-Methode applicationDidBecomeActive müssen Sie den folgenden Code hinzufügen. 

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
0
Bhavesh Patel

Wenn Sie sich von Ihrer App abmelden, müssen Sie zu diesem Zeitpunkt eine Codezeile unterhalb der Klickmethode für die Abmelden-Schaltfläche verwenden.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

und das funktioniert perfekt in meiner app.

0