Application iOS: comment effacer les notifications?

109

J'ai une application iOS à laquelle certaines notifications push sont envoyées. Mon problème est que les messages / notifications restent dans le centre de notifications dans iOS après avoir été tapés. Comment puis-je supprimer une notification pour mon application dans le centre de notifications à la prochaine ouverture de l'application?

Je suis tombé sur des messages où les gens appellent setApplicationIconBadgeNumberà une valeur zéro pour effacer les notifications. Cela me semble très étrange, alors je crois qu'il existe peut-être une autre solution?

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'exécute l'application via Xcode. Lorsque l'application est réduite et que je démarre l'application en utilisant la notification dans le centre de notifications, je peux voir dans le journal, que le didReceiveRemoteNotificationest appelé et en utilisant des points d'arrêt que je peux voir, que le clearNotificationss'est exécuté. Mais la notification se bloque toujours dans le centre de notifications. Pourquoi?

dhrm
la source

Réponses:

157

Très probablement parce que le Centre de notifications est une fonctionnalité relativement nouvelle, Apple ne voulait pas nécessairement pousser un tout nouveau paradigme pour effacer les notifications. Donc, au lieu de cela, ils ont multi-objectifs [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];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 la méthode officielle.

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 du centre de notifications.

Patrick Perini
la source
cancelAllLocalNotifications est obsolète - developer.apple.com/documentation/uikit/uiapplication/… Vous devez utiliser let center = UNUserNotificationCenter.current() center.removeAllDeliveredNotifications() // To remove all delivered notifications stackoverflow.com/a/40397907/1155650
Rohit Vipin Mathews
119

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

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

Vous devez également incrémenter puis décrémenter le badge dans votre application:didReceiveRemoteNotification:méthode si vous essayez d'effacer le message du centre de messages de sorte que lorsqu'un utilisateur entre dans votre application après avoir appuyé sur une notification, le centre de messages s'efface également, c'est-à-dire;

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
ADAM
la source
Je pense que cancelAllLocalNotifications n'est pas nécessaire.Travaillé pour moi sans cette ligne
Murali
@Murali dépendrait-il de l'utilisation des notifications locales ou non ...?
Alejandro Iván
1
UPDATE :: «cancelAllLocalNotifications 'est obsolète: d'abord obsolète dans iOS 10.0» Donc, si la version de votre application est supérieure à iOS10.0, vous devez utiliser ce UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter]; [center removeAllDeliveredNotifications]; [center removeAllPendingNotificationRequests];
User18474728
21

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

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [self clearNotifications];
}
Bert
la source
15

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 la suppression des notifications locales pour iOS 10.x et toutes les versions précédentes d'iOS. Vous en aurez besoin import UserNotificationspour le code iOS 10.x.

James Stonehill
la source
9

Si vous avez des notifications locales planifiées en attente et que vous ne souhaitez pas utiliser cancelAllLocalNotificationspour effacer les anciennes dans le centre de notifications, vous pouvez également effectuer les opérations suivantes:

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

Il semble que si vous définissez le, scheduledLocalNotificationsil efface les anciens dans le centre de notifications, et en le définissant sur lui-même, vous conservez les notifications locales en attente.

ospr
la source
1
Cela fonctionne comme un charme pour moi sur iOS 9. Je ne voulais pas annuler toutes mes notifications car elles se répètent dans le temps (tous les jours ou toutes les semaines). Et de cette façon, je nettoie tout le contenu sans les supprimer.
superpuccio
1
La meilleure solution que j'ai vue jusqu'à présent. Quelqu'un sait-il si cela fonctionne sur iOS 8?
duncanc4
@ duncanc4 la dernière fois que je l'ai testé sur iOS 8, cela fonctionnait.
ospr
Où appelleriez-vous cela dans l'application?
Alex Zavatone
Alex, vous devriez l'appeler chaque fois que vous avez besoin d'effacer les notifications dans le centre de notifications. Je l'appelle à la fois dans mes méthodes AppDelegate applicationDidBecomeActive:et application:didReceiveLocalNotification:.
ospr
3

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

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

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

Je ne pouvais pas comprendre pourquoi mes notifications s'effaçaient lorsque j'ai effacé le badge ... J'incrémente manuellement le badge et je souhaite l'effacer lorsque l'utilisateur entre dans 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 l'affaire, heureusement:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;
TahoeWolverine
la source
1
Cela fonctionne-t-il pour vous dans iOS9? Je n'ai remarqué aucune différence en définissant un badge sur 0 ou sur -1. Il efface toujours toutes les notifications à distance dans mon cas.
AlexeyVMP
Oui, j'ai recommencé à le remarquer avec mon application; Je n'ai aucune idée de ce qui a changé.
TahoeWolverine
J'abandonne
1

Peut-être au cas où il y aurait des alarmes programmées et des badges d'icônes 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];
Parc Jong Su
la source
0

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

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

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

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

Lorsque vous vous déconnectez de votre application, à ce moment-là, vous devez utiliser une ligne de code ci-dessous sur votre méthode de clic sur le bouton de déconnexion.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

et cela fonctionne parfaitement dans mon application.

Vaibhav Shiledar
la source
0

Vous devez ajouter le code ci-dessous dans votre applicationDidBecomeActiveméthode AppDelegate .

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

Je l'ai obtenu d' ici . Cela fonctionne pour 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
la source