老司機 iOS 週報 #41 | 2018-10-29

老司機iOS週報發表於2018-10-29

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

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

小專欄

[譯] Swift 標準庫原始碼閱讀指南

對於 Swift 開發者來說,Swift 標準庫的開源可以說是很值得高興的事情,因為我們可以在標準庫中學到很多優秀的設計以及瞭解具體的實現邏輯。當然,很多人可能和我一樣,不知道如何在本地搭建一個可編譯的 Swift 標準庫。這篇文章就提供了一個很通俗易懂的教程,如果你對閱讀原始碼感興趣,可以藉助這篇文章,在自己的電腦搭建一個 Swift 標準庫專案,然後在閒暇之餘看一看裡面的程式碼。

文章

? ? iOS 記憶體管理研究

來自週報編輯 Jason Yu 同學的大作。

雖然現在 iOS 裝置的記憶體容量越來越大,很多時候開發者也不再需要去考慮記憶體佔用的問題。但是,當產品越來越大,功能越來越複雜的時候,記憶體優化依然會成為一個避不開的問題。

本文介紹了 iOS 記憶體管理的一些基本知識,同時也涵蓋了在解決 OOM 問題時候的一些小技巧。若是你對 iOS 的記憶體優化依然存在一些問題,相信讀完文章能讓你有更加清晰的瞭解。

? ? iOS 系統中導航欄的轉場解決方案與最佳實踐

在 App 開發階段,涉及到導航欄樣式改變的需求時,經常會遇到轉場效果不佳或者與預期樣式不符的“小問題”。本文由美團技術團隊出品,詳細講解了 UINavigationBar 的生命週期、導航欄樣式轉換的時機,同時給出了相關最佳實踐,建議仔細閱讀。

? ? iOS UI Automation Tests at Babylon

UI 自動化測試是非常不好做的,如果拿捏不準很容易導致它變成投入產出比低、維護成本高、穩定性差的一個失敗專案。所以在使用自動化測試驗證產品功能的同時,也要投入人力在解決技術本身的問題上做深入研究。本文就描述了他們在使用自動化測試時遇到的問題,以及如何解決的。可以看出他們在處理測試場景失敗率高和測試效能低這些問題上有自己的最佳實踐,特別是對網路請求這塊問題的處理思路,非常值得借鑑。要想把自動化測試做好或者正打算做自動化測試的團隊可以仔細研讀參考下。

? 【QCon2018】Flutter & Dart三端一體化開發

Flutter 可以說是 2018 年移動開發領域最熱的技術, 不論是跨平臺+獨立渲染的工作機制,還是 Google 積極推廣的下一代移動 OS:fuchsia 的核心開發框架,都為 Flutter 賺足了眼球。而閒魚作為國內第一個認真使用 Flutter 的團隊, 為 Flutter 社群帶來了非常多有價值的內容。本文介紹了閒魚目前正在踐行的“三端一體化開發”概念。什麼意思?就是不僅通過Flutter 實現 iOS,Android 端都用Dart 來開發,而且還使用 Dart 來構建微服務的膠水層,由客戶端開發同學自己構建需要用到的服務與介面,並且通過一系列工具鏈的完善提升開發效率。當然,任何聽起來過於優雅的方案都免不了會踩坑,不過可以預見的是這套架構在絕大多數場景下能夠顯著提升整個業務迭代的效率。(麻麻再也不用擔心客戶端和後臺 debug 時互相甩鍋了)。

當然,這樣“膠水層”要 work 的前提是,有一套很優雅魯棒穩定的底層服務與介面,能夠讓膠水層中各種組合與呼叫,這一點對於目前國內很多野蠻生長的網際網路公司來說還是挺難的。

? Flutter瘦身大作戰

這篇文章依然是閒魚團隊帶來的 Flutter 使用經驗,從 iOS 的編譯產物構成角度,深度探討了如何對 Flutter 專案進行瘦身優化。從文章中可以看出,除了一些常規的編譯指令優化,符號檔案移除,資源精簡等方面,顯示的進行型別轉換也會導致包大小的增加,看起來主要是編譯系統自動增加的一些異常處理導致的。

? 從爬蟲攻擊者角度談客戶端 API 安全設計

本文介紹了基本的 API 被逆向的例項,提醒開發者需要多注意安全防護。 常規的 API 安全,需要做好安全保護,見招拆招,加大逆向難度:

  • Android 必須混淆加固,防止原始碼簡單被逆(iOS混淆作為可選項)
  • 請求使用 HTTPS,防止內容被抓包,安全要求高的,可以開啟雙向校驗,需要注意證書的過期問題,做好證書更新功能。證書內容最好以字串的方式寫入到程式內,以防止檔案容易被解壓得到
  • 請求攜帶簽名簽名演算法通常使用 token + params + 鹽值 進行演算法計算,演算法最好使用 C/C++ 編寫,並且混淆加固,防止被輕易破解進行篡改或者偽造請求
  • 異常請求進行限制,如:ip 在短時間內大量訪問,請求重複提交
  • 通過 Cookie Session/OAuth/JWT 等方式進行鑑權校驗,進行許可權管理(可閱讀下方連結深入瞭解)

延展閱讀:

? Best strategies for configuring multiple environments in Xcode projects

在 Xcode 專案中配置不同環境,很多人會選擇新增 Target,但這並不是一個很好的方法,太重了,你需要維護多個 Target 及它們的 Info.plist。最好的策略是新增新的 Configurations,然後給其設定該環境下的 xcconfig 配置檔案。還能在 Build Settings 裡為 Configuration 設定不同的 bundle identifier、產品名稱,應用圖示,使它們能同時執行在一個手機上,並得到很好的區分。

? 將 75000 行原生 iOS 應用程式移植到 Flutter 後,結果太驚訝!

原文:Porting a 75,000 line native iOS app to Flutter

吐槽一下翻譯文的標題,濃濃的國內槍文的感覺。但是,講回來這篇文章本身的質量還是非常不錯的。

文章作者是澳大利亞的 Easy Diet Diary App 的作者。他們之前有 iOS 版本,也一直計劃出一個 Android 版本,鑑於兩個程式碼庫的複雜度一直沒有施行。

在進行了 Flutter 重構之後,作者發現程式碼量相對於之前 Objective-C 和 Swift 混編有了很明顯的下降。大部分少掉的程式碼量來自於 Storyboard 被 Widget 替換,這也是 Flutter 從一開始就在設計上的一個優勢。

文章對還沒嘗試過 Flutter 的開發者來說,是個可以借鑑的參考。

? ? Building an iOS App Without Xcode’s Build System

本文主要介紹了一個簡易 App 的構建流程。

其並非一個純理論的構建描述,而是將整個過程分解成多個步驟,主要分為編譯原始檔、編譯&拷貝資原始檔、拷貝 Info.plist、拷貝 Swift 執行庫、簽名和安裝。文中作者有心地附註了相應指令碼以及相關原理,讀者可以跟著作者,完整實驗作者的每一個步驟,更加深刻地瞭解到一個 App 整體的構建流程。另外,在文末作者留了幾個可繼續實驗鑽研的方向,可供讀者繼續深入探究。

文章對於未了解過 App 構建流程的開發者來說,是個不錯的參考。

? 從彙編程式碼探究 NSClassFromString 實現

雖然在 iOS 中,Foundation 庫是不開源的,但是可以通過一定的方法,取得其編譯後的彙編指令,對於有一定彙編知識的人來說,可以大致推斷出某些介面的大體實現細節。本文作者通過開發中遇到的一個問題,刨根問底,對於 NSClassFromString 這個方法的具體實現進行了細緻的分析。

誠然,iOS 的各種官方閉源框架裡,我們不可能一個一個介面去推斷其實現。但當遇到具體困擾我們的問題時候,我覺得我們正需要本文作者那樣,可以深入研究的精神。通過閱讀本文,相比於知道 NSClassFromString 的實現細節,瞭解如何通過彙編來推敲介面的實現細節更加重要一些。

? Swift​Syntax

libSyntax 是 Swift 專案的工具庫,目前被用於 Swift 專案的遷移工作。通過直接操作 AST 的方式,生成結構化的程式碼。而 SwiftSyntax 則是 libSyntax 的封裝,為我們提供了 Swift 型別安全的方式,來操作和生成程式碼。

Mattt 在文章前半部分主要講了什麼是 AST 以及 Swift​Syntax 如何通過 AST 生成程式碼,在文章後半部分描述瞭如何通過 Swift​Syntax 生成 Swift 程式碼、如何通過 Swift​Syntax 替換 Swift 程式碼以及如何通過 Swift​Syntax 實現 Swift 程式碼高亮的功能。

? Dealing with Swift toolchain

文章重點介紹了各系統下如何安裝 Swift toolchain、不同版本的 Swift 如何共存?以及各執行檔案之間的關係,如 swift-build, swift-packageswift-run

? Using PromiseKit

當你需要連續地執行多個非同步過程時,總會無可避免的出現地獄回撥。為此,PromiseKit 是一個不錯的解決方案。本文從實際的案例出發,為你深入淺出的講解了如何優雅的使用它,建議閱讀。

? 通過 internal 隱藏內部屬性

這篇文章介紹了作者在封裝資料庫時遇到的問題——如何處理 public 型別的 internal 屬性,讓外部呼叫者可以在無法得知 internal 屬性的同時生成這個 public 型別的例項。在暴露必要介面的同時隱藏實現細節,是一件不容易做對的事情,文章很簡短,希望大家看完之後可以更好地處理類似的介面設計問題。

? 從Xcode10不再支援libstdc++說起

Xcode10起,蘋果摒棄了對 libstdc++ 庫的支援轉而支援 libc++ 庫。本文對 Xcode 中的 C++ 標準庫進行了深入的研究。值得對編譯器話題和 C++ 有興趣的讀者閱讀。

? Prefetching images size without downloading them [entirely] in Swift

如果在處理自定義佈局時遇到需要遠端載入的圖片,很容易出現先有雞還是先有蛋的問題——需要為圖片預留出合適的空間,但不下載圖片就無法知道它的尺寸。如果一邊下載一邊調整佈局,這些元素就會出現和 web 一樣胡蹦亂跳的滑稽效果,直到下載結束才能停下來,從而導致糟糕的 UX/UI 體驗,讓使用者大感失望。在這篇文章裡,作者會教你如何在顯示圖片之前預載入圖片的尺寸資訊,以便用在 UICollectionView/UITableView 的 pre-fetching 方法中。

工具

iOSLocalizationEditor

通常 iPhone 上的一些應用需要支援多國語言,這要確保所有內容都已翻譯,任何語言都不能丟失任何字串,這是一件比較痛苦的事情。而 iOSLocalizationEditor 是一款在 macOS 上幫助使用者編輯和管理 app localizations 的圖形化工具,它會顯示每種語言的所有本地化版本,並能方便快捷的找出你缺失的 key 。如果想要試試看的朋友,也可以參考下這篇文章:Checking for missing translations in iOS projects

程式碼

MVCTodo

我們曾在 17 期週報中推薦過 - A Better MVC 的文章和視訊,現在時隔半年,作者為這篇文章提供了一個簡單的 demo,幫助讀者去理解和實踐他推薦的 MVC 架構。強烈建議閱讀下這個 repo 的 readme,作者很有心地列出了這個 demo 你應該重點看哪些,略過哪些東西。

內推

關注我們

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

老司機 iOS 週報 #41 | 2018-10-29

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

本期編輯

@四娘@享耳先森@Damonwong@折騰範兒_味精@張嘉夫@AidenRao@Parsifal@aaaron7@方秋枋kyotom510230anotheren水水looping@JasonYuh@老老老老老老老驢@小非86@邦ben@紅紙@含笑飲砒霜

說明

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

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

相關文章