Iniciar sesión en un archivo en el iPhone
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!
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.