1.以鏈庫的方式引用第三方庫 一些特殊場景可能會要求使用鏈庫的方式使用第三方庫,大體設置如下: ①Other Linker Flags里進行設置,格式為-l+庫名稱 ②Libray Search Paths里設置庫的路徑地址,註意使用相對路徑 ③Header Search Paths設置相關頭文件的 ...
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不支持模擬器,例如攝像頭相關的,為了讓模擬器能編譯運行,可能需要區分下模擬器,跳過相關部分的編譯