97 votes

NSUserDefaults non effacé après la désinstallation de l'application sur le simulateur

cela peut sembler vrai NOOB! Je veux vérifier si c'est la deuxième fois que l'utilisateur entre dans mon application, de manière à conserver la course comte je suis à l'aide d' NSUserDefaults. J'ai implémenté le code suivant dans mon rootViewControllers' viewDidLoad méthode:

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

    if ([userDefaults integerForKey:@"runCount"] != 1) {
        //not the 2nd run
        [userDefaults setInteger:1 forKey:@"runCount"];
        NSLog(@"not 2nd run");
    } else {
        //second run or more
        NSLog(@"2nd run");
    }

    [userDefaults synchronize];

tout fonctionne bien, mais le problème est que lorsque je désinstaller(supprimer et ré-installer) la demande selon les ici et ici, les données doivent être effacées, mais il n'est pas et après ré-installation de l'application précédente de données est toujours à l'affiche. Je suis en cours d'exécution de mon application sur le simulateur iOS à l'aide de xCode6-bêta et le ciblage de l'application sur iOS 8

172voto

anders Points 355

Je pense que cela est dû à un bogue dans le iOS8 Beta Simulateur.

Le comportement attendu est que lorsque l'application est supprimée, la NSUserDefaults pour cette application sont supprimées.

  • Cependant, NSUserDefaults sont PAS supprimées lorsque vous supprimez une application dans le simulateur.
  • Ils sont correctement supprimés lorsque vous supprimez-les à partir d'un périphérique physique exécutant iOS8.

Un moyen rapide et ennuyeux solution est de cliquer, Simulateur iOS -> Réinitialiser le Contenu et les Paramètres

J'ai envoyé un rapport de bug btw

14voto

NSBum Points 6570

Depuis la Réinitialisation des Paramètres et de Contenu est une option nucléaire, vous pourriez envisager deux autres options jusqu'à ce que le bug sur iOS 8/Xcode 6 GM simulateur est adressée:

  1. Vous pourriez supprimer manuellement le fichier plist où l' NSUserDefaults sont stockés. C'est actuellement situé à l' ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist C'est un peu fastidieux de trouver le bon simulateur de travailler avec parmi les UUID des noms de répertoire. EDIT: 2014-10-28 20-34-52 chemin d'accès Correct: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. Vous pourriez exécuter "chirurgie" plist (à l'aide d'une exécution d'un script phase de construction peut-être) à l'aide de plistbuddy par exemple

/usr/libexec/plistbuddy -c "Set :BSDidMoveSqliteDb 0" path_to_plist

4voto

ppalancica Points 1069

Le code devrait fonctionner correctement sur l'appareil. Peut-être quelques bugs dans le simulateur.

Essayez de réinitialiser le contenu et les paramètres du simulateur.

4voto

ygweric Points 233

c'est un bug, et vous pouvez supprimer NSUserDefaults will suivant le code

  NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
 

2voto

AdamT Points 3176

Bien qu'il s'agisse toujours d'un bogue, une autre option pourrait consister à supprimer la ou les clés spécifiques dans NSUserDefaults. La plupart du temps, lors des tests / développements, nous ne nous intéressons qu'à quelques clés et pas à tout dans NSUserDefaults. Si vous ne vous souciez que de quelques clés que je propose d'ajouter removeObjectForKey :

 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// ADD THIS TO SIMULATE CLEAN/EMPTY DEFAULTS, COMMENT OUT AFTER INITIAL EXECUTION.
// This will cause the TRUE case to be executed.
[userDefaults removeObjectForKey:@"runCount"]

NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

if ([userDefaults integerForKey:@"runCount"] != 1) {
    //not the 2nd run
    [userDefaults setInteger:1 forKey:@"runCount"];
    NSLog(@"not 2nd run");
} else {
    //second run or more
    NSLog(@"2nd run");
}

[userDefaults synchronize];
 

L'ajout de removeObjectForKey simule la première exécution de l'application et sa mise en commentaire simule toutes les exécutions d'application ultérieures.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X