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 rootViewController
viewDidLoad
:
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
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.
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
É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é:
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
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
c'est un bogue, et vous pouvez supprimer NSUserDefaults avec le code suivant
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
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.
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.
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.
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.