¿Hay alguna manera de ver lo que se ha guardado NSUserDefaults
directamente? Me gustaría ver si mis datos se guardaron correctamente.
¿Hay alguna manera de ver lo que se ha guardado NSUserDefaults
directamente? Me gustaría ver si mis datos se guardaron correctamente.
Respuestas:
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.
NSUserDefaults
, entonces NSUserDefaults
no se conservan en un archivo .plist sino que se gestionan en la memoria: stackoverflow.com/questions/6193597/…
Puede imprimir todos los NSUserDefaults actuales en el registro:
Solo llaves:
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);
Claves y valores:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
for (key, value) in UserDefaults.standard.dictionaryRepresentation() {
print("\(key) = \(value) \n")
}
print(Array(UserDefaults.standard.dictionaryRepresentation()))
// Using dump since the keys are an array of strings.
dump(Array(UserDefaults.standard.dictionaryRepresentation().keys))
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))
print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation())
print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys.array)
print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().values.array)
Puede verificar los valores para cada clave en la matriz, devueltos por
[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]
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.
Fácil, ya que el nombre del archivo plist es <app-bundle-identifier>.plist
, puede usar el find
comando 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 open
comando. O si usa iTerm2 , simplemente haga clic en la ruta para abrirlo.
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)
Use el siguiente código.
NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Para las aplicaciones OS X , en lugar de encontrar el archivo plist predeterminado de la aplicación, es más sencillo usar la defaults
utilidad 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
defaults
permite 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;
...
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.
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]);
}
}
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);
(Casi como en la respuesta más votada arriba.)
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).
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
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
defaults read com.bundleid.app
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
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.
Swift 3
print(UserDefaults.standard.dictionaryRepresentation())
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!
Puede NSLogar cada valor que establezca, como:
NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
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 NSUserDefaults
preferencias, 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
Puede usar esto para obtener la ruta completa de las preferencias del usuario, caché y muchos otros datos.
print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true))
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í.