老司機 iOS 週報 #54 | 2019-01-28

老司機iOS週報發表於2019-01-28

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

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

通知

各位讀者大家好!首先歡迎我們的新編輯 - 熱愛分享的愛奇藝 iOS 開發 @J_Knight_ 加入週報團隊~另外春節臨近,本期週報也將是我們年前的最後一期,年後我們再見!祝大家春節快樂!

新聞

? 老司機翻車現場:一個業餘程式設計師組織如何收到滴滴的侵權通知

2019 年 1 月 23 日,這是一個值得所有老司機編輯銘記的日子,我們收到了來自滴滴法務團隊的侵權通知。雖然我們完全不是一個實體組織,也毫無商業性質可言,和滴滴更不在一個行業,Logo 的顏色也完全不同。但是滴滴認為我們從 18 年 1 月開始使用的 Logo 和他們在 18 年 3 月登記的街兔 Logo “高度相似”,可能導致 APP 應用程式設計師的開發人員認為是街兔商標。對於這方面糾紛,我們也是大姑娘坐轎子頭一遭,真談不上老司機。於是我們選擇按照對方要求第一時間替換掉所有可疑圖片。在此期間,我們收到了很多讀者和朋友的建議和幫助,非常感謝大家對老司機週報的關心和支援,我們全新的 Logo 也即將完成設計,很快會與大家見面。

我們願稱此次嚴肅而又哭笑不得的事件為『123 老司機翻車門』,為了其他同在技術社群做分享的朋友避免受此類事件的影響,『知識小集』特地整理了一份指南給大家 - 老司機翻車現場 續:技術之外,程式設計師如何自我保護

? Swift 5 Release Notes for Xcode 10.2 beta

萬眾期待中,Swift 5.0 終於和 Xcode 10.2 Beta 以及 iOS 12.2 Beta,macOS 10.14.4 Beta 一起降臨。雖然距離正式版還有大概一個月多一點的時間,但是各位 iOS Swift 開發者已經可以開始著手準備進行適配了。

Swift 5.0 應該能算是 Swift 從 1.0 以來的最大變革。不是因為語法變化多,而是因為從 5.0 開始,Swift 終於進入了 ABI 穩定時代,系統將自帶 Swift 動態庫,老版本 Swift 編譯的庫也將可以輕鬆的用到更新版本的 Swift 專案中。

除了上面蘋果官方給出的連結,也可以參考知識小集團隊的翻譯版本

Upcoming Changes for Organization Teams

從 2019-02-12 開始,蘋果開發者網站(developer.apple.com)和 App Store Connect 將會共用一套成員管理系統,有些角色許可權將合併。這是個期待已久的改動,簡化我們的維護成本。

文章

? ? Server-provided animations in iOS apps

這篇來自 Badoo 團隊的文章用一個例子介紹瞭如何將 Adobe After Effects(AAE)的動畫匯出為 iOS app 可以讀取的格式(藉助 Lottie 庫),然後建立一種動畫雲端儲存服務,將動畫儲存在伺服器上,然後按需傳遞給客戶端 app。這種方法最顯著的優點就是可以對動畫更新流程進行解耦,也就是說如果要釋出一個漂亮的新動畫,設計師只要給伺服器團隊提供 JSON 就可以了,效率非常高!還有一個優點是不同的客戶端平臺(iOS、Android、Web)可以實現完全相同的功能而不需要調整現存的伺服器端功能或原生動畫。

? ? A RunLoop for your Swift script

上一期推薦裡面有一篇關於 swift-sh 的介紹,如若未讀,可以先跳轉過去一看。 這一文章主要是給出一下 Tips,當你需要執行一個非同步任務的時候會發現,指令碼跑完就結束,非同步任務自然也得不到呼叫了,這是不符合需求的。iOS App 啟動後會進入 Runloop 當中不停的在休眠和執行狀態迴圈,保證 APP 在沒任務的狀態也不會退出。同理,在指令碼中,執行 RunLoop.main.run() 或者 dispatchMain() 會讓指令碼進入啟動 Runloop,不會結束。當你非同步任務 callback 後,呼叫 exit(EXIT_SUCCESS)exit(EXIT_FAILURE) 退出當前 Runloop,並且結束指令碼。

? ? 2018,我們的元件化實施之路

本篇文章是諸葛找房 iOS 技術團隊近半年元件化實施之路的經驗積累與沉澱,文章主要有 2 大部分。

第一部分主要講了元件化可選用的方案、元件化的分層、業務元件的拆分步驟:

  1. 元件預處理
  2. 元件抽離、編譯、執行
  3. 元件引入

第二部分分享了在實施元件化過程中遇到的一些問題:

  • 主工程中業務元件的引用方式問題
  • 業務元件的開發時機問題
  • 業務元件如何測試
  • 元件後續的開發與維護和元件回滾
  • 業務元件的粒度
  • 關於業務元件中檔案的命名規則
  • 關於不同專案下同一業務元件的個性化差異解決方案
  • 其他細節問題如如何處理元件之間的相互跳轉、業務元件之間如何進行復用等
  • 關於業務元件的評價標準

元件化是一個漫長、繁瑣、複雜但有意義的過程,是一項團隊性的工作,不管是正在打算實施,還是已經進行過元件化實踐,都可以閱讀本文,相信讀者朋友閱讀本文都會有一定收穫。

? React Native vs Kotlin Multiplatform. How the Future of Multiplatform Development Will Look Like?

作者對比了 React Native 和 Kotlin 在跨平臺上各自的優劣,同時也談了自己對跨平臺的未來的思考,雖然不是針對 iOS 的,但是也值得閱讀參考。

? Flutter vs React Native: A Developer’s Perspective

老生常談的話題,作者從十個方面去比較了 Flutter 和 React Native 的優劣,可供還在選型的同學們參考。

? How to use the coordinator pattern in iOS apps

本文介紹瞭如何使用 Coordinator Pattern 這一設計模式來分離出本不屬於 View Controller 的一些職責 ,避免導致 Massive View Controller 的形成。Coordinator Pattern 可以翻譯為協作者模式,該設計模式並不在 GOF 的 23 個設計模式之中。

作者結合程式碼,從 Coordinator 的建立到應用,講解了一個如何將跳轉功能分離出 View Controller 的例子。讀者通過閱讀本文,可以瞭解到何為協作者模式,以及如何將該模式應用到我們自己的 APP 開發中。

相關閱讀:The Coordinator

? Xcode tips and tricks – part two

文接上回,Xcode tips and tricks 系列的第二個合輯來了!作者更新的速度很快,本期仍然是 10 個快捷使用 Xcode 的文字 + 小視訊,你肯定能發現一些“原來還能這樣操作”的點。作者也在蒐集大家的建議,如果你有什麼清奇的手法,也不妨分享出來吧!

? WKWebView 實現瀏覽歷史恢復

在使用 WKWebView 的時候,我們會發現,WKWebView 無法實現瀏覽歷史的持久化。WKWebView 中 backForwardList 屬性用來記錄瀏覽歷史,但這個屬性是隻讀的,且在下次冷啟動 App 的時候,backForwardList 是全新的,故而會有這個問題。

如何實現 WKWebView 瀏覽歷史的持久化?本文作者通對 Firefox 的相關原始碼進行分析,借鑑了 Firefox 瀏覽器的實現方式。總結一下:

  1. 當 App 啟動需要恢復瀏覽歷史的時候,啟動一個本地的 Web server 並且載入一個特定的本地頁面

  2. 提取之前儲存的所有 url 資訊,構造本地 url 越過同源策略限制,傳遞到特定本地頁面中,該頁面通過呼叫 pushState 來達到修改 backForwradList 的目的

  3. 當本地載入這些特殊 url 的時候,之前啟動的本地 server 可以將其重定向到正確的url

? 細說 iOS 程式碼簽名

iOS 簽名機制其實挺複雜,我們可以跟隨作者的腳步,一點點的去了解 iOS 簽名機制中每一步的含義,此外作者還貼心的幫助我們將文章拆分,有助於我們分步閱讀。

因作者篇幅比較長,講解的比較深入,有興趣的同學可以通篇讀完收益更大。若時間有限,推薦縮略版的 iOS App 簽名的原理 供大家參考。

推薦人:xelzmm

? Clear and searchable logging in Swift with OSLog

蘋果在 WWDC 2016 (Unified Logging and Activity Tracing) 推出了新的統一日誌系統(the new Unified Logging system)—— OSLog,它比以前的 print 或者 NSLog 功能要強大的多,蘋果也是強力推薦使用新的統一日誌系統。

本文主要介紹了新日誌系統的三大特性:

  1. 新日誌系統能夠按子系統 (subsystem) 和分類 (category) 進行篩選搜尋

    let ui = OSLog(subsystem: "com.lordcodes.chat.ChatApp", category: "UI")
    os_log("Contact selected", log: ui)
    複製程式碼
  2. 同時也支援指定日誌級別 (Default, Info, Debug, Error, Fault)

    os_log("Contact selected", log: .ui, type: .info)
    複製程式碼
  3. 預設不收集動態字串 (dynamic strings) 和複雜物件 (complex dynamic objects) 的列印資訊,確保使用者敏感資訊不會持久化到日誌檔案,需要收集的話要在格式化輸出時指定為 public

    os_log("Contact %{private}ld selected", 2)
    os_log("HTTP response: %{public}@", responseCode)
    複製程式碼

注:CocoaLumberjack 封裝的日誌系統是支援 os_log(DDOSLogger) 的。

? 以流的形式執行 Multipart 請求

Foundation 框架中的 URL 類提供了非常全面的功能,此後還在 iOS 7 中新增了 URLSession 類。儘管如此,基礎庫中仍然缺少 multipart 檔案上傳的功能。 本文介紹了怎樣發起 multipart 請求,併為解決多檔案傳輸的效能問題,通過 AFNetworking 和 Alamofire 的方式,將硬碟中資料以流的形式讀取來執行 Multipart 請求解決此問題。

? Using protocols as composable extensions

面向協議是 Swift 推崇的一種程式設計正規化,標準庫裡的基礎型別也都是基於協議搭建起來的,利用 protocol extensions 的特性去達成複用和組合,但這些正規化如何落實到業務上呢?這篇文章的作者就介紹瞭如何通過 protocol extension 去完成一個載入動畫,並且對比了繼承和協議的兩種實現方式。

? 使用 Flutter 一年後,這是我得到的經驗

過去一年開發者們對 Flutter 的熱情有多高相信已經無需多言。Google 出品、跨平臺、效能高等種種標籤讓越來越多的人加入其中。本文總結了作者一年來開發 Flutter 的一些心得,作者在 Flutter 上豐富的開發經驗所進行的總結相信對於接下來想要嘗試 Flutter 的同學是很實用的,這對我們做技術選型以及更多的考慮會很有幫助。

程式碼

? UIKitSwiftDSL

迫於 StoryBoard 寫佈局帶來各種協作上的問題,大型專案的佈局一般都用純程式碼來實現。純程式碼佈局最大的問題是可讀性太低,有沒有辦法改善? UIKitSwiftDSL 作者提供一個新思路:用區區 200 行程式碼實現一套佈局 DSL(Domain Specific Language),通過提供宣告式的寫法提升佈局程式碼的可讀性。

建議通讀原始碼,實現不復雜帶來的使用體驗卻很有趣。或許我們也可以嘗試設計一些 DSL 來優化特定問題。

? flutter-go

阿里出品,Flutter 元件演示 demo 和中文文件,同時包括了 iOS 與 Android,快上手試一試。

habbit

個人 Flutter 作品,演示了一個完整的習慣跟蹤 App 。從完成度上看還可以,複雜度不夠,主要是演示了 RxDart 的用法。

swift-algorithm-club-cn

swift-algorithm-club 主要是 Swift 來實現演算法和資料結構的原始碼和文章,對應文章都有對該演算法的講解,如果在學習或者複習演算法的同學,不妨一看。

音視訊

ggtalk | 廣義跳槽論:簡潔明瞭的方法論

這一期的 ggtalk 延續了上一次程式設計師比較關心的話題:跳槽。邀請來了老牌程式設計師、產品經理:Easy。相信經常刷微博的同學應該都知道他,Easy 之前在微博做過程式設計師和產品經理,也經歷過獨立開發。對於程式設計師的職場方法論有一套獨特的心得,我聽完之後感觸頗深。比如作為程式設計師,不要只關注公司是否能出得起自己希望的薪水,更重要是要關注自己所能給公司帶來的價值,不要被短期的供需不平矇蔽了雙眼。還有程式設計師如何提升自己的影響力? 最重要是能給別人創造價值。除此之外,還有不少有趣的視角。推薦大家收聽。

內推

關注我們

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

老司機 iOS 週報 #54 | 2019-01-28

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

本期編輯

@四娘@享耳先森@Damonwong@折騰範兒_味精@張嘉夫@Parsifal@aaaron7@kyo@tom510230@anotheren@水水@looping@老老老老老老老驢@小非86@邦ben@紅紙@含笑飲砒霜@JimQ@XanderXu@老峰@zvving@J_Knight_

說明

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

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

相關文章