Вход в файл на iPhone - программирование
Подтвердить что ты не робот

Вход в файл на iPhone

Каким будет лучший способ записать записи журнала в файл или базу данных в приложении iPhone?

В идеале вывод NSLog() можно перенаправить в файл с помощью функции freopen(), но я видел несколько отчетов о том, что он не работает. У кого-нибудь есть это уже или есть идеи, как это лучше всего сделать?

Спасибо!

4b9b3361

Ответ 1

Я успешно использовал freopen (...) на телефоне, чтобы перенаправить вывод в мой собственный файл.

Ответ 2

Если вы хотите использовать 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];

Ответ 3

Этот код отлично подходит для меня.

#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 остановит работу CONSOLE IN XCODE.. однако по какой-то причине консоль, которую вы можете просмотреть в организаторе xcode, по-прежнему отлично работает.

Ответ 4

Этот код работает для меня:

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

Ответ 5

Рассмотрим использование Cocoa Lumberjack. Это легкая, но гибкая утилита для замены функциональности NSLog. По-моему, это в том же классе, что и Log4J, что позволяет настраивать приложения и т.д. Например, он имеет регистратор SQLite.