¿Una manera fácil de ver los NSUserDefaults guardados?

225

¿Hay alguna manera de ver lo que se ha guardado NSUserDefaultsdirectamente? Me gustaría ver si mis datos se guardaron correctamente.

Ethan
fuente
3
Use esto para obtener la ubicación de su directorio de aplicaciones: imprima (NSHomeDirectory ()) desde esa ubicación, vaya a Biblioteca> Preferencias> <yourAppsBundleName.plist> aquí será donde NSUserDefaults guarda sus datos.
Bobby

Respuestas:

162

Puede encontrar el archivo pList para su aplicación en el simulador si va a:

/ usuarios / su nombre de usuario / Biblioteca / Soporte de aplicaciones / iPhone Simulator / <Versión Sim> / Aplicaciones

Este directorio tiene un montón de GUID llamados directorios. Si está trabajando en algunas aplicaciones, habrá algunas. Entonces necesitas encontrar tu aplicación binaria:

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

Luego vaya al directorio Biblioteca / Preferencias en el directorio GUID. Entonces:

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

Debería encontrar un archivo que se vea así:

<Bundle Identifier>.foo.pList

Abra esto en el editor pList y explore los valores persistentes al contenido de su corazón.

RedBlueThing
fuente
12
Descubrí que esto ha cambiado en versiones posteriores de XCode. Ahora lo encontrará en un directorio con el número de versión ios actual en lugar de Usuario, por ejemplo, / usuarios / su nombre de usuario / Biblioteca / Soporte de aplicaciones / iPhone Simulator / 4.3 / Aplicaciones
nevster
Interesante ... Parece que si está haciendo pruebas de unidad OCMock / SenTestingKit con NSUserDefaults, entonces NSUserDefaultsno se conservan en un archivo .plist sino que se gestionan en la memoria: stackoverflow.com/questions/6193597/…
ma11hew28
¿Cómo puedo verlo para una aplicación ya instalada? Mi cliente descargó la aplicación desde la tienda de aplicaciones y algo está mal. Necesito verificar el archivo
NSUserDefaults
Su cliente, si puede hablar con él y es un poco inteligente, podría usar una herramienta como PhoneView para obtener acceso al sistema de archivos de su teléfono y copiar el archivo del teléfono para enviárselo.
Daniel Schneller
13
La ruta ha cambiado a: ~ / Library / Developer / CoreSimulator / Devices
Brainware
355

Puede imprimir todos los NSUserDefaults actuales en el registro:

Solo llaves:

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

Claves y valores:

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Marshn
fuente
1
THX, este es más eficiente ~
acústica
3
Apple podría hacer un simple visor en XCode para esto. Como el espectador simple. Pero no, no quieren que sea fácil.
GeneCode
79

En Swift podemos usar lo siguiente: -

Swift 3.xy 4.x

Para obtener todas las claves y valores:

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

Para recuperar la representación completa del diccionario de los valores predeterminados del usuario:

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

Para recuperar las llaves:

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

Para recuperar los valores:

También podemos usar dump aquí, pero eso devolverá la jerarquía de herencia completa de cada elemento en la matriz de valores. Si se requiere más información sobre los objetos, use dump, de lo contrario, continúe con la declaración de impresión normal.

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

Swift 2.x

Para recuperar la representación completa del diccionario de los valores predeterminados del usuario:

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

Para recuperar las llaves:

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

Para recuperar los valores:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().values.array)
footyapps27
fuente
40

Puede verificar los valores para cada clave en la matriz, devueltos por

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]
Morion
fuente
3
Esto también funcionó en el depurador mediante el uso de este comando: (lldb) "po [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]"
Ethan Parker
21

A veces uso el siguiente fragmento para imprimir la ubicación de mi archivo NSUserDefaults cuando lo ejecuto en el simulador

NSArray * ruta = NSSearchPathForDirectoriesInDomains (
   NSLibraryDirectory, NSUserDomainMask, YES);
NSString * folder = [ruta objectAtIndex: 0];
NSLog (@ "Sus NSUserDefaults se almacenan en esta carpeta:% @ / Preferences", carpeta);

Produce la ruta a la carpeta de preferencias

Sus NSUserDefaults se almacenan en esta carpeta: / Users / castle / Library / Application Support / iPhone Simulator / User / Applications / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Library / Preferences

Su archivo NSUserDefaults se encuentra en la carpeta de preferencias y se nombra según su prefijo y nombre de aplicación, por ejemplo

dk.castleandersen.dreamteam.grid.plist

Espero que lo mismo sea cierto para el dispositivo real.

Castillo Niels
fuente
Me gusta esta respuesta. ¡Es estable y siempre funcionará, con suerte!
lucianoenrico
7

Fácil, ya que el nombre del archivo plist es <app-bundle-identifier>.plist, puede usar el findcomando para encontrar su ruta. Pero llevará mucho tiempo si busca en toda su computadora, por lo que debe elegir un buen alcance, como~/Library/Developer/CoreSimulator Xcode 6.

ejemplo:

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

la salida será algo como esto ...

/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

Y desde allí puedes usar el opencomando. O si usa iTerm2 , simplemente haga clic en la ruta para abrirlo.

Hlung
fuente
7

En Swift 4.0

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

porque dictionaryRepresentation de NSUserDefaults.standardUserDefaults () devuelve [String: AnyObject]

Lo convertimos en un NSDictionary. Luego, al rodearlo entre paréntesis, '()' nos permitirá llamar a .allKeys o .allValues ​​como lo haría en cualquier NSDictionary

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

Use el siguiente código.

NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Sr. Javed Multani
fuente
¡Brillante! Interesante cómo las mejores respuestas son generalmente las más cortas. Raramente es necesario navegar por directorios en modo terminal. Evidentemente, a los geeks les gusta el acercamiento de la puerta de atrás, ¿quizás el hacker secreto en ellos?
John
Gracias, pero no puedo conseguirte. ¿Qué quieres decir?
Mr.Javed Multani
5

Para las aplicaciones OS X , en lugar de encontrar el archivo plist predeterminado de la aplicación, es más sencillo usar la defaultsutilidad de línea de comandos.

NOMBRE

 defaults -- access the Mac OS X user defaults system

SINOPSIS

 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 }

DESCRIPCIÓN

defaultspermite a los usuarios leer, escribir y eliminar los valores predeterminados del usuario de Mac OS X desde un shell de línea de comandos. Las aplicaciones de Mac OS X y otros programas utilizan el sistema predeterminado para registrar las preferencias del usuario y otra información que debe mantenerse cuando las aplicaciones no se están ejecutando (como la fuente predeterminada para nuevos documentos o la posición de un panel de información). Se puede acceder a gran parte de esta información a través del panel de Preferencias de una aplicación, pero parte de ella no, como la posición del panel de Información. Puede acceder a esta información condefaults

Ejemplo:

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

Para Xcode 7

NSUserDefaults standard Los valores predeterminados se almacenan aquí:

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

NSUserDefaults para una suite / grupo de aplicaciones se almacenan aquí:

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

Recomendaría usar https://github.com/scinfu/NCSimulatorPlugin porque en estos días todo está detrás de los UUID y es difícil de encontrar. Permite un fácil acceso a los directorios de la aplicación del simulador.

usuario1270061
fuente
2

Construí este método basado en la sugerencia de Morion para una mejor presentación. Úselo llamando[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
fuente
2
¿Puedo sugerirle que llame a esa función "logAllUserDefaults" ya que en realidad no "obtiene" los valores predeterminados?
markrickert
Derecha, @markrickert. Quizás uno podría crear un diccionario a partir de él y luego devolverlo.
Julian F. Weinert el
1
O simplemente ... NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(Casi como en la respuesta más votada arriba.)
matsr
2

Busque la aplicación para Mac llamada SimPholders2 . Vive en la barra de menú y enumera todos los simuladores que ha utilizado, y luego muestra cada una de sus aplicaciones. Seleccione uno y obtendrá una nueva ventana del Finder, ya abierta en el directorio de la aplicación. Esto hace que sea muy fácil encontrar su aplicación y todos sus directorios. Es un gran ahorro de tiempo (y lo doné fácilmente al autor).

Jeff
fuente
2

Aplicación de simulador

Este script de shell busca el nombre de la aplicación, obtiene la identificación del paquete y abre carpetas que contienen los archivos 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

Versión de script extendida

Uso: 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

Aplicación encontrada Mi aplicación (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 encontrado para Mi aplicación

Aplicación Mac

defaults read com.bundleid.app
Atika
fuente
1

En Swift 2.2

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

imprimirá la ubicación de la carpeta de archivos plist de NSUserDefaults en la consola de depuración de Xcode. Copie la cadena de ruta. Abra su Finder, seleccione Ir a la carpeta en el elemento de menú Ir, pegue la cadena de ruta. Haga doble clic en el archivo plist. Verá el contenido en su editor Xcode.

Solo funciona en simulador

Gracias @Niels Castle

charles.cc.hsu
fuente
Esta es la única solución que funcionó para encontrar la lista de valores predeterminados del usuario en el simulador para xcode 9.4
anoo_radha
1

Mantengo un acceso directo en mi escritorio a la carpeta del simulador donde guarda las aplicaciones, es decir:

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

Ordenado por la fecha más reciente, luego vaya a la carpeta de aplicaciones / Preferencias más reciente y vea el archivo en el editor de plist.

programador
fuente
1

Swift 3

print(UserDefaults.standard.dictionaryRepresentation())
Ego Slayer
fuente
1

Para aplicaciones MacOS
Vaya a: /Users/{User}/Library/Containers/com.{your company}. {Su aplicación} / Data / Library / Preferences y abra la lista de aplicaciones con Xcode.

Uwe
fuente
1

Solución Swift 5 Xcode 11.2

Esta es la ruta completa donde los valores clave de UserDefaults estarán en un archivo plist. Siga y busque el archivo .plist de su identificador de paquete de aplicaciones.

/ Users / 'Your User Name' / Library / Developer / CoreSimulator / Devices / 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2 / data / Containers / Data / Application / 56D7CE31-9A8B-4371-9B0F-9604E239423B0 / Library / Preferences

Aquí "4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2" es su ID de dispositivo

y "56D7CE31-9A8B-4371-9B0F-9604E239423B0" es su ID de aplicación

Normalmente los obtengo ordenando carpetas por última fecha de modificación en Finder. Y la carpeta editada más reciente es la ID de mi dispositivo y la ID de la aplicación.

¡Disfrutar!

Sajid Zeb
fuente
0

Puede NSLogar cada valor que establezca, como:

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

Después de leer la respuesta aceptada de esta pregunta, armé este script simple que abre los archivos plist utilizados por el simulador de iOS para almacenar las NSUserDefaultspreferencias, y aunque asume una determinada configuración (se ajusta perfectamente a la mía), puede funcionar como un punto de partida para otros .

$ 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

Ejemplo de colocación:

$ ls -1
MyProject
MyProject Tests
MyProject.xcodeproj
MyProject.xcworkspace
Podfile
open-prefs-plist.sh
Ernesto MB
fuente
¿Cómo me como este script, con tenedores o con las manos? ¿Dónde lo pongo, quiero decir?
Josh
1
@Josh Tienes que ponerlo junto a los archivos de tu proyecto (en mi ejemplo, el script se llama open-prefs-plist.sh). Sin embargo, no he probado esto con el último Xcode. Te recomiendo Flex para inspeccionar esta información ahora. github.com/Flipboard/FLEX
Ernesto MB
0

Puede usar esto para obtener la ruta completa de las preferencias del usuario, caché y muchos otros datos.

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

Ahmed M. Hassan
fuente
0

Puede imprimir la ruta del directorio de preferencias desde la application:didFinishLaunchingWithOptions:devolución de llamada en su AppDelegate:

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

Luego puede mirar el archivo plist directamente para ver qué hay guardado allí.

Myxtic
fuente