1.需求
1. 真機(jī)屏幕上顯示Log
總感覺Xcode的控制臺(tái)輸出不怎么方便,代碼在模擬器上跑還好.但很多情況下模擬器并不能滿足開發(fā)需求,需要在真機(jī)上運(yùn)行.
既然我都在真機(jī)上運(yùn)行了,看日志為啥還要在Xcode上啊!尤其是還會(huì)碰到真機(jī)不連著電腦的情況,比如我前一陣子,測試iBeacon的有效范圍,需要在移動(dòng)的時(shí)候看日志,總不能抱著電腦到處跑吧!
為什么日志就不能用一個(gè)恰當(dāng)?shù)姆绞斤@示在屏幕上呢?
2. 崩潰信息保存與顯示
在測試的時(shí)候發(fā)現(xiàn)程序閃退了,往往還需要連上電腦把剛剛的步驟再重復(fù)一遍,為什么就不能在閃退的時(shí)候就知道原因是啥啊!
2.實(shí)現(xiàn)
為此有了DCLog: Github地址
主要功能:
- 搖一搖,彈出一個(gè)view實(shí)時(shí)顯示當(dāng)前l(fā)og;
- 程序崩潰時(shí),可以記下崩潰的詳細(xì)原因;
- 一鍵清除當(dāng)前日志;
- 再搖一搖,隱藏當(dāng)前顯示log的view;
- 當(dāng)在程序在模擬器上運(yùn)行時(shí)自動(dòng)屏蔽DCLogs輸出.
3.使用方法
只要在didFinishLaunchingWithOptions
中添加一行代碼就可以了:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 設(shè)置為NO的時(shí)候關(guān)閉DCLog,一切輸出到控制臺(tái)
[DCLog setLogViewEnabled:YES];
return YES;
}
注意:
如果在真機(jī)上打印log信息,Xcode上就不會(huì)有輸出log輸出.
搖一搖就可以顯示或隱藏logView了.
4. 實(shí)現(xiàn)原理
實(shí)現(xiàn)原理其實(shí)很簡單,最主要的就兩點(diǎn).
1. log的截取,保存到本地
- (void)saveLogInfo {
NSString *logPath = [self loadPathWithName:LogFileName];
[[NSFileManager defaultManager]removeItemAtPath:logPath error:nil];
#if TARGET_IPHONE_SIMULATOR
NSLog(@"SIMULATOR DEVICE");
#else
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout); //c printf
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr); //oc NSLog
#endif
}
2. crash日志的獲取
void UncaughtExceptionHandler(NSException *exception) {
NSArray *arr = [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
NSString *crashInfo = [NSString stringWithFormat:@"Crash date: %@ \nNexception type: %@ \nCrash reason: %@ \nStack symbol info: %@ \n",[[DCLog shareLog] getCurrentDate], name, reason, arr];
// 保存到本地
[[DCLog shareLog] saveCrashInfo:crashInfo];
}
本文參考:
戴倉薯的一個(gè)在 iOS 設(shè)備屏幕上實(shí)時(shí)打印 Log 的小工具
如有疑問,歡迎留言 :-D