文章目錄
- 異常的捕捉
- 埋點
開發iOS應用,解決Crash問題始終是一個難題。Crash分為兩種,一種是由EXC_BAD_ACCESS引起的,原因是通路了不屬于本程序的記憶體位址,有可能是通路已被釋放的記憶體;另一種是未被捕獲的Objective-C異常(NSException),導緻程式向自身發送了SIGABRT信号而崩潰。其實對于未捕獲的Objective-C異常,我們是有辦法将它記錄下來的,如果日志記錄得當,能夠解決絕大部分崩潰的問題。這裡對于UI線程與背景線程分别說明。
以下代碼記憶體越界會崩潰。

用分類的方式,重寫NSArray的load方法。分類可以解耦,降低耦合度。我們的目标是高内聚,低耦合。
但是這樣實用性不強。
最好是捕捉異常。
異常的捕捉
UMCrashTool,分析底層的dsym()檔案,奔潰的行,檔案,類。
UncaughtExceptionHandle
為了能夠第一時間發現程式問題,應用程式需要實作自己的崩潰日志收集服務,成熟的開源項目很多,如 KSCrash,plcrashreporter,CrashKit 等。追求友善省心,對于保密性要求不高的程式來說,也可以選擇各種一條龍Crash統計産品,如 Crashlytics,Hockeyapp ,友盟,Bugly 等等
要做到:捕獲exception,處理,存儲url,和上傳。程式員再做線下的改代碼。
将所有的runloop拷過來,相當于弄一個平行空間,使其繼續運作,不至于全盤崩潰。原來奔潰的程式,終止,進入while的死循環。
埋點
除了收集和exception,signal,還需要統計和埋點。
埋點的目的主要是為了分析統計App使用的情況
一般埋點主要用于界面,action事件
界面中的資料一般都是靜态的 和業務邏輯不相關, 一般是進入離開時間,是否進入該界面
action事件互動統計 ,一般是點選 輕按兩下 手勢等互動
方案
1 使用第三方sdk: 例如:umeng統計 百度 騰訊MTA 等
2 手動埋點:正常的做法是将埋點代碼封裝成工具類,凡是工程中需要埋點(如點選事件、頁面跳轉)的地方都應用埋點代碼。
a)主要統計的資料為:目前頁面,頁面停留時間(進入與離開時間差計算),點選事件等。缺點是代碼散亂不易維護
b)記錄每個頁面進入退出(viewWillAppear與viewWillDisappear)的時間,用來計算頁面停留時間,把觸發時間以及一些點選行為操作全記到一個模型對象中,然後在頁面離開或點選事件觸發把這個模型寫入到資料表中,到時候隻要從表中取出資料再發送給背景即可實作埋點。
c)為防止對背景接口造成資料攻擊,每5分鐘從資料庫中取一次資料發送,每200條清單資料向服務發送,直到本次取出所有資料全部發送完畢.
3.無碼埋點
Method Swizzling、Hook與代碼注入,基于運作時的埋點方案
唯一辨別問題
唯一辨別的組成方式主要是又 target + action 來确定, 即任何一個事件都存在一個target與action。 在此引入AOP程式設計,AOP(Aspect-Oriented-Programming)即面向切面程式設計的思想,基于 Runtime 的 Method Swizzling能力,來 hook 相應的方法,進而在hook方法中進行統一的埋點處理。例如所有的按鈕被點選時,都會觸發UIApplication的sendAction方法,我們hook這個方法,即可攔截所有按鈕的點選事件。