iOS10 Log調試小工具

出發點

由於iOS10系統,在發佈環境下(打成ipa包安裝測試或者發佈之後從App Store下載安裝的包),使用Xcode已經無法查看我們自己打印的log。所以就做了一個小工具,查看log,便於調試。

樓主的需求是,在安裝了APP之後查看log,驗證程序是否正常運行。除了在調試的時候用到,在線上包出問題之後,也能通過查看log來定位問題。

效果

樓主將該工具分成了3種模式

  • 不顯示log模式

這個是默認的模式。默認初始化之後是不顯示任何log的。也就是說不做任何操作。

  • Xcode控制檯顯示log模式

這個模式只在Xcode控制檯顯示log。這就是我們iOS10出來之前用的模式。通過控制檯查看log。但是由於iOS10的時候,真機查看log時候會冒出一大坨沒用的log,然後我們自己的log又看不見(好像Xocde8.2.1可以看見,但是還是會有很多無用的log),所以在iOS10下這個模式不好用

  • 將log寫入到文件並顯示(懸浮窗模式)

這個模式將log顯示在Xcode控制檯,同時將log寫入到沙盒中。我們可以通過讀取沙盒的log文件來查看log。並且log文件還可以通過郵件、QQ、微信等方式發送。這個模式就是我們這個小工具主要實現的功能了。值的一說的是,這個模式我們會有一個懸浮窗,用來隨時查看沙盒的log文件內容。

廢話少說,上圖:

QQ截圖20170420100233.png

懸浮窗模式

QQ截圖20170420100214.png

預覽界面

QQ截圖20170420100157.png

分享界面

第一幅圖就是懸浮窗模式。圖中爲浮窗展開時的界面。3個按鈕分別對應着上面說的懸浮窗模式、Xcode控制檯顯示log模式、不顯示log模式。

第二幅圖是點擊在浮窗上的【預覽】之後顯示的界面,這些就是我們在程序中打印的log。

第三幅圖是點擊第二幅圖右上角的分享之後的界面。如果手機安裝了QQ微信Facebook等軟件,可以通過這些軟件來分享這個log文件。

1818095-f1ee4433f5e0e9d7.gif

效果示例

默認情況下,我們的小工具什麼都不做。

當我們手動觸發某個開關之後,懸浮窗就顯示出來。並自動在沙盒創建log文件,之後就可以使用log寫入功能。

懸浮窗是可以一直漂浮在APP的上方的,便於我們隨時點擊浮窗,查看log

點擊懸浮窗上的【預覽】按鈕就可以以界面的形式顯示沙盒文件的log,並且可以選擇已郵件QQ微信等形式發送log文件

點擊懸浮窗上的【Xcode】按鈕,懸浮窗會消失,並且只會在Xcode控制檯顯示log。不會寫入到文件。

點擊懸浮窗上的【關閉】按鈕,懸浮窗會消失,並且log不會再打印。

重啓APP之後,會根據之前的模式來決定是否顯示浮窗和打印log。

使用

項目github地址:https://github.com/shixueqian/iOS10LogDebugTool

將SQLogTool文件夾中的幾個文件拖到工程中

在didFinishLaunchingWithOptions方法中進行初始化

代碼示例:

1
2
3
4
5
6
//需要導入頭文件  #import "SQLogToolManager.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    [[SQLogToolManager shareManager] logIntial];
    return YES;
}

在應用的某個界面上設置一個開關,點擊這個開關就將log工具設置到懸浮窗模式(樓主設置的是在登錄界面上連續點擊10次就觸發方法)

代碼示例:

1
2
3
4
- (IBAction)onClickWriteToTextAndShowFloatWindow:(UIButton *)sender
{
    [SQLogToolManager shareManager].logLevel = SQLogToolManagerLevelText;
}

在需要打印Log的地方使用 NSLogD()來替換平常用的NSLog()

代碼示例:

1
2
3
4
5
6
7
- (IBAction)onClickTest:(UIButton *)sender
{
    for (int i = 0; i < 10; ++i)
    {
        NSLogD(@"這裏是測試。%@:%d",@"第一個參數",i);
    }
}

不足之處&需改進的地方

這個只是一個小工具,所以只做了幾個我認爲比較重要的功能。。主要缺陷:

  • 界面長得不是很好看(管他呢)

  • 不能顯示系統的log。只能顯示使用NSLogD()方法打印的log。也就是說,蘋果的警告log無法通過這個小工具得到。(當前,這也避免了iOS10上那些噁心的無用log)

  • 無法顯示崩潰log。樓主認爲這個功能不是那麼重要,就沒做了。

項目解析

介紹下項目用到的幾個類和主要的技術點

1818095-1fe8803516a0b512.png

項目文件結構

  • SQFloatWindow 懸浮窗功能類。

繼承UIWindow,將windowLevel設置爲UIWindowLevelAlert + 1 來使window浮窗懸浮在APP上方。

1
2
3
4
5
6
7
8
9
10
11
UIWindow *preKeyWindow = [UIApplication sharedApplication].keyWindow;
 
self.backgroundColor = [UIColor clearColor];
self.windowLevel = UIWindowLevelAlert + 1;
self.rootViewController = [UIViewController new];
[self makeKeyAndVisible];
 
//還回keyWindow
if (preKeyWindow) {
  [preKeyWindow makeKeyWindow];
}

值得注意的是,我們的懸浮窗不需要作爲keyWindow(不然會帶來很多麻煩的),所以需要將keyWindow還給之前的window。

給懸浮窗加了一個主按鈕和若干個子按鈕,用來點擊

1
2
3
4
//添加按鈕
[self setupButtons];
//主按鈕
[self setupMainBtnWithName:mainBtnName];

定義一個block屬性來處理子按鈕的點擊事件,具體的子按鈕由按鈕的tag來區分

1
2
3
4
/**
 點擊事件block
 */
@property (nonatomic,copy) void(^clickBlocks)(NSInteger i);

浮窗還做了一些點擊展開/收回,拖拽,靠邊隱藏 等操作,具體請查看源代碼

  • SQLog log打印和寫入文件工具類。

當調用 SQLogD(...)時,會將log顯示在Xcode控制檯,並且將log寫入到沙盒文件中。

1
2
3
//目前只用到了SQLogD
//Debug
#define SQLogD(...) [SQLog logD:[NSString stringWithFormat:__VA_ARGS__],@""];

調用logIntial初始化方法時,會在沙盒創建log.txt文件(如果已創建就清空文件內容)。

當調用SQLogD(...)打印log時,會創建一個異步的串行隊列來進行打印並寫入log。

SQLogToolManager 本小工具的管理類。用來整合SQLog和SQFloatWindow 並處理對外的接口和使用邏輯。

NSLogD(...)宏定義中,使用logLevel屬性來控制log的類型。用戶改變了logLevel就改變了打印的類型。

懸浮窗子按鈕的點擊事件,分爲三個。【預覽】,【Xcode】和【關閉】。

其中,【Xcode】【關閉】只是設置了logLevel,而【預覽】使用了iOS提供的預覽和分享的類UIDocumentInteractionController

參考


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章