web-dev-qa-db-fra.com

application iOS: comment effacer les notifications?

J'ai une application iOS où certaines notifications push sont envoyées. Mon problème est que les messages/notifications restent dans le Notification Center sous iOS après leur exploitation. Comment puis-je supprimer une notification pour mon application dans le Centre de notifications lors de la prochaine ouverture de l'application?

Je suis tombé sur des publications dans lesquelles des personnes appellent setApplicationIconBadgeNumber à une valeur zéro pour effacer les notifications. Cela me semble très étrange, alors je pense qu'une autre solution existe peut-être?

EDIT1:

J'ai des problèmes pour effacer les notifications. S'il vous plaît voir mon code ici:

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

J'utilise l'application via Xcode. Lorsque l'application est réduite et que je lance l'application à l'aide de la notification du Centre de notifications, le journal indique que la variable didReceiveRemoteNotification est appelée et, à l'aide des points d'arrêt visibles, que la variable clearNotifications a été exécutée. Mais la notification reste bloquée dans le centre de notifications. Pourquoi?

104
dhrm

Probablement parce que le Centre de notifications est une fonctionnalité relativement nouvelle, Apple ne voulait pas forcément proposer un tout nouveau paradigme pour effacer les notifications. Donc, au lieu de cela, ils ont utilisé [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; à plusieurs fins pour effacer lesdites notifications. Cela peut sembler un peu étrange, et Apple pourrait fournir un moyen plus intuitif de le faire à l'avenir, mais pour le moment c'est le moyen officiel.

Moi-même, j'utilise cet extrait:

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

qui ne manque jamais d'effacer toutes les notifications de l'application à partir du Centre de notifications.

154
Patrick Perini

Juste pour développer la réponse de pcperini. Comme il le mentionne, vous devrez ajouter le code suivant à votre méthode application:didFinishLaunchingWithOptions:;

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

Vous aussi devez incrémenter puis décrémenter le badge dans votre méthode application:didReceiveRemoteNotification: si vous essayez d'effacer le message du centre de messagerie de sorte que, lorsqu'un utilisateur accède à votre application, le message ne soit pas pressé. centre sera également effacer, à savoir;

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

Il peut également être judicieux d’ajouter un appel à clearNotifications dans applicationDidBecomeActive afin que, si l’application est en arrière-plan et revient, les notifications soient également effacées. 

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

Mise à jour pour iOS 10 (Swift 3)

Pour effacer toutes les notifications locales dans les applications iOS 10, vous devez utiliser le code suivant:

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

Ce code gère l’effacement des notifications locales pour iOS 10.x et toutes les versions précédentes d’iOS. Vous aurez besoin de import UserNotifications pour le code iOS 10.x.

13
James Stonehill

Si vous avez des notifications locales planifiées en attente et que vous ne souhaitez pas utiliser cancelAllLocalNotifications pour effacer les anciennes dans le Centre de notifications, vous pouvez également procéder comme suit:

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

Il semble que si vous définissez la variable scheduledLocalNotifications, elle supprime les anciennes dans le Centre de notifications et, si vous la définissez elle-même, vous conservez les notifications locales en attente.

9
ospr

Si vous venez ici en vous demandant le contraire (comme je l'étais), ceci post peut être pour vous.

Je n'arrivais pas à comprendre pourquoi mes notifications étaient effacées lorsque j'ai effacé le badge ... J'incrémente manuellement le badge, puis je souhaite l'effacer lorsque l'utilisateur accède à l'application. Ce n'est pas une raison pour vider le centre de notification, cependant; ils peuvent toujours vouloir voir ou agir sur ces notifications.

Le négatif 1 fait le tour, heureusement:

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

Dans Swift, j'utilise le code suivant dans mon AppDelegate:

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

Peut-être au cas où il y aurait des alarmes planifiées et des badges d'icône d'application non effacés.

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

Lorsque vous avez à l'avenir des notifications répétées, vous ne souhaitez pas annuler ces notifications, vous pouvez effacer l'élément dans le centre de notifications en procédant comme suit:

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

Vous ne pouvez pas effacer les notifications lorsque votre application est ouverte au premier plan en appelant la méthode ci-dessous immédiatement après avoir reçu les notifications locales. Sinon, vous recevrez des dizaines de centaines de notifications. Peut-être parce que la même notification s'applique à nouveau, et que le moment est venu de tirer, alors gardez le feu, appliquez à nouveau, tirez, appliquez ...:

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

Vous devez ajouter le code ci-dessous dans votre méthode AppDelegate applicationDidBecomeActive

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

Lorsque vous vous déconnectez de votre application, vous devez alors utiliser une ligne de code ci-dessous sur la méthode de clic du bouton de déconnexion.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

et cela fonctionne parfaitement dans mon application.

0
Vaibhav Shiledar