web-dev-qa-db-fra.com

Effacement des NSUserDefaults

J'utilise +[NSUserDefaults standardUserDefaults] pour stocker les paramètres de l'application. Cela consiste en environ une douzaine de valeurs de chaîne. Est-il possible de supprimer ces valeurs de manière permanente au lieu de simplement les définir à une valeur par défaut?

281
TonyNeallon

Vous pouvez supprimer le domaine persistant de l'application comme suit:

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

Dans Swift 3 et versions ultérieures:

if let bundleID = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundleID)
}

Ceci est similaire à la réponse de @samvermette mais est un peu plus propre IMO.

507
Christopher Rogers

Ce code réinitialise les valeurs par défaut du domaine d'enregistrement:

[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];

En d'autres termes, il removeObjectForKey pour chaque clé que vous avez déjà enregistrée dans cette application.

Crédits à Ken Thomases sur ce Apple Forums de développeurs fil.

102
samvermette

Avez-vous essayé d'utiliser -removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
96
sbooth

Voici la réponse dans Swift:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
30
juliensaad

Si vous en avez besoin pendant le développement, vous pouvez également réinitialiser votre simulateur en supprimant tous les NSUserDefaults.

Simulateur iOS -> Réinitialiser le contenu et les paramètres ...

N'oubliez pas qu'il supprimera également toutes les applications et tous les fichiers du simulateur.

28
Roger Sanoli
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
14
folse

En rapide:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
7
Adam Waite

J'adore les extensions quand elles rendent le code plus propre:

extension NSUserDefaults {
    func clear() {
        guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
            return
        }

        self.removePersistentDomainForName(domainName)
    }
}
5
Valentin Shergin

Remarque: cette réponse a également été mise à jour pour Swift.

Qu'en est-il de l'avoir sur une seule ligne?

Prolonger la réponse de @Christopher Rogers - celle qui est acceptée.

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];

et oui, vous aurez parfois besoin de synchronize il,

[[NSUserDefaults standardUserDefaults] synchronize];

J'ai créé une méthode pour le faire,

- (void) clearDefaults {
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

rapide?

Avec Swift c'est encore plus facile.

extension UserDefaults {
    class func clean() {
        guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
        standard.removePersistentDomain(forName: aValidIdentifier)
        standard.synchronize()
    }
}

et utilisation:

UserDefaults.clean()
5
Hemang

J'ai trouvé ça:

osascript -e 'tell application "iOS Simulator" to quit'
xcrun simctl list devices | grep -v '^[-=]' | cut -d "(" -f2 | cut -d ")" -f1 | xargs -I {} xcrun simctl erase "{}"

Source: https://Gist.github.com/ZevEisenberg/5a172662cb576872d1ab

5
Daniel Gomez Rico

C'est un bogue ou autre chose, mais la removePersistentDomainForName ne fonctionne pas en effaçant toutes les valeurs de NSUserDefaults.

Donc, la meilleure option est de réinitialiser la PersistentDomain et vous pouvez le faire de la manière suivante:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
2
Sohil R. Memon

Toutes les réponses ci-dessus sont très pertinentes, mais si quelqu'un ne peut toujours pas réinitialiser les valeurs par défaut de l'utilisateur pour l'application supprimée, vous pouvez réinitialiser les paramètres de contenu de votre simulateur, et cela fonctionnera.enter image description here

2
iDevAmit

Développer la réponse de @ folse ... Je pense qu'une implémentation plus correcte serait ...

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] persistentDomainForName: appDomain];
    for (NSString *key in [defaultsDictionary allKeys]) {
      NSLog(@"removing user pref for %@", key);
      [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
    }

... appelle la méthode persistentDomainForName de NSUserDefault. En tant qu'état de la documentation, la méthode "Renvoie un dictionnaire contenant les clés et les valeurs du domaine persistant spécifié". Appelant dictionaryRepresentation: à la place, vous obtiendrez un dictionnaire qui inclura probablement d'autres paramètres, dans la mesure où il s'applique à une portée plus large.

Si vous avez besoin de filtrer les valeurs à réinitialiser, effectuez une itération sur les touches. De toute évidence, si vous voulez simplement supprimer toutes les préférences de l'application sans égard, alors l'une des autres méthodes ci-dessus est la plus efficace.

1
markeissler

Essayez ceci, ça marche pour moi.

Une seule ligne de code

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
0
Jaywant Khedkar

si le paramètre de l'application nécessitant une réinitialisation est nsuserdefault pour l'accès au microphone (dans mon cas), Anthony McCormick répond simplement ( Iphone - Comment activer l'accès des applications aux médias sur le périphérique? - ALAssetsLibraryErrorDomain Code = -3312 " Accès global refusé " ).

sur le périphérique, sélectionnez Paramètres> Général> Réinitialiser> Réinitialiser les avertissements d'emplacement.

0
tmr