老司機 iOS 週報 #67 | 2019-05-13

老司機iOS週報發表於2019-05-13

ios-weekly
老司機 iOS 週報,只為你呈現有價值的資訊。

你也可以為這個專案出一份力,如果發現有價值的資訊、文章、工具等可以到 Issues 裡提給我們,我們會盡快處理。記得寫上推薦的理由哦。有建議和意見也歡迎到 Issues 提出。

新聞

19 年老司機週報定製 T 恤上架啦

只訂做一批,錯過不再有。

只要錢到位

? Google I/O for Flutter

@CrazyCoderShi:伴隨著 Goole I/O 大會召開,Flutter 這幾天又刷屏一波,一個好訊息和一個壞訊息:

  • 好訊息 | 全平臺支援: Flutter 1.5 穩定版釋出,併為我們帶來了 Flutter for web - Hummingbird 以及可供嵌入式裝置使用的 Flutter for Embedded。自此,也正如官方宣稱的 Flutter 已經支援全平臺。
  • 壞訊息 | 暫時無熱更新: Flutter 官方開發團隊宣佈暫時不會開發熱更新(Code Push)功能,原因如下:
    • Code Push 在 Android 和 iOS 平臺上各有不同的限制
    • 出於安全方面的考慮,可能會被濫用

? MongoDB 宣佈收購 Realm

@xiaofei86: MangoDB 宣佈以 3900 萬美元的價格收購 Realm ,通過收購彌補了 MongoDB Mobile 在移動端的不足。 Realm 作為一款成熟的移動端資料庫框架有著數十萬的使用者,並且在github上有著1w + 的star。

? 搞事情之 Vapor 初探

@老峰:從 Swift 開源並支援 Linux 執行之後,Swift Server Side 趨熱,先後出現了 Perfect、Vapor、Kitura 和 Zewo 幾個框架,其中 Vapor 目前在 Github star 數最多。

本文是作者對 Vapor 的探索實踐,分享了在 Vapor 中 MySQL 的基礎使用;在 Vapor 中的使用者鑑權;以及自己實踐中的心得體會。

相關閱讀: Swift HTTP Server 開發體驗 Docker ❤️ Swift & Vapor

文章

? 泛型語法改進第一彈 —— Opaque Result Types

@享耳先森:Swift 5.1 將包含針對範型的一個重要改進 —— Opaque Result Types:簡單來講,用 some 修飾的方法返回值或屬性,其具體型別在編譯時就能確定,並且是由被呼叫方去決定。

? What should I learn if I want to contribute to the Swift compiler?

@蓮叔: Compiler 相關的工作一直處於鄙視鏈的頂端,這篇帖子的樓主在 2018 年 11 月的時候給自己定了一個看起來有點夢幻的目標:2019 年末能夠參與到 Swift compiler 的開源工作中去(即便是樓主自己也認為很夢幻)。但有愛的 Swift 社群告訴樓主這並不夢幻,可以實現。首先 codafi 提出事實上在 Swift 編譯器原始碼中的 C++ 並不是 Raw C++,而更多是 LLVM C++(LLVM C++並不是一門語言,而是 LLVM 工程規定的一系列 API和規範),是複雜,但沒有那麼複雜, 所以從 LLVM 程式碼規範是最佳的入門材料,不用被 C++ 嚇到。然後 Aljandro 甚至給出了編譯器各個環節如 Lexer、Parser、Sema 到 SIL,LLVM IR 分別對應在哪些編譯器的原始檔中實現,簡直不要太良心。除此之外,還分享了自己很多在 compiler 相關的大型專案中如何挖到合適的點切入的經驗。

整個帖子有不少優質的回覆,都是既具備專業性,又照顧了對 compiler 技術陌生的新人,不容錯過。

? 大偵探福老師——幽靈Crash謎蹤案

@邦Ben:該文閒魚技術小編描述了出現 BUG 到分析 BUG,到如何最終艱難地找到 BUG 的過程,非常值得一看。最後也得出了結論:Flutter 在使用者啟動輔助功能(如閱讀螢幕)的情況下會出現 Crash(新版本已經 fix,同學們都升級一下。)例外這裡面還提及到兩個有意思的點,線上 Zombie 野指標監控和 UI 自動化重現。另外有一個很重要的點:保持和使用者的良好溝通,最後直接上門現場 DEBUG,沒準還可以幫妹子順手修修電腦 >_<。

參考連結:

? LLVM 編譯器中的內建 (built-in) 函式

@looping:以 __builtin_ 開頭的函式宣告或者呼叫其實是一些編譯器內建的函式或者編譯優化處理的開關,其作用類似於巨集,只不過這些內建函式並不是真實的原始碼,而是一段指令塊,起到編譯時的內聯功能。本文就介紹了八個特殊的內建函式及其用法,熟練使用這些內建函式可以提升我們程式的執行效能,也可以擴充套件一些程式設計的模式技巧。

? What's new in RxSwift 5

@olddonkey:RxSwift 5 終於和大家見面了。RxSwift 5 帶來了一些不算小的變化,比如有拆分 Relay 出 RxCocoa,成為獨立框架,轉用 DispatchTimeInterval 以對更小時間間隔的更好支援,捨棄 Variable,新增 do(afterNext:) 以及允許繫結多個觀察者等變化。對於現有的 RxSwift 開發者來說,不算是根本上的變化,但是需要在一些使用習慣和語法上進行相對應的改變。

如果對英文版不是很有信心的話,也可以看看小集團隊釋出的中文翻譯版

? 深入iOS系統底層之映像檔案操作 API 介紹

含笑飲砒霜: 所謂的映像可以理解為將一個程式檔案的內容載入到程式虛擬記憶體中的內容,也就是說程式的映像就是程式磁碟檔案在記憶體中的一個副本。程式檔案和映像之間的關係就如程式和程式之間的關係是一樣的。那關於程式映像操作的 API 有哪些呢:

  • 獲取當前程式中載入的映像的數量
  • 獲取某個映像的 Mach-O 頭部資訊結構體指標
  • 獲取程式中某個映像的名稱
  • 獲取某個庫連結時和執行時的版本號
  • 註冊當前執行緒結束時的回撥函式
  • ...

相關操作的 API 有很多,在 <mach-o/dyld.h> 都有宣告。通過相關 API 的使用,可以檢測程式中某個類的某個方法是否被非法 HOOK 了。可執行程式中定義的類的例項方法的實現地址總是在可執行程式映像的地址區間範圍內,即使是這個方法被可執行程式中的其他方法 HOOK 了,這個 HOOK 的方法地址仍然是在可執行程式的映像地址區間範圍內,我們仍然認為這是一個合法的 HOOK 。如果這個例項方法被惡意攻擊者通過動態庫注入並以方法交換的形式來 HOOK 原有方法的實現時,因為HOOK的方法地址是在惡意注入的動態庫映像的地址區間範圍內,所以我們就可以通過檢測這個類的例項方法的實現地址是否在可執行程式的映像的地址區間範圍內來判斷這個方法是否被惡意 HOOK 了。

? 百度App iOS工程化實踐: EasyBox破冰之旅

@xiaofei86:EasyBox 是手百開發的一套包管理工具集。致力於為超級 App 量身打造一套現代、高效、優雅的研發工具鏈。EasyBox 主體由工程組裝器(Installer)、多倉庫管理工具(MGit)、二進位制管理工具(LFS)三部分構成,分別負責工作區的構建(元件依賴分析、工程的生成與組合)、原始碼倉庫的管理以及二進位制的管理。本文對 EasyBox 的設計進行了講解,從中可以學到一些軟體架構的思想和工程管理的經驗。但並沒有開放原始碼。

? Sharing code between iOS and Android using J2ObjC

tom: 這是關於跨平臺開發的系列文章,之前作者還有討論採用 C++ 來進行 iOS 和 Android 的跨平臺開發。關於跨平臺的好處就不多說了,這篇文章主要介紹了使用 J2ObjC 來進行跨平臺開發。J2ObjC 是一個程式碼轉換器,能夠直接將 Java 程式碼翻譯成 Objective-C 程式碼,從而達到跨平臺開發的目的。注意的是,正如大部分的跨平臺開發框架一樣,一般跨平臺程式碼只適合工作在 Model 層,在 UI 層的程式碼幾乎無法做到一份程式碼共享多個平臺(自帶虛擬機器或者語言翻譯機的除外,如 RN、Flutter 等)。最後總結一下 J2ObjC 的優缺點

優點

  1. 程式碼共享
  2. 可以只用 Java 進行開發(Java 開發人員容易招,iOS 同學嘛)
  3. 可以在 iOS 工程中除錯 Java 程式碼

缺點

  1. 程式碼翻譯總是會出錯的
  2. 如果需要 Swift 混編的話是個災難
  3. 翻譯出來程式碼不是最優形式,會增加包體積大小
  4. 翻譯的範圍有限制,僅限用可支援的 JRE 類
  5. 如果依賴了一些第三方庫,而又與 J2ObjC 不相容的話也是一個大問題

? 100-Days-Of-iOS-DataStructure-Algorithm

kyo: 演算法應該是面試中大多數公司都會考察的點,雖然在日常的業務開發中可能並不常使用,但如果做一些深入的比較複雜的專案,演算法就是必不可少了。可以說,如果在技術上想更深入的瞭解,演算法和資料結構就是必須要熟悉的。在眾多相關的文章中,以 C++,JAVA 等語言進行講解的很多,很少以 OC 來講的文章,而這個系列文章就採用 OC 為主語言,這對其他語言不太瞭解的同學來講是個福音。

工具

SwiftKit

@張嘉夫:用命令列快速生成跨平臺 Swift Framework,支援 iOS、tvOS、watchOS 和 macOS,相容 CocoaPods、Carthage 和 Swift Package Manage,整合了 Fastlane 以便測試和釋出,採用 Jazzy 來生成文件。此外還包括 README.md 模板、格式工具 SwiftLint、持續整合服務配置模板(Travis、GitLab)以及自動判斷庫名在 CocoaPods 上是否已被佔用等等。

Messier - 簡單易用的Objective-C方法跟蹤工具

@紅紙:Messier 可以用來跟蹤 iOS 應用的 Objective-C 方法呼叫。在越獄裝置上可以跟蹤任意應用,在非越獄裝置上也可用於跟蹤除錯中的應用或使用 Monkey Dev 植入框架的專案,僅支援 arm64 的真機。據文中作者介紹,其原理基於 Hook objc_msgSend 來實現函式記錄,儲存本地,使用自研工具匯出檔案後,使用 catapult 進行展示。另外除錯過程中或多或少影響到了除錯效能,適合查問題的時候進行植入。

程式碼

MaLiang - iOS 塗鴉庫

anotheren: MaLiang 是 iOS 平臺基於 Metal 的塗鴉繪圖框架,完全使用 Swift 實現。

目前支援的功能:

  • 筆跡通過貝塞爾曲線進行平滑處理
  • 支援新增自定義貼圖
  • 紋理和貼圖支援旋轉
  • 內建一個熒光筆特效的實現
  • 可以根據壓力自動調整筆跡,支援 3D Touch
  • 支援撤銷和重做
  • 支援滾動和縮放畫布
  • 匯出繪製內容為圖片
  • 將繪製內容儲存為向量文件和從文件恢復資料

內推

老司機週報團隊聯合知識小集和 SwiftGG 翻譯組收錄了一份靠譜的內推職位。

如果你想找工作,點這裡:www.yuque.com/iosalliance…

如果你想招人,點這裡:www.yuque.com/iosalliance…

當然,也歡迎你關注我們每一期的週報,我們會在每期週報底部及時更新編輯內推崗位。

關注我們

我們開通了公眾號,每期釋出時公眾號(OldDriverWeekly)會推送訊息,歡迎關注。

老司機 iOS 週報 #67 | 2019-05-13

同時也支援了 RSS 訂閱:github.com/SwiftOldDri…

說明

? 表示需翻牆,? 表示編輯推薦

預計閱讀時間:? 很快就能讀完(1 - 10 mins);? 中等 (10 - 20 mins);? 慢(20+ mins)

相關文章