web-dev-qa-db-fra.com

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

cela peut sembler réel NOOB! Je veux vérifier si c'est la deuxième fois que l'utilisateur entre dans mon application, donc pour garder le nombre de cycles, j'utilise NSUserDefaults. J'ai implémenté le code suivant dans ma méthode rootViewControllerviewDidLoad:

    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ésinstalle (supprime et réinstalle) l'application selon ici et ici les données doivent être effacées, mais ce n'est pas le cas. et après la réinstallation de l'application, les données précédentes sont toujours affichées. J'utilise mon application sur un simulateur iOS avec xCode6-beta et cible l'application sur iOS 8

92
Reza Shayestehpour

Je pense que cela est dû à un bug dans le simulateur bêta iOS8.

Le comportement attendu est que, lorsque l'application est supprimée, les NSUserDefaults de cette application sont également supprimés.

  • Toutefois, les NSUserDefaults sont ET NON supprimés lorsque vous supprimez une application du simulateur.
  • Ils sont correctement supprimés lorsque vous les supprimez d'un périphérique physique exécutant iOS8.

Une solution rapide et ennuyeuse pour l'instant consiste à cliquer sur, iOS Simulator -> Réinitialiser le contenu et les paramètres.

Xcode 9.2 avec Simulator 10 présente toujours ce problème. L'option de menu est maintenant Matériel .. Effacer tout le contenu et les paramètres

J'ai soumis un rapport de bug

166
anders

Étant donné que la réinitialisation du contenu et des paramètres est une option nucléaire, vous pouvez envisager deux autres options jusqu'à ce que le bogue sur le simulateur iOS 8/Xcode 6 GM soit corrigé:

  1. Vous pouvez supprimer manuellement le fichier plist où les NSUserDefaults sont stockés. Ceci est actuellement situé à l'adresse ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist Il est un peu fastidieux de trouver le bon simulateur à utiliser parmi les noms de répertoires UUID. [~ # ~] modifier [~ # ~] : 2014-10-28 20-34-52 Chemin correct: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. Vous pouvez effectuer une "opération chirurgicale" sur cette liste (en utilisant éventuellement une phase de construction de script d’exécution) en utilisant plistbuddy p. Ex.

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

14
FluffulousChimp

c'est un bogue, et vous pouvez supprimer NSUserDefaults avec le code suivant

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

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.

4
ppalancica

Pour toute personne confrontée au même problème.

Si vous avez plus d'une application dans le même groupe et que tous utilisent des groupes d'applications (ON dans les capacités), vous devrez supprimer toutes les applications de l'appareil pour que les valeurs utilisateur par défaut soient effacées.

Étant donné que les valeurs utilisateur par défaut sont partagées, même si l'une des applications se trouve sur l'appareil, elle ne sera pas supprimée car cette application utilisera les valeurs utilisateur par défaut.

2
Ankit Srivastava

Dans mon cas, j'ai trouvé le fichier * .plist dans le répertoire suivant:

[1]/Users/ SOME-USERNAME /Bibliothèque/Développeur/CoreSimulator/Devices/ SOME-DEVICE-ID /data/Library/Preferences/SP.UserDefaultsTest.plist

Problème: Suppression de l'application dans xCode 6 (simulateur iOS 8) mais le fichier reste sur le disque, comme mentionné ci-dessus.

Solution: Suppression manuelle du fichier localisé dans le chemin [1] et suppression du NSUserDefaults.

Ainsi, la manière agaçante de réinitialiser le simulateur n’est plus nécessaire.

2
sys4tron

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. La commenter simulera toutes les exécutions d'application ultérieures.

2
AdamT