在日常的开发中,由于某些原因在真机测试中日志无法保存,从而导致某些崩溃问题,又或者某些算法没有达到自己的预期,从而导致出现的问题不好分析或者无从下手。所以这时候就有必要将日志保存到应用的Docunment目录下,并设置成共享文件,这样有利于我们分析问题所在的原因。
1.首先是日志输出,分为c的printf和标准的NSLog输出,printf会向标准输出(sedout)打印,而NSLog则是向标准出错(stderr),我们需要同时让他们都将日志打印到一个文件中。
例如:
#if TARGET_IPHONE_SIMULATOR
NSLog(@"SIMULATOR DEVICE");
#else
//export log to file
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout); //c printf
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr); //oc NSLog
#endif
具体做法如下:
- (void)startSaveLog {
//file path
NSString *documentDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString*logPath = [documentDirPathstringByAppendingPathComponent:LogFileName];
NSString*lastLogPath = [documentDirPathstringByAppendingPathComponent:LastLogFileName];
NSError*error;
if ([[NSFileManager defaultManager] fileExistsAtPath:lastLogPath]) {
[[NSFileManager defaultManager] removeItemAtPath:lastLogPath error:nil];
}
if ([[NSFileManager defaultManager] fileExistsAtPath:logPath]) {
if(![[NSFileManagerdefaultManager]moveItemAtPath:logPathtoPath:lastLogPatherror:&error]) {
//delete exisist file
[[NSFileManager defaultManager] removeItemAtPath:logPath error:nil];
}
}
#if TARGET_IPHONE_SIMULATOR
NSLog(@"SIMULATOR DEVICE");
#else
//export log to file
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout); //c printf
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr); //oc NSLog
#endif
}
此函数要在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中调用,这个函数在AppDelegate.m中实现的。
2.配置共享文件夹:
在应用程序的Info.plist文件中添加UIFileSharingEnabled键,并将键值设置为YES。将您希望共享的文件放在应用程序的Documents目录。一旦设备插入到用户计算机,iTunes 9.1就会在选中设备的Apps标签中显示一个File Sharing区域。此后,用户就可以向该目录添加文件或者将文件移动到桌面计算机中。如果应用程序支持文件共享,当文件添加到Documents目录后,应用程序应该能够识别并做出适当响应。例如说,应用程序可以将新文件的内容显示界面上。请不要向用户展现目录的文件列表并询问他们希望对文件执行什么操作。
就是说,一旦设备连接上电脑,可以通过iTune查看指定应用程序的共享文件夹,将文件拷贝到你的电脑上看。
当然也可以通过UIActivityViewController进行保存具体操作如下:
- (void)shareFileTxt {
NSString *documentDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString*logPath = [documentDirPathstringByAppendingPathComponent:LogFileName];
NSString*lastLogPath = [documentDirPathstringByAppendingPathComponent:LastLogFileName];
NSArray*fileURLArray;
if ([[NSFileManager defaultManager] fileExistsAtPath:logPath] && [[NSFileManager defaultManager] fileExistsAtPath:lastLogPath]) {
fileURLArray =@[[NSURLfileURLWithPath:logPath], [NSURLfileURLWithPath:lastLogPath]];
}else if ([[NSFileManager defaultManager] fileExistsAtPath:logPath]) {
fileURLArray =@[[NSURLfileURLWithPath:logPath]];
}elseif([[NSFileManagerdefaultManager]fileExistsAtPath:lastLogPath]) {
fileURLArray =@[[NSURLfileURLWithPath:lastLogPath]];
}else{
return;
}
UIActivityViewController*activityController = [[UIActivityViewController alloc]initWithActivityItems:fileURLArrayapplicationActivities:nil];
UIPopoverPresentationController*popover = activityController.popoverPresentationController;
if(popover) {
popover.barButtonItem= sender;
popover.permittedArrowDirections = UIPopoverArrowDirectionUp;
}
[self presentViewController:activityController animated:YES completion:nil];
}