老司機 iOS 週報,只為你呈現有價值的資訊。
你也可以為這個專案出一份力,如果發現有價值的資訊、文章、工具等可以到 Issues 裡提給我們,我們會盡快處理。記得寫上推薦的理由哦。有建議和意見也歡迎到 Issues 提出。
通知
本期週報也是年前最後一期週報了,提前祝大家春節愉快~
新手推薦
? ? Flutter 如何高效的 JSON 轉 Model
@CrazyCoderShi:由於 Flutter 禁用執行時反射,所以在 Flutter 中是沒有 Mantle 等這類解析 JSON 的庫。本文介紹了三種方式在 Flutter 中進行 JSON to Model :
- 手動序列化 JSON
- 使用 json_serializable
- 使用工具網站
文章
? ? Using Type Erasure to Build a Dependency Injecting Routing Framework in Swift
@Damonwong:Swift 編譯器的型別檢查為 Swift 專案減少了很多錯誤的產生,但是過於嚴苛的校驗機制,使得很多功能實現起來較為複雜。 比如,作者在做模組拆分的時候,遇到了模組之間相互依賴的問題,最後他採用了型別擦除的辦法,構建了一套依賴注入的路由框架思路,實現了模組之間的依賴的解耦,是一個不錯的思路,做元件化的同學可以看一下具體的實現細節。 同時,由於 Swift 複雜的型別系統,型別擦除的使用範圍還是蠻廣泛的。比如 Codable 的實現、RxSwift 中的 Signal、SwiftUI 中的 View 等,如果不瞭解型別擦除也可以看一下文章,瞭解一下型別擦除的概念。
? ? 靜態攔截 iOS 物件方法呼叫的簡易實現
@Parsifal:過去的 2019 年,在啟動優化這一專項上,社群有了一個新的研究方向 -- 二進位制重排。早之前的週報推薦過的兩篇文章,「手淘架構組最新實踐 | iOS 基於靜態庫插樁的⼆進位制重排啟動優化」 和 「抖音研發實踐:基於二進位制檔案重排的解決方案 APP 啟動速度提升超 15%」,詳細介紹了這種方案的兩種實現方式。
做二進位制重排中,必不可少的一步便是統計所有函式的呼叫頻次。歐陽大哥針對這一步,提出了自己的一個新的思路 -- “利用靜態庫會將自己引用的外部符號單獨儲存在一張表中” 這一切入點從而替換 objc_msgSend
方法。
目前社群內常用的統計函式使用頻次的方案,值得一提的是,這些方案並不侷限於統計函式使用頻次這一場景:
- 基於執行時的 hook 方案:fishhook 等能提供動態修改
objc_msgSend
實現- 靜態插樁
- 藉助於 LLVM 語法樹分析來實現程式碼插樁
- 將原始碼編譯為靜態庫,並通過修改靜態庫中 .o 目標檔案的程式碼段來實現程式碼插樁
- 將所有靜態庫字串表中的 objc_msgSend 統一替換為另外一個長度相同的字串:hook_msgSend(名字任意只要長度一致並唯一)即可
? 移動開發者的必知音視訊基礎知識
@含笑飲砒霜:作為移動開發者,有些時候會需要接觸到音視訊相關的開發。作者通過從基本概念、常見問題、應用場景等不同方面來科普音視訊開發的基礎知識,有助於幫助我們瞭解音視訊開發中的一些常識性問題。
? Web 離線技術原理
@looping:本文列舉了業界比較常見的四種離線方案,介紹的很全面,並且還從公共資源包、預載入 webview、預載入資料等問題展開進行了探討分析,是一份很好的離線技術選型參考和方案原理學習的資料。不過正如作者所說,“對於一個優秀的 Hybrid 框架,這些還是遠遠不夠的, ...還有很多東西需要我們探討學習”。同樣,作為一項技術,我們得清楚地認識到它的侷限性和使用場景,才能用對、用好並改進它,這也是我們學習技術原理的目的之一。
? Turning Property Wrappers into Function Wrappers
@老峰:週報之前推薦過 Swift 5.1 中新特性 Property Wrappers 的相關文章, 本篇文章作者分享了屬性包裝器在 function 下的應用,如 @Delayed(delay: 0.3) 、 @Debounced(delay: 0.3) 等,思路比較新穎,感興趣的讀者可以嘗試。
? CONTINUOUS INTEGRATION USING GITHUB ACTIONS FOR IOS PROJECTS
@老驢:Github Actions 是 Github 2019 年的重磅功能,上線之後也得到了很多開發者的響應,開發了很多針對不同框架,不同語言的各種 actions。
網上在 iOS 專案中使用 Github Actions 的內容相對還是比較少的,目前大家主要還是依賴以前幾個比較常用的持續整合平臺對專案做持續整合。本文就介紹瞭如何使用 Github Actions 來做 iOS 專案的持續整合。步驟雖然不算太多,但是也不算特別簡單,有興趣的讀者朋友們可以在自己的專案中嘗試一下。
? 從客戶端角度窺探小程式架構
@蓮叔: 微信小程式並不是新鮮事物,但是近年來小程式 SDK 的概念越來越流行,接入 SDK 就能直接直接接入一整個生態,確實非常有吸引力。本文比較完整的分析了小程式的發展歷程,以及簡單剖析了小程式的實現方式。探討了小程式基於 H5 的技術棧是如何實現展現與邏輯的解耦,也 cover 了小程式相關領域的常用技術方案,比如離線包和預載入等。最後簡單介紹了支付寶小程式的架構。整篇文章內容相對全面,適合入門的同學閱讀。
? 為什麼 TCP 協議有效能問題 · Why's THE Design?
@水水:TCP 協議可以說是今天網際網路的基石,作為可靠的傳輸協議,在今天幾乎所有的資料都會通過 TCP 協議傳輸,然而 TCP 在設計之初沒有考慮到現今複雜的網路環境,本文會分析 TCP 協議為什麼在弱網環境下有嚴重的效能問題。 在弱網環境下(丟包率高)影響 TCP 效能的三個原因:
- TCP 的擁塞控制演算法會在丟包時主動降低吞吐量;
- TCP 的三次握手增加了資料傳輸的延遲和額外開銷;
- TCP 的累計應答機制導致了資料段的傳輸;
? UINavigationBar 在 iOS 13 中的變動
@AidenRao:蘋果在 iOS13 中帶來了很多外觀更改,這篇文章主要講導航欄的變動,大標題樣式導航欄的預設外觀已從半透明更改為透明。這個變動不大,可以新增部分程式碼恢復半透明。iOS13 下新增了 UINavigationBarAppearance 類,可以對導航欄外觀進行自定義,去設定樣式,陰影,背景,標題位置,按鈕樣式等。現在你可以刪除你的自定義導航欄的程式碼,前提是 APP 的最低支援版本升到 13 (微笑)。
工具
為 iOS 稽核操碎了心!用巖鼠提升 iOS 稽核通過率吧
@JimQ:UC 研發效能團隊建立的這套 iOS 預審工具可以有效地排除 iOS 稽核上可能遇到的諸多坑點,尤其是針對不小心誤用私有 API 庫的痛點,團隊收集了所有已知的私有 API 庫,且在不斷地完善與更新。開發者可以免費試用。
程式碼
BetterCodable
@享耳先森:Swift 4.0 開始引入 Codable
解決資料到模型轉換的問題,但實際使用過程中經常需要自定義 init(from decoder: Decoder) throws
方法,BetterCodable
結合 Swift 5.1 引入的 Property Wrappers
來解決這個問題。
書
《谷歌方法》
不要被書名騙了,這不是一本嚴肅的談論“方法”的書,相反,讀起來像一個冒險故事一樣吸引人。
這本書介紹了一家地圖軟體公司(KeyHole)被谷歌收購後,一路成長最後成為一個超 10 億使用者的明星產品的故事。和其他創業故事的區別在於,谷歌地圖的核心壁壘是技術門檻。很少看到一個技術驅動型產品,從早期到最後大獲成功的完整記錄。在這個過程中,你也可以一窺谷歌如何打造一款成功的產品。
音視訊
? ? 推薦訂閱播客節目:[weak self]
@zvving:三名臺灣 iOS 工程師帶來的高質量播客節目《弱弱的我》第一季正式完結!??
雖常被垃(le)圾(se)車打斷,也總是錄音裝置故障,內容卻歡樂且豐富:語言交流、Test CI 踩坑、管理心得、職場煩惱,雞湯大餅,盡情暢聊。老司機團隊傾情推薦!
weak self, strong together!
快樂的時光總是短暫的,期待第二季帶來更多歡樂~
內推
位元組跳動抖音商業化團隊急招客戶端工程師,速上車:
- 位元組跳動旗下抖音和TikTok的商業化研發工程師,負責抖音內所有賺錢的需求!不管是廣告、dou+、企業號、抖音電商還是抖音小遊戲,都有我們的身影!
- 團隊base 北京、上海、杭州、深圳,我們不侷限技術棧,對於新技術保持開放的態度。
- 簡歷以【姓名+投遞崗位+手機號】格式傳送至 fulei.bill@bytedance.com 或者直接加微信
fuleiac
老司機週報團隊聯合知識小集和 SwiftGG 翻譯組收錄了一份靠譜的內推職位。
如果你想找工作,點這裡:www.yuque.com/iosalliance…
如果你想招人,點這裡:www.yuque.com/iosalliance…
當然,也歡迎你關注我們每一期的週報,我們會在每期週報底部及時更新編輯內推崗位。
關注我們
我們開通了公眾號,每期釋出時公眾號(OldDriverWeekly)會推送訊息,歡迎關注。
同時也支援了 RSS 訂閱:github.com/SwiftOldDri… 。
說明
? 表示需翻牆,? 表示編輯推薦
預計閱讀時間:? 很快就能讀完(1 - 10 mins);? 中等 (10 - 20 mins);? 慢(20+ mins)