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

95

cela peut sembler vrai NOOB! Je veux vérifier si c'est la deuxième fois que l'utilisateur entre dans mon application, afin de conserver le nombre d'exécutions que j'utilise NSUserDefaults. J'ai mis en œuvre le code suivant dans mon rootViewControllerde » viewDidLoadmé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é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 apparaissent toujours. J'exécute mon application sur un simulateur iOS en utilisant xCode6-beta et en ciblant l'application sur iOS 8

Reza Shayestehpour
la source
2
Avez-vous essayé de tester sur un appareil réel?
Henry F
Vous devez l'effacer manuellement sur le simulateur. Voici comment .
dasblinkenlight
Veuillez cocher la bonne réponse pour que cette question ne soit plus sans réponse
anders
1
@Reza: [[NSUserDefaults standardUserDefaults] setObject: selectedLists forKey: UserID]. Mon application plante ici dans ios8 bien qu'elle fonctionne correctement dans ios6 et ios7. Ici, les listes sélectionnées dans NSMutable Array et UserId est une chaîne.
Manthan
@Manthan c'est en quelque sorte un problème différent, mais j'ai rencontré le même problème ailleurs et la raison qui a causé le plantage était que l'objet que j'enregistrais pour une clé était NSMutableArrayqu'il a été enregistré en tant que NSArrayet que sa modification a fait planter mon application. .. Je recommande d'enregistrer un NSArrayet lorsque vous souhaitez l'utiliser plus tard, le cast en NSMutableArrayutilisation [NSMutableArray arrayWithArray:array];. J'espère que cela aide.
Reza Shayestehpour

Réponses:

169

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

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

  • Cependant, NSUserDefaults ne sont PAS supprimés lorsque vous supprimez une application du simulateur.
  • Ils sont correctement supprimés lorsque vous les supprimez d'un appareil 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 bogue btw

Anders
la source
45
Je l'ai testé sur iOS 8 GM et le bogue existe toujours. Très ennuyant.
Manfred Scheiner
1
Je peux également confirmer ce comportement de buggy dans le simulateur Xcode 6 GM et iOS 8 (12A365)!
Boris Brdarić
1
Lien Open Radar existant pour ceux qui souhaitent suivre le cas: openradar.appspot.com/18540702
viggio24
1
On dirait que le bogue est corrigé sur le SDK 8.1 après la mise à jour vers XCode 6.1 (6A1052d)
kas-kad
2
Pour toute personne confrontée au même problème. Si vous avez plus d'une application dans le même groupe et qu'elles utilisent toutes des groupes d'applications (ACTIVÉ sous fonctionnalités), vous devrez supprimer toutes les applications de l'appareil pour que les valeurs par défaut de l'utilisateur soient effacées. Étant donné que les valeurs par défaut de l'utilisateur sont partagées, même si l'une des applications est sur l'appareil, elle ne sera pas supprimée, car cette application utilisera les valeurs par défaut de l'utilisateur.
Ankit Srivastava
14

É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 du simulateur iOS 8 / Xcode 6 GM soit résolu:

  1. Vous pouvez supprimer manuellement le fichier plist dans lequel NSUserDefaultssont stockés. Il se trouve actuellement à ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist Il est un peu fastidieux de trouver le bon simulateur avec lequel travailler parmi les noms de répertoire UUID. EDIT : 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 "chirurgie" sur ce plist (en utilisant peut-être une phase de construction de script run) en utilisant plistbuddy, par exemple

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

FluffulousChimp
la source
Il vous manque / data / after / * some_device_id * /
Le mec
5

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

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

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

Ankit Srivastava
la source
4

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.

ppalancica
la source
1
La réinitialisation du contenu et des paramètres fonctionne bien et je n'ai pas d'appareil pour le moment à vérifier. tnx :)
Reza Shayestehpour
4

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

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
Ygweric
la source
2

Bien que ce soit toujours un bogue, une autre option pourrait être de supprimer la ou les clés spécifiques dans NSUserDefaults. La plupart du temps, lors du test / développement, nous ne nous soucions que de quelques clés et pas de tout dans NSUserDefaults. Si vous ne vous souciez que de quelques clés, je vous 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 removeObjectForKeysimule la première exécution de l'application, la mise en commentaire simulera toutes les exécutions ultérieures de l'application.

AdamT
la source
2

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

[1] / Users / SOME-USERNAME / Library / Developer / 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: la suppression manuelle du fichier localisé du chemin [1] et les NSUserDefaults ont disparu.

Ainsi, la manière ennuyeuse de réinitialiser le simulateur n'est plus nécessaire.

sys4tron
la source