web-dev-qa-db-fra.com

Comment supprimer toutes les notifications locales lorsqu'une application est supprimée d'un iPhone

Supposons que je mette 5 notifications locales pour une application iPhone, puis l'utilisateur supprime l'application. Si l'application est réinstallée, elle affiche les notifications précédentes.

Je sais que le code suivant supprime toutes les notifications

[[UIApplication sharedApplication] cancelAllLocalNotifications];

Mais où dois-je mettre ce code pour qu'il s'exécute lorsque l'application est supprimée?

Ou tout autre moyen de résoudre ce problème.

29
Nimit Parekh

Comme d'autres l'ont mentionné, je pense que le meilleur moyen d'y parvenir est d'avoir un indicateur dans didFinishLaunchingWithOptions dans le délégué d'application qui vérifie s'il s'agit du premier lancement ou non. 

Si l'application est lancée pour la première fois, vous pouvez appeler 

[[UIApplication sharedApplication] cancelAllLocalNotifications];

Cela annulera toutes les notifications existantes.

Par exemple:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    // this flag will need to be stored somewhere non-volatile such as using CoreData 
    // or user defaults
    if(flag == nil || [flag count] ==0){ 

       [[UIApplication sharedApplication] cancelAllLocalNotifications];

       // update your flag so that it fails this check on any subsequent launches
       flag = 1;
    }
{
31
Derek Hewitt

Pour Swift 3.0, vous pouvez utiliser 

if (isFirstLaunch){  
  UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
}

Ajoutez ensuite cette méthode pour vérifier s'il s'agit de la première exécution

var isFirstLaunch: Bool {
    get {
        if     (NSUserDefaults.standardUserDefaults().objectForKey("firstLaunchDate") == nil) {
            NSUserDefaults.standardUserDefaults().setObject(NSDate(),     forKey: "firstLaunchDate")
            NSUserDefaults.standardUserDefaults().synchronize()
            return true
        }
        return false
    }
}
3
KIO

Voici ce que j'ai fait:

Dans votre AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    //Check if its first time
    if (![[NSUserDefaults standardUserDefaults] objectForKey:@"is_first_time"]) {
        [application cancelAllLocalNotifications]; // Restart the Local Notifications list
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"is_first_time"];
    }

    return YES;
}

J'espère que ça aide!

3
MontiRabbit

Vous pouvez utiliser UIPasteboard pour stocker un drapeau comme DerekH déjà mentionné.
Quelque chose lie ceci:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([self mustCancelNotifications]) {
        [application cancelAllLocalNotifications];
        [self removeTag];
    } else {
        // Set your local notifications
        [self setFlag];
    }

    //...   

    // Override point for customization after application launch.
    return YES;
}

- (BOOL)mustCancelNotifications
{
    UIPasteboard *past = [UIPasteboard generalPasteboard];
    NSString *s = [past valueForPasteboardType:@"my_app_local_notifications"];
    if (s) {
        return YES;
    }
    return NO;
}

- (void)setFlag
{
    UIPasteboard *past = [UIPasteboard generalPasteboard];
    [past setValue:@"dummy" forPasteboardType:@"my_app_local_notifications"];
}

- (void)removeFlag
{
    UIPasteboard *past = [UIPasteboard generalPasteboard];
    [past setData:nil forPasteboardType:@"my_app_local_notifications"];
}
0
arturdev