1. 程式人生 > >iOS中 加強日誌輸出 開發技術總結

iOS中 加強日誌輸出 開發技術總結

對於那些做後端開發的工程師來說,看LOGBug應該是理所當然的事,但我接觸到的移動應用開發的工程師裡面,很多人並沒有這個意識,查Bug時總是一遍一遍的試圖重現,試圖除錯,特別是對一些不太容易重現的Bug經常焦頭爛額。而且iOS的異常機制比較複雜,Objective-C的語言駕馭也需要一定的功力,做出來的應用有時候挺容易產生崩潰閃退。一遍一遍的用XCode取應用崩潰記錄、解析符號,通常不勝其煩,有時還對著解析出來的呼叫棧發呆,因為程式當時的內部狀態常常難以看明白,只能去猜測。

對於真機,日誌沒法儲存,不好分析問題。所以有必要將日誌儲存到應用的Docunment目錄下,並設定成共享檔案,這樣才能取出分析。

匯入第三方:AFNetWorkinng

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:@"http://mobile.ximalaya.com/m/category_tag_list?category=entertainment&device=iPhone&type=album" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        
        NSLog(@"%@", responseObject);
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@", [error localizedDescription]);
    }];
    
    
}

給其寫一個類目:Foundation+Log.m
#import <Foundation/Foundation.h>

@implementation NSDictionary (Log)

//+ (void)load
//{
//    NSLog(@"11");
//}


- (NSString *)descriptionWithLocale:(id)locale
{
    NSMutableString *str = [NSMutableString string];
    [str appendString:@"{\n"];
    
    
    [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        [str appendFormat:@"\t%@ = %@, \n", key, obj];
    }];
    
    [str appendString:@"}"];
    
    // 刪除最後一個,
    NSRange range = [str rangeOfString:@"," options:NSBackwardsSearch];
    [str deleteCharactersInRange:range];
    
    
    return str;
}

@end



@implementation NSArray (Log)


- (NSString *)descriptionWithLocale:(id)locale
{
    NSMutableString *str = [NSMutableString string];
    [str appendString:@"[\n"];
    
    
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [str appendFormat:@"\t\t%@,\n", obj];
    }];
    
    [str appendString:@"]"];
    
    // 刪除最後一個,
    NSRange range = [str rangeOfString:@"," options:NSBackwardsSearch];
    [str deleteCharactersInRange:range];
    
    
    return str;
}@end
最終效果:



小技巧:iOS - 將控制檯Log日誌轉為輸出為文字檔案

1.在AppDelegate.m中建立函式實現以下程式碼塊:
- (void)redirectNSlogToDocumentFolder
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [paths objectAtIndex:0];
    NSString *fileName = [NSString stringWithFormat:@"MrNSLog.txt"];// 注意不是NSData!
    NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName];
    // 先刪除已經存在的檔案
    NSFileManager *defaultManager = [NSFileManager defaultManager];
   [defaultManager removeItemAtPath:logFilePath error:nil];
   // 將log輸入到檔案
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
}
2.在didFinishLaunchingWithOptions中呼叫 : 
[self redirectNSlogToDocumentFolder];
最後配置共享資料夾:

在應用程式的Info.plist檔案中新增UIFileSharingEnabled鍵,並將鍵值設定為YES。將您希望共享的檔案放在應用程式的 Documents目錄。一旦裝置插入到使用者計算機,iTunes9.1就會在選中裝置的Apps標籤中顯示一個File Sharing區域。此後,使用者就可以向該目錄新增檔案或者將檔案移動到桌面計算機中。如果應用程式支援檔案共享,當檔案新增到Documents目錄後,應用程式應該能夠識別並做出適當響應。例如說,應用程式可以將新檔案的內容顯示介面上。請不要向用戶展現目錄的檔案列表並詢問他們希望對檔案執行什麼操作。



<pheiti sc="" light'"="">