Вопрос
Каков наилучший способ записи инструкций журнала в файл или базу данных в приложении для iPhone?
В идеале выходные данные NSLog() можно было бы перенаправить в файл с помощью freopen(), но я видел несколько отчетов о том, что это не работает.У кого-нибудь уже есть это или есть какие-либо идеи, как это лучше всего сделать?
Спасибо!
Решение
Я успешно использовал freopen (...) на телефоне, чтобы перенаправить вывод в мой собственный файл.
Другие советы
Если вы хотите использовать Cocoa, NSString и NSData имеют методы для чтения / записи в файл, а NSFileManager предоставляет вам файловые операции.Вот пример (должен работать на 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];
Этот код отлично работает для меня..
#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
Затем вы можете получить файл журнала с iphone, используя метод, описанный здесь http://blog.coriolis.ch/2009/01/09/redirect-nslog-to-a-file-on-the-iphone/#more-85
Обратите внимание, что использование freopen остановит работу КОНСОЛИ В XCODE..однако по какой-то причине консоль, которую вы можете просмотреть в xcode organizer, по-прежнему отлично работает.
Этот код работает у меня:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
#if TARGET_IPHONE_SIMULATOR == 0
freopen([@"/tmp/my_logs.txt" fileSystemRepresentation], "w", stderr);
#endif
}
Рассмотрите возможность использования Какао - Лесоруб.Это легкая, но гибкая утилита для замены функциональности NSLog.На мой взгляд, он относится к тому же классу, что и Log4J, позволяя создавать пользовательские приложения и тому подобное.Например, у него есть регистратор SQLite.