Un moyen facile de voir les NSUserDefaults enregistrés?

225

Existe-t-il un moyen de voir ce qui a été enregistré NSUserDefaultsdirectement? Je voudrais voir si mes données ont été enregistrées correctement.

Ethan
la source
3
Utilisez ceci pour obtenir l'emplacement de votre répertoire d'applications: imprimez (NSHomeDirectory ()) à partir de cet emplacement, accédez à Bibliothèque> Préférences> <yourAppsBundleName.plist> ce sera l'endroit où NSUserDefaults enregistre vos données.
Bobby

Réponses:

162

Vous pouvez trouver le fichier pList pour votre application dans le simulateur si vous allez sur:

/ users / votre nom d'utilisateur / Library / Application Support / iPhone Simulator / <Sim Version> / Applications

Ce répertoire a un tas de répertoires nommés GUID. Si vous travaillez sur quelques applications, il y en aura quelques-unes. Vous devez donc trouver votre application binaire:

find . -name foo.app
./1BAB4C83-8E7E-4671-AC36-6043F8A9BFA7/foo.app

Allez ensuite dans le répertoire Library / Preferences du répertoire GUID. Alors:

cd 1BAB4C83-8E7E-4671-AC35-6043F8A9BFA7/Library/Preferences

Vous devriez trouver un fichier qui ressemble à:

<Bundle Identifier>.foo.pList

Ouvrez-le dans l'éditeur pList et parcourez les valeurs persistantes au contenu de votre cœur.

RedBlueThing
la source
12
J'ai trouvé que cela avait changé dans les versions ultérieures de XCode. Vous le trouverez maintenant dans un répertoire sous le numéro de version ios actuel au lieu d'Utilisateur - par exemple / users / votre nom d'utilisateur / Library / Application Support / iPhone Simulator / 4.3 / Applications
nevster
Intéressant ... Il semble que si vous effectuez des tests unitaires OCMock / SenTestingKit avec NSUserDefaults, alors NSUserDefaultsils ne sont pas conservés dans un fichier .plist mais plutôt gérés en mémoire: stackoverflow.com/questions/6193597/…
ma11hew28
Comment le visualiser pour une application déjà installée? Mon client a téléchargé l'application depuis l'Appstore et quelque chose ne va pas. Je dois vérifier le fichier
NSUserDefaults
Votre client - si vous pouvez lui parler et qu'il est un peu averti - pourrait utiliser un outil comme PhoneView pour avoir accès au système de fichiers de son téléphone et copier le fichier du téléphone pour vous l'envoyer.
Daniel Schneller
13
Le chemin a été modifié en: ~ / Library / Developer / CoreSimulator / Devices
Brainware
355

Vous pouvez imprimer tous les NSUserDefaults actuels dans le journal:

Juste les clés:

NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);

Clés et valeurs:

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
marshn
la source
1
THX, celui-ci est plus efficace ~
acoustique
3
Apple pourrait faire un simple visualiseur dans XCode pour cela. Comme la visionneuse de plist. Mais non, ils ne veulent pas rendre les choses faciles.
GeneCode
79

Dans Swift, nous pouvons utiliser les éléments suivants: -

Swift 3.x et 4.x

Pour obtenir toutes les clés et valeurs:

for (key, value) in UserDefaults.standard.dictionaryRepresentation() {
    print("\(key) = \(value) \n")
}

Pour récupérer la représentation complète du dictionnaire des valeurs par défaut de l'utilisateur:

print(Array(UserDefaults.standard.dictionaryRepresentation()))

Pour récupérer les clés:

// Using dump since the keys are an array of strings.
dump(Array(UserDefaults.standard.dictionaryRepresentation().keys))

Pour récupérer les valeurs:

Nous pouvons également utiliser le vidage ici, mais cela renverra la hiérarchie d'héritage complète de chaque élément du tableau de valeurs. Si plus d'informations sur les objets sont nécessaires, utilisez dump, sinon continuez avec l'instruction print normale.

// dump(Array(UserDefaults.standard.dictionaryRepresentation().values))
print(Array(UserDefaults.standard.dictionaryRepresentation().values))

Swift 2.x

Pour récupérer la représentation complète du dictionnaire des valeurs par défaut de l'utilisateur:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation())

Pour récupérer les clés:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys.array)

Pour récupérer les valeurs:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().values.array)
footyapps27
la source
40

Vous pouvez vérifier les valeurs de chaque clé du tableau, renvoyées par

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]
Morion
la source
3
Cela a également fonctionné dans le débogueur en utilisant cette commande: (lldb) "po [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]"
Ethan Parker
21

J'utilise parfois l'extrait de code suivant pour imprimer l'emplacement de mon fichier NSUserDefaults lors de l'exécution dans le simulateur

NSArray * path = NSSearchPathForDirectoriesInDomains (
   NSLibraryDirectory, NSUserDomainMask, YES);
NSString * folder = [chemin objectAtIndex: 0];
NSLog (@ "Vos NSUserDefaults sont stockés dans ce dossier:% @ / Preferences", dossier);

Il donne le chemin vers le dossier des préférences

Vos NSUserDefaults sont stockés dans ce dossier: / Users / castle / Library / Application Support / iPhone Simulator / User / Applications / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Library / Preferences

Votre fichier NSUserDefaults se trouve dans le dossier des préférences et est nommé en fonction de votre préfixe et du nom de l'application, par exemple

dk.castleandersen.dreamteam.grid.plist

Je m'attends à ce qu'il en soit de même pour le périphérique réel.

Château de Niels
la source
j'aime cette réponse. Il est stable et fonctionnera toujours, espérons-le!
lucianoenrico
7

Facile, puisque le nom du fichier plist est <app-bundle-identifier>.plist, vous pouvez utiliser la findcommande pour trouver son chemin. Mais cela prendra très longtemps si vous recherchez tout votre ordinateur, vous devez donc choisir une bonne portée, comme ~/Library/Developer/CoreSimulatorpour Xcode 6.

exemple:

find ~/Library/Developer/CoreSimulator -type f -name com.awesome.app.plist

la sortie sera quelque chose comme ça ...

/Users/hlung/Library/Developer/CoreSimulator/Devices/B61913F6-7D7C-4E45-AE2F-F45220A71823/data/Containers/Data/Application/E4CC51CF-11E5-4168-8A74-6BAE3B89998F/Library/Preferences/com.awesome.app.plist

Et à partir de là, vous pouvez utiliser la opencommande. Ou si vous utilisez iTerm2 , il vous suffit de cliquer avec le bouton droit sur le chemin pour l'ouvrir.

Hlung
la source
7

Dans Swift 4.0

//func dictionaryRepresentation() -> [String : AnyObject]

parce que dictionaryRepresentation de NSUserDefaults.standardUserDefaults () renvoie [String: AnyObject]

Nous l'avons jeté dans un NSDictionary. Ensuite, en l'entourant de parenthèses '()' nous permettra d'appeler .allKeys ou .allValues ​​comme vous le feriez sur n'importe quel NSDictionary

 print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)
RyanTCB
la source
6

Utilisez le code ci-dessous.

NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Mr.Javed Multani
la source
Brillant! Intéressant de voir comment les meilleures réponses sont généralement les plus courtes. La navigation dans les répertoires en mode terminal est rarement nécessaire. De toute évidence, les geeks aiment l'approche de la porte arrière, peut-être le pirate secret en eux?
John
Merci, mais je ne peux pas vous avoir. Ce que vous voulez dire?
Mr.Javed Multani
5

Pour les applications OS X , au lieu de trouver le fichier plist par défaut de l'application, il est plus simple d'utiliser l' defaultsutilitaire de ligne de commande.

NOM

 defaults -- access the Mac OS X user defaults system

SYNOPSIS

 defaults [-currentHost | -host hostname] read [domain [key]]

 defaults [-currentHost | -host hostname] read-type domain key

 defaults [-currentHost | -host hostname] write domain { 'plist' | key 'value' }

 defaults [-currentHost | -host hostname] rename domain old_key new_key

 defaults [-currentHost | -host hostname] delete [domain [key]]

 defaults [-currentHost | -host hostname] { domains | find word | help }

LA DESCRIPTION

defaultspermet aux utilisateurs de lire, d'écrire et de supprimer les valeurs par défaut de l'utilisateur Mac OS X à partir d'un shell de ligne de commande. Les applications Mac OS X et d'autres programmes utilisent le système par défaut pour enregistrer les préférences de l'utilisateur et d'autres informations qui doivent être conservées lorsque les applications ne sont pas en cours d'exécution (comme la police par défaut pour les nouveaux documents ou la position d'un panneau d'informations). La plupart de ces informations sont accessibles via le panneau Préférences d'une application, mais certaines ne le sont pas, comme la position du panneau Info. Vous pouvez accéder à ces informations avecdefaults

Exemple:

$ defaults read com.apple.Safari
{
    AutoplayPolicyWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
    AutoplayQuirksWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
    DefaultBrowserPromptingState2 = 4;
    ...
weevilgenius
la source
4

Pour Xcode 7

NSUserDefaults standardDefaults sont stockés ici:

/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Data/Application/{UUID}

NSUserDefaults pour un groupe de suites / applications sont stockés ici:

/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Shared/AppGroup/{UUID}/Library/Preferences/{GROUP_NAME}.plist

Je recommanderais d'utiliser https://github.com/scinfu/NCSimulatorPlugin car de nos jours tout est derrière les UUID et sont difficiles à trouver. Il permet un accès facile à vos répertoires d'application de simulateur.

user1270061
la source
2

J'ai construit cette méthode sur la base de la suggestion de Morion pour une meilleure présentation. Utilisez-le en appelant[self logAllUserDefaults]

- (void) logAllUserDefaults
{
    NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys];
    NSArray *values = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allValues];
    for (int i = 0; i < keys.count; i++) {
        NSLog(@"%@: %@", [keys objectAtIndex:i], [values objectAtIndex:i]);
    }
}
Julian F. Weinert
la source
2
Puis-je vous suggérer d'appeler cette fonction "logAllUserDefaults" car elle n'obtient pas réellement les valeurs par défaut?
markrickert
À droite, @markrickert. On pourrait peut-être alors créer un dictionnaire et le renvoyer.
Julian F. Weinert
1
Ou tout simplement .. NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(Presque comme dans la réponse la plus votée ci-dessus.)
matsr
2

Recherchez l'application Mac appelée SimPholders2 . Il vit dans la barre de menus et répertorie tous les simulateurs que vous avez utilisés, puis affiche chacune de vos applications. Sélectionnez-en un et vous obtenez une nouvelle fenêtre du Finder, déjà ouverte dans le répertoire de l'application. Cela facilite la recherche de votre application et de tous ses répertoires. C'est un énorme gain de temps (et j'ai facilement fait un don à l'auteur).

Jeff
la source
2

Simulator App

Ce script shell recherche le nom de l'application, obtient l' ID de l' ensemble et ouvre les dossiers contenant les fichiers Plist .

#!/bin/bash

appname="$1"
[ -z $appname ] && read -p "Application name : " appname

apppath=$(find ~/Library/Developer/CoreSimulator/Devices/ -name "$appname.app" -print -quit)
if [[ ! -z $apppath ]]; then
    appbundle=$(osascript -e "id of app \"$apppath\"")
    find ~/Library/Developer/CoreSimulator/Devices/ -name "$appbundle.plist" -exec bash -c 'open "$(dirname "$1")"' -- {} \;
else
    echo "No application found by that name: $appname.app"
fi

Version de script étendue

Usage: iphone-app-folder "My App"

#!/bin/bash
appname="$1"
[ -z "$appname" ] && read -p "Application name : " appname

apppath=$(find ~/Library/Developer/CoreSimulator/Devices -name "$appname.app" -print -quit)
if [[ ! -z $apppath ]]; then
    appbundle=$(osascript -e "id of app \"$apppath\"")
    echo "Found app $appname (${appbundle})"
    echo -e "\033[1;30m$apppath\033[0m"
    plists=$(find ~/Library/Developer/CoreSimulator/Devices -name "$appbundle.plist" -print -quit)
    count=$(echo plists | wc -l | sed "s/ //g")
    if [[ $count -eq 1 ]] && [[ -f "$plists" ]]; then
        echo -e "\033[1;32mUserDefaults found for $appname\033[0m"
        echo -e "\033[1;30m$plists\033[0m"
        plistutil -i "$plists"
        /usr/bin/open $(dirname "$plists")
    elif [[ ${#plists} -gt 0 ]]; then
        echo -e "\033[1;32mUserDefaults found for $appname\033[0m"
        i=1
        while read line; do
            echo "[${i}] ${line} "
            i=$((i+1))
        done < <(echo "$plists")
        echo
        read -p "Select defaults to read: [1-${count}] " choice
        plist=$(echo ${plists} | sed -n "${choice}p")
        plistutil -i "$plist"
        /usr/bin/open $(dirname "$plist")
    else
        echo -e "\033[31mNo UserDefaults plist found for $appname\033[0m"
    fi
else
    echo -e "\033[31mNo application found by that name: $appname.app\033[0m"
fi

Application trouvée My App (com.organisation.MyApp) / Users / organization / Library / Developer / CoreSimulator / Devices / 3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83 / data / Containers / Bundle / Application / 960A5232-219D-4C46-8CA3- 01E259D8DDAD / My App.app

UserDefaults trouvé pour My App

Mac App

defaults read com.bundleid.app
Atika
la source
1

Dans Swift 2.2

let path = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)
let folder = path[0]
NSLog("Your NSUserDefaults are stored in this folder: \(folder)/Preferences")

affichera l'emplacement du dossier de fichiers plist de NSUserDefaults dans la console de débogage Xcode. Copiez la chaîne de chemin d'accès. Ouvrez votre Finder, sélectionnez Aller au dossier dans l'élément de menu Aller, Collez la chaîne de chemin. Double-cliquez sur le fichier plist. Vous verrez le contenu dans votre éditeur Xcode.

Ne fonctionne que dans Simulator

Merci @Niels Castle

charles.cc.hsu
la source
C'est la seule solution qui a fonctionné pour trouver le plist userdefaults sur le simulateur pour xcode 9.4
anoo_radha
1

Je garde un raccourci sur mon bureau vers le dossier du simulateur où il conserve les applications, c'est-à-dire:

/Users/gary/Library/Application Support/iPhone Simulator/User/Applications

Trié par date la plus récente, accédez simplement au dossier d'application Bibliothèque / Préférences le plus récent et affichez le fichier dans l'éditeur de plist.

progrmr
la source
1

Swift 3

print(UserDefaults.standard.dictionaryRepresentation())
Ego Slayer
la source
1

Pour les applications MacOS
Accédez à: /Users/{User}/Library/Containers/com.{your company}. {Your app} / Data / Library / Preferences et ouvrez la pList de votre application avec Xcode.

Uwe
la source
1

Solution Swift 5 Xcode 11.2

Il s'agit du chemin complet où vos valeurs de clé UserDefaults seront dans un fichier plist. Suivez et recherchez le fichier .plist de votre identifiant de bundle d'application.

/ Utilisateurs / 'Votre nom d'utilisateur' / Bibliothèque / Développeur / CoreSimulator / Périphériques / 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2 / données / Conteneurs / Données / Application / 56D7CE31-9A8B-4371-9B0F-9604E239423B0 / Bibliothèque / Préférences

Voici "4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2" est votre ID de périphérique

et "56D7CE31-9A8B-4371-9B0F-9604E239423B0" est votre ID d'application

Je les obtiens normalement en triant les dossiers par date de dernière modification dans le Finder. Et le dossier modifié le plus récent est l'ID de mon appareil et l'ID de l'application.

Prendre plaisir!

Sajid Zeb
la source
0

Vous pouvez NSLog chaque valeur que vous définissez, comme:

NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
Tom Irving
la source
0

Après avoir lu la réponse acceptée à cette question, j'ai rassemblé ce script simple qui ouvre les fichiers plist utilisés par le simulateur iOS pour stocker les NSUserDefaultspréférences, et bien qu'il suppose une certaine configuration (s'adapte parfaitement à la mienne), il peut fonctionner comme point de départ pour d'autres .

$ cat open-prefs-plist.sh
#!/bin/sh

# The project name based on the workspace path, e.g. "MyProject" from "./MyProject.xcworkspace"
WORKSPACE_NAME=$(echo `find . -name *.xcworkspace -type d -exec basename {} \;` | cut -d'.' -f1)
SIMULATOR_PATH="$HOME/Library/Application Support/iPhone Simulator"
# The App's bundle ID taken from its info plist, e.g "com.myproject" from "./MyProject/MyProject-Info.plist"
BUNDLE_ID=`/usr/libexec/PlistBuddy -c Print:CFBundleIdentifier $WORKSPACE_NAME/$WORKSPACE_NAME"-Info.plist"`
# Open all plist files in the simulator path that match the app's bundle ID 
# normally one per iOS version
find "$SIMULATOR_PATH" -name $BUNDLE_ID".plist" -type f -print0 \
    | while IFS= read -r -d '' PLIST; do
    echo $PLIST
    open "$PLIST"
done

Exemple de placement:

$ ls -1
MyProject
MyProject Tests
MyProject.xcodeproj
MyProject.xcworkspace
Podfile
open-prefs-plist.sh
Ernesto MB
la source
Comment manger ce script, avec des fourchettes ou avec des mains? où dois-je le mettre, je veux dire?
Josh
1
@Josh Vous devez le mettre à côté de vos fichiers de projet (dans mon exemple, le script est nommé open-prefs-plist.sh). Je n'ai cependant pas testé cela avec le dernier Xcode. Je vous recommande à Flex d'inspecter ces informations maintenant. github.com/Flipboard/FLEX
Ernesto MB
0

Vous pouvez l'utiliser pour obtenir le chemin complet des préférences utilisateur, du cache et de nombreuses autres données

print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true))

Ahmed M. Hassan
la source
0

Vous pouvez imprimer le chemin du répertoire de préférences à partir du application:didFinishLaunchingWithOptions:rappel dans votre AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    print(FileManager.default.urls(for: .preferencePanesDirectory, in: .userDomainMask).first!)
    return true
}

Ensuite, vous pouvez regarder le fichier plist directement pour voir ce qui y est enregistré.

Myxtic
la source