web-dev-qa-db-fra.com

Comment puis-je réinitialiser les données NSUserDefaults dans le simulateur iPhone?

J'ai ajouté la récupération de données NSUserDefault à mon application, ce qui est plutôt agréable. Mais pour les tests, j'aimerais réinitialiser toutes les données que j'ai ajoutées à la base de données par défaut, afin que tout soit dans l'état où l'utilisateur lance l'application pour la première fois.

J'ai essayé d'appeler:

[NSUserDefaults resetStandardUserDefaults];

mais cela ne fait rien. Les valeurs par défaut sont toujours enregistrées et peuvent être récupérées.

50
Thanks

Le moyen le plus simple consiste à supprimer l'application du simulateur - comme si vous la retiriez d'un vrai téléphone, en appuyant sur (en cliquant) et en maintenant la pression jusqu'à ce que les icônes commencent à vibrer. Cela supprime toutes les données de l'application, et la prochaine fois que vous installerez à partir de Xcode, ce sera comme la première fois.

Si vous devez conserver d'autres données d'application, vous avez plusieurs options.

Une solution serait d'avoir du code de débogage qui appelle removeObjectForKey: sur chacune de vos clés par défaut.

L'autre consiste à rechercher le répertoire dans lequel la copie du simulateur est installée et à supprimer le fichier contenant les préférences. Utilisez ceci pour trouver l'application:

ls -ld ~/Library/Application\ Support/iPhone\ Simulator/User/Applications/*/*.app

Le chemin complet de votre application contiendra un répertoire dont le nom est un UUID. Dans ce répertoire, recherchez dans le répertoire/répertoire des préférences le fichier de préférences. Supprimez cela et les préférences de l'utilisateur ont disparu.

51
Tom Harrington

Vous voulez NSUserDefaults removePersistentDomainForName. Cela supprimera tous les paramètres utilisateur par défaut pour l'application:

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

Pour plus d'informations sur la classe NSUserDefaults, voir Documents Apple .

Si vous ne souhaitez vous préoccuper que des données du simulateur iOS, vous pouvez le faire via iOS Simulator> Réinitialiser le contenu et les paramètres.

enter image description here

99
memmons

Vous découvrirez peut-être que ce que vous avez "écrit" dans les défauts utilisateur de l'application se trouve dans un fichier.

user name/Library/Preferences/com.theAppYouAreHandling.plist
6
Jiulong Zhao

En fait, cela peut ne pas convenir dans toutes les circonstances, mais comme je ne garde aucune information de valeur dans le simulateur, je viens de réinitialiser le contenu et les paramètres depuis le menu de l'iPhone, depuis le simulateur lui-même.

5
mmc

Dans Swift 2.0, la ligne suivante réinitialise tous les NSUserDefaults d’une application:

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)

5
dane

Jusqu'à Xcode 6 et iOS 8 Simulator, l'emplacement du fichier Plist a changé.

J'ai trouvé le fichier * .plist dans le répertoire suivant:

[1] /Users/SOME-USERNAME/Library/Developer/CoreSimulator/Devices/SOME-DEVICE-ID/data/Library/Preference/SP.UserDefaultsTest.plist

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

3
sys4tron

Voici la version de Swift:

let domainName = NSBundle.mainBundle().bundleIdentifier!       
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName)
2
Ankit Goel

Dans le menu principal du simulateur:

Simulator -> Reset Content and Settings...
1
Andrey

Si vous faites cela de manière unittest, vous pouvez conserver l'état de votre application dans le simulateur actuel au lieu de l'effacer par inadvertance à chaque fois que vous exécuterez également votre unittests. Pour ce faire, vous pouvez simplement conserver les anciennes valeurs de votre domaine d'application dans setUp(), puis les restaurer dans tearDown():

class MyClass_Tests: XCTestCase {
    static let domainName = Bundle.main.bundleIdentifier!
    static var oldUserDefaults: [String : Any]?

    override class func setUp() {
        super.setUp()
        // Hang onto this so we don't inadvertently wipe the app's state while running tests.
        oldUserDefaults = UserDefaults.standard.persistentDomain(forName: domainName)
    }

    override class func tearDown() {
        // Restore the old values.
        UserDefaults.standard.setPersistentDomain(oldUserDefaults!, forName: domainName)
        super.tearDown()
    }

    override func setUp() {
        super.setUp()
        // Wipe the state for each test.
        UserDefaults.standard.removePersistentDomain(forName: MyClass_Tests.domainName)
    }

    override func tearDown() {
        super.tearDown()
    }
}
0
qix

Vous pouvez utiliser removePersistentDomainForName méthode disponible avec NSUserDefaults Class.

Syntaxe:

- (void)removePersistentDomainForName:(NSString *)domainName

Exemple :

NSString *strAppBundleId = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:strAppBundleId];
0
Jayprakash Dubey