2017-01-22 1 views
0

Toutes les méthodes pour obtenir des clés de NSUserDefaults retournent des tas de clés à partir de domaines autres que l'application elle-même (par exemple, NSGlobalDomain). Je veux juste les clés et les valeurs que mon application a définies. Ceci est utile pour déboguer et vérifier qu'il n'y a pas de clés orphelines, etc.NSUserDefaults: comment obtenir uniquement les clés que j'ai définies

Je pourrais ignorer les clés qui ne m'appartiennent pas (si je les connais toutes - pendant le développement j'ai peut-être mis des touches je ne suis pas utiliser plus), mais il pourrait y avoir une collision de clés dans d'autres domaines et je ne verrai pas la valeur de mon application.

Autres discussions suggèrent de regarder le dictionnaire fichier associé à l'application, mais ce n'est pas très élégant. Comment puis-je obtenir uniquement les clés de mon application sous NSUserdefaults?

+0

On ne sait pas exactement de quoi vous avez besoin (terminal, app ...). Si votre application est en sandbox, vous ne pourrez pas voir d'autres valeurs par défaut. BTW approche correcte est de registerDefaults pour les clés dont vous avez besoin (ce qui arrive une fois et ne réécrit pas la clé) et plus tard il suffit de demander leur valeur. –

+0

Je veux le faire dans mon application pendant le développement, et je ne suis intéressé que par les clés et les valeurs que j'ai définies. Au fil du temps, j'ai changé ou arrêté d'utiliser certaines des touches et c'est pourquoi je veux voir toutes les clés que j'ai utilisées. J'utilise userDefaults pour les paramètres de l'application, et il est utile pour moi de voir les paramètres dans le journal chaque fois que je lance l'application pendant le test. – Jeff

Répondre

0

approche élégante

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *bundleIdentifier = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleIdentifierKey]; 
NSDictionary *dict = [defaults persistentDomainForName:bundleIdentifier]; 

approche du fichier:

NSString *bundleIdentifier = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"]; 
NSString *path = [NSString stringWithFormat:@"~/Library/Preferences/%@.plist",bundleIdentifier]; 
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:[path stringByExpandingTildeInPath]]; 
NSArray *keys = [dict allKeys]; 

testé avec sandboxing.

+0

Excellent, accepté. J'ai ajouté deux lignes pour enlever quelques trucs du système dans le plist (au moins c'est dans le mien): 'NSMutableDictionary * myUserDefaults = [NSMutableDictionary dictionaryWithDictionary: dict]; [myUserDefaults removeObjectsForKeys: @ [@ "CaptionDWA_CaptionBehavior", @ "NSWindow Frame NSFontPanel"]] ' – Jeff