iOS開發筆記18:一些編譯、開發調試、打包的細節整理,ios18
1.以鏈庫的方式引用第三方庫
一些特殊情境可能會要求使用鏈庫的方式使用第三方庫,大體設定如下:
①Other Linker Flags裡進行設定,格式為-l+庫名稱
②Libray Search Paths裡設定庫的路徑地址,注意使用相對路徑
③Header Search Paths設定相關標頭檔的路徑
2.檢測靜態庫支援架構以及靜態庫打包
使用其他部門提供的靜態庫出現類似Undefined symbols for architecture報錯時,很有可能是對方打包時相關設定沒有正確設定,這時可以在命令列裡使用“lipo -info 靜態庫路徑”確認其所支援的架構資訊。
當以靜態庫形式出包給第三方使用,除了CI例如jenkins等自動編譯打包外,需要臨時手動快速出包時,進行如下兩步即可
①調整好編譯模式,例如設定為release模式,分別設定target為模擬器及真機,command+B編譯出兩個庫
②命令列中執行相關命令即可 “lipo -create 真機版靜態庫路徑xxxx 模擬器版靜態庫路徑xxxx -output 合并後靜態庫路徑”
3.靜態庫聯調問題
當提供一個靜態庫嵌入到其他業務部門的工程,遇到一些問題必須在其工程裡進行調試時,如果僅靠輸出log的方式可能不夠即時,或者需要重複設定輸出log的地方並再次編譯出包,這時其實可以將靜態庫工程和工程放在同一個workSpace下,將靜態庫最新編輯打包結果更新到主工程裡,同時在靜態庫相關目標位置打斷點即可,運行主工程,即可正常進入到相關斷點位置,並觀察相關變數資訊。
4.使用符合斷點定位調試其他第三方庫的問題
使用第三方庫遇到問題,需要排查第三方庫相關問題而又不方便聯調時,可以使用符合斷點的方式定位到相關方法進行觀察調試,如果知道對應類名將會更加精確,
5.charles捕捉https請求
不管出於安全考慮還是之前蘋果曾一度要求全部使用https,很多服務端已經將服務遷移使用https了,使用charles捕捉相關請求時也需要進行相應認證設定,否則無法查看到相關資訊
步驟如下:
①pc上先安裝相應根憑證
②在真機上安裝相應根憑證,注意需要串連到pc代理上再根據提示的地址安裝,如果使用該地址安裝有問題,可以試試http://charlesproxy.com/getssl
6.符號化crash日誌定位原因
雖然現在基本都會採用友盟、bugly之類第三方工具收集崩潰日誌,但總有些時候發生崩潰而第三方平台沒有採集到相關資料,如果這時候有裝置的崩潰日誌的話,只能使用Xcode內建的symbolicatecrash手動解析定位下原因了。
需要準備好的是真機匯出的crash日誌、打包後檔案,置於同一目錄下,準備進行符號化工作
開啟命令列終端開始符號化:
①找到symbolicatecrash並拷貝到目錄下,注意使用的是iPhone對應的symbolicatecrash
find /Applications/Xcode.app -name symbolicatecrash -type f
cp symbolicatecrash的路徑 對應存放目錄路徑
②切換到指定目錄下進行符號化
對應命令:./symbolicatecrash crash檔案路徑 dSYM檔案路徑 > 符號化後的crash日誌路徑
若中間遇到not define的問題,單獨執行命令設定下即可,export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
7.注意containsString是iOS8以後才支援,iOS7上需要自行擴充
判斷字串包含的方法“containsString”是在iOS8及以上系統版本才支援,8以下系統例如iOS7上會找不到該方法導致崩潰。
解決辦法是可以自行加個category擴充下
8.避免重複移除kvo監聽導致崩潰
個別特殊情境可能導致重複移除監聽崩潰,可以try catch避免重複移除時崩潰或者從根本上避免重複添加移除操作,參考iOS開發-黑科技防止多次添加刪除KVO出現的問題
9.在iOS10及以上版本使用UIPasteboard在app之間共用資料的問題
之前使用UIPasteboard臨時存放一些資料方便app之間共用資料,為了避免影響系統的複製粘貼資訊pasteboardWithName:單獨建立了粘貼板,但是iOS10某個小版本後確實如官方所說,這種方式被棄用了,不再支援,表現為通過app A在UIPasteboard設定的資訊,在app B內讀取出來為空白了。
解決辦法是:使用系統預設的UIPasteboard,即[UIPasteboard generalPasteboard],或者官方推薦的App Groups方式進行app之間資料共用,不過這種方式是iOS8以後支援的,並且需要手動開啟這項功能設定,如果分享對象的app不方便設定的話會相對麻煩一些。
10.列印方法調用者資訊
調試的時候,除了打斷點一步步跟蹤,有時想快速直接擷取到某一方法的調用者資訊,是可以通過方法實現的,具體參考 Print the name of the calling function to the debug log
11.狀態列適配-熱點、多媒體佔用、定位等導致狀態列高度變化
狀態列高度變化會影響view的frame,需要進行相應適配,當然新出的iPhone X例外,這個適配問題將不會存在,狀態列高度發生變化有兩種情境:
①進入頁面時,狀態列高度已經增高,這時候需要進行判斷其高度並做相應適配,這時狀態列的高度應該是40
②瀏覽當前頁面時,狀態列高度增高,這就需要頁面初始化時添加一個監聽狀態列高度變化的通知,當起變化是做相應適配處理
12.字串處理的一些細節
①對於上報服務端資訊之類情境,如有必要或保護特殊字元時,需要先進行編碼操作,避免亂碼
②使用URLWithString轉換字串為NSURL時,注意先對字元傳進行一次UTF-8編碼,否則字串裡包含空格等情況時直接URLWithString轉換結果返回nil
13.不使用第三方庫,一個相對性價比高的高斯模糊的方法
使用vImage實現,兼顧了模糊效果和執行耗時兩方面,參考vImage高斯模糊(Blur)
14.使用類似微博的字元計數規則
文字計數時需要將標點、符號、數字等只記為0.5個字元,實際上就是這些ascii字元只記為0.5個字
15.一些宏的使用
①消除warning,例如在部分區段告訴編譯器禁用對應警告
②區分真機和模擬器,例如有些功能或SDK不支援模擬器,例如網路攝影機相關的,為了讓模擬器能編譯運行,可能需要區分下模擬器,跳過相關部分的編譯