2009-04-30 6 views
17

¿Alguien sabe de una manera rápida de volcar el standardUserDefaults de NSUserDefaults a través de NSLog? Esto es lo que tengo:NSUserDefaults: volcado de la estructura de NSUserDefaults's standardUserDefaults

NSLog(@"NSUserDefaults dump: %@", [NSUserDefaults standardUserDefaults]); 

pero vuelve:

NSUserDefaults dump: <NSUserDefaults: 0x50b520> 

... lo cual no es exactamente lo que estoy buscando. Realmente me gustaría tener pares clave-valor.

Cualquier ayuda o un punto en la dirección correcta sería muy apreciada. ¡Aclamaciones!

Respuesta

18

Gracias a Don McCaughey, mi socio comercial y amigo, por arreglarme el código y proporcionar una respuesta concisa. Para compartir con el resto de ustedes aquí es un fragmento de código:

NSDictionary *bundleInfo = [[NSBundle mainBundle] infoDictionary]; 
    NSString *bundleId = [bundleInfo objectForKey: @"CFBundleIdentifier"]; 

    NSUserDefaults *appUserDefaults = [[NSUserDefaults alloc] init]; 
    NSLog(@"Start dumping userDefaults for %@", bundleId); 
    NSLog(@"userDefaults dump: %@", [appUserDefaults persistentDomainForName: bundleId]); 
    NSLog(@"Finished dumping userDefaults for %@", bundleId); 
    [appUserDefaults release]; 

Como se puede ver, todos los que estaban respondiendo a la pregunta estaba en el camino correcto, pero no hay código ofrecido era la solución - hasta la edición de Don de nuestro código en el control de la fuente. ¡Gracias a todos!

+0

Glorioso. Esto necesita estar más arriba en la lista de respuestas. –

36
NSLog(@"NSUserDefaults dump: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]); 
+0

@rpetrich: Gracias. Lo puse y de hecho volcó la salida a la consola del depurador, pero la información que se arrojó se parece más a los valores predeterminados del sistema específico, incluidas las preferencias de impresora, prefijos de zona horaria, etc. ... ¿Conoces alguna manera? para extraer solo userDefaults específicos de la aplicación en el iPhone? Kevin –

+1

NSUserDefaults se almacenan en /User/Applications/{UNIQUE_ID}/Library/Preferences/com.yourcompany.yourapp.plist; debería poder obtener la ruta hasta {UNIQUE_ID} recuperando [[NSBundle mainBundle] bundlePath] y luego navegando un nivel arriba, pero no recomiendo confiar en ese archivo para permanecer en el mismo lugar entre las versiones del sistema operativo. – rpetrich

+0

@prtrich: Gracias, voy a echar un vistazo a eso. (^_^) –

10

Probar:

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

dictionaryRepresentation devuelve una representación NSDictionary de los valores por defecto.

+0

@thesamet: Gracias a ti también. Es como si ustedes dos estuvieran canalizando el mismo espíritu de desarrollo de iPhone. (^_^) Por favor, eche un vistazo a mi respuesta a rpetrich. Quizás tengas una respuesta, más rápido. (^_^) Gracias de nuevo! –

+1

Comprueba si tienes el identificador del paquete de la aplicación establecido en info.plist – thesamet

+0

@thesamet: Gracias, voy a echar un vistazo a eso también. (^_^) –

6

El NSUserDefaults compartido se inicializa con tres dominios de búsqueda de manera predeterminada (puede agregar otros también si es necesario): argumentos de la aplicación, preferencias de la aplicación (lo que está almacenado en la aplicación) y preferencias del sistema localizado. La última es la razón por la que estás viendo esas desconocidas claves de Apple, pero en realidad no tienes que preocuparte por "sobreescribirlas". Si usa el mismo nombre de clave, simplemente colocará ese valor en el dominio de preferencias de la aplicación. Las preferencias de su aplicación se buscan antes de las preferencias del sistema, por lo que obtendrá el mismo valor, pero no afectará a nada más.

Si realmente quieres solo las preferencias de tu aplicación, puedes eliminar los otros dominios de búsqueda (los nombres específicos que necesitas están en los documentos).

+0

Hola, gracias Marc. Cualquier posibilidad de que me señale en la dirección correcta de cómo modificar el código: NSLog (@ "NSUserDefaults dump:% @", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]); ... para buscar solo los valores de usuario de la aplicación? –

+1

Necesita eliminar los otros dominios de búsqueda (creo que el método es algo así como removeSuiteNamed :?) antes de llamar a dictionaryRepresentation. No recuerdo los nombres de dominio de forma directa, pero los encontrará en la documentación de NSUserDefaults. –

8
NSLog(@"%@ defaults = %@", [self class], 
    [[NSUserDefaults standardUserDefaults] 
    persistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]); 
1

Aquí es una clase práctica que se puede utilizar para volcar todo tipo de basura:

https://github.com/VTPG/CommonCode/blob/master/VTPG_Common.h

Para usarlo, añadir la cabecera de su "m"

#import "VTPG_Common.h" 

luego en cualquier lugar de su clase llame a LOG_EXPR (foo):

NSUserDefaults *userDefaults = [[NSUserDefaults alloc] init]; 
[userDefaults addSuiteNamed:@"com.apple.spaces"]; 
NSDictionary *foo = [userDefaults dictionaryForKey:@"SpacesDisplayConfiguration"]; 
LOG_EXPR(foo); 
Cuestiones relacionadas