Pregunta

¿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?

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

¡Gracias!

¿Fue útil?

Solución

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

Otros consejos

Si desea utilizar Cocoa, NSString y NSData tienen métodos para leer / escribir en un archivo y NSFileManager le ofrece operaciones de archivo. Aquí hay un ejemplo (debería funcionar en 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];

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

Luego, puede obtener el 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/# más-85

Tenga en cuenta que el uso de freopen DETENERÁ EL FUNCIONAMIENTO DE LA CONSOLA EN XCODE ... sin embargo, por algún motivo, la consola que puede ver en el organizador de xcode todavía funciona muy bien.

Este código me funciona:

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top