2008-10-14 14 views
17

¿Cuál sería la mejor manera de escribir declaraciones de registro en un archivo o base de datos en una aplicación de iPhone?Iniciar sesión en un archivo en el iPhone

Idealmente, la salida NSLog() podría redirigirse a un archivo usando freopen(), pero he visto varios informes de que no funciona. ¿Alguien tiene esto en marcha o tiene alguna idea de cómo hacer esto mejor?

Gracias!

Respuesta

18

He utilizado con éxito freopen (...) en el teléfono para redirigir la salida a mi propio archivo.

+0

¿Recuerdas qué argumentos usaste? –

+3

Utilicé freopen ([newFileName UTF8String], "w +", stderr), que redirigió todos los resultados de la consola a logFileName. –

+0

Solo para dar seguimiento, esto funcionó bien. El único fastidio es que la salida NSLog deja de aparecer en la consola después de llamar a freopen, pero es un problema bastante menor. –

32

Si desea utilizar Cocoa, NSString y NSData tienen métodos para leer/escribir en archivos y NSFileManager le ofrece operaciones de archivos. He aquí un ejemplo (debería funcionar en el iPhone):

NSData *dataToWrite = [[NSString stringWithString:@"String to write"] dataUsingEncoding:NSUTF8StringEncoding]; 

NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *path = [docsDirectory stringByAppendingPathComponent:@"fileName.txt"]; 

// Write the file 
[dataToWrite writeToFile:path atomically:YES]; 

// Read the file 
NSString *stringFromFile = [[NSString alloc] initWithContentsOfFile:path]; 

// Check if file exists 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
[fileManager fileExistsAtPath:path]; // Returns a BOOL  

// Remove the file 
[fileManager removeItemAtPath:path error:NULL]; 

// Cleanup 
[stringFromFile release]; 
[fileManager release]; 
11

Este código funciona para mí:

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
#if TARGET_IPHONE_SIMULATOR == 0 
    freopen([@"/tmp/my_logs.txt" fileSystemRepresentation], "w", stderr); 
#endif 
} 
14

Este código funciona muy bien para mí ..

#if TARGET_IPHONE_SIMULATOR == 0 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"]; 
    freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr); 
#endif 

entonces se puede obtener la archivo de registro del iphone utilizando el método descrito aquí http://blog.coriolis.ch/2009/01/09/redirect-nslog-to-a-file-on-the-iphone/#more-85

Tenga en cuenta que al usar freopen se DETENDERÁ LA C ONSOLE IN XCODE funciona ... sin embargo, por alguna razón, la consola que puedes ver en el organizador de xcode sigue funcionando muy bien.

+1

He podido solucionar el problema de Xcode pero solo he redirigido si la aplicación NO se está ejecutando desde Xcode comprobando una variable de entorno de mi elección, establecida por Xcode. http://lists.apple.com/archives/xcode-users/2009/Aug/msg00507.html Por ejemplo: 'if (getenv (" MY_ENV_VAR ") == NULL) {/ * call freopen() * /}' –

3

Considere el uso de Cocoa Lumberjack. Es una utilidad ligera pero flexible para reemplazar la funcionalidad NSLog. En mi opinión, está en la misma clase que Log4J, lo que permite a los appenders personalizados y similares. Tiene un registrador SQLite, por ejemplo.

Cuestiones relacionadas