老司機 iOS 週報 #22 | 2018-06-04

老司機iOS週報發表於2018-06-04

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

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

本週將迎來 WWDC 18,我們會在掘金上參與 WWDC 專題文章的編寫,週報將停更一週。

新聞

Apple Silently Launched Creative Testing in App Store Search Ads

Apple 悄悄釋出了針對 App Store 搜尋廣告的 Creative Testing 功能,移動開發者現在可以在 App Store 裡測試不同的搜尋廣告。雖然這並不是很多人期待的 A/B 測試,但它為廣告發布者提供了更多的權力,這篇文章詳細解釋了這個新功能的用法。

專欄

? ? 深入 Decodable —— 寫一個超越原生的 JSON 解析器

老司機 iOS 專欄最新一篇文章,帶大家深入 Decodable,文章分為兩個部分,第一部分講 Decoder 的抽象,分析原生 JSONDecoder 的一部分實現,第二部分帶著大家自定義一個 JSONDecoder,並且針對原生的不足,做一些針對性的優化,讓自定義的 Decoder 擁有更強的效能和擴充性。

文章

? ? Google Swift Style Guide

這是一份非常具有實踐意義的 style guide。全面、細緻的介紹了各種規範,難能可貴的是有些地方還說明了為何選擇了這樣的規範。即使最後沒有利用這份規範也可以看看一份規範包含了哪些方面,極富參考意義。

Linkedin 的 swift style guide 也是一份比較完整的 style guide。

? ? Core ML入門:構建一個簡單的影像識別應用

由 SwiftGG 翻譯組翻譯自 Sai Kambampati 的部落格。文章一步一步地教大家實現一個基於 CoreML 的影像識別器,而且特別貼心的是,作者提供了一系列的 Demo 工程,讓讀者可以隨意跳過一些準備步驟,提高學習效率。完整的 Demo 工程請在 Github 上檢視。

? 如何實現 App Store App 的自動下載

如果 App Store 是開源的,要按照以下步驟實現自動下載,我想對於絕大多數開發者,都不會是難事:

  1. 進入 App Store,切換 tab 到搜尋介面
  2. 設定搜尋關鍵字、搜尋
  3. 進入列表頁後,點選 App 進入詳情頁點選下載
  4. 根據提示完成登陸、下載,並在下載完成以後跳轉到推薦 Tab
  5. 進入推薦 Tab 後,退出登陸

但不幸的是,App Store 並沒有開源,這篇文章則通過逆向技術找到以上步驟所需要 API 並實現了自動下載,對於逆向初學者來說,這是一個很好的練手專案。

? 黑蘋果安裝學院

自從蘋果採用 Intel 的處理器,OS X 被黑客破解後可以安裝在 Intel CPU 與部分 AMD CPU 的機器上。從而出現了一大批非蘋果裝置而使用蘋果作業系統的機器,被稱為黑蘋果(Hackintosh)。這個倉庫收集了各種型號的黑蘋果安裝方法。我們都知道, 黑蘋果其實是一個具有潛在盜版性質的行為,因為它違反了蘋果公司的 EULA 法案(EULA)。 所以這個 Github 倉庫只是以安裝黑蘋果為一個引線,進而介紹和分享關於蘋果作業系統的相關知識和系統的一些安裝方法。

? 這才是 WKWebview Cookie 管理的正確方式

目前絕大多數的團隊處理 WKWebView Cookie 的方式是這樣子的:webview 每次發起 load url 請求前客戶端塞 cookie 到請求頭裡傳給伺服器,並且通過 js 注入的方式將 cookie 同步給前端這種方案。

文中提出了新的一種方案:首次載入 url 的時候,預先載入一個 cookie webview,將 Cookie 先使用 js注入的方式寫到 cookie webview 的共享 WKProcessPool。當 WKWebView 正式載入的時候就實現了 Cookie 的同步。

? 為什麼我用 Texture 來搭建 App(並且你也應該)

作者介紹了 Texture 被創造出來的起源,與 UIKit 的對比,並且列舉了幾種場景下兩個框架的發揮,例如 stackView 的使用,tableView 的列表反轉等等,得益於 Flexbox 佈局,非同步渲染等等的機制讓 Texture 在這些場景下發揮得比 UIKit 更加優秀。

? RunLoop 原始碼閱讀

現在大部分 iOS 簡歷上都會寫「理解 RunLoop」細問之後卻是一知半解。本文通過原始碼方式講解 RunLoop 相關知識,包含:

  • 為什麼需要 RunLoop?
  • 如何做到一個執行緒只有一個 RunLoop(Thread-specific data)
  • CFRunLoopDoObservers
  • 如何讓執行緒在空閒時休眠及喚醒(mach_msg)

? iOS App 使用 GCD 導致的卡頓問題

在我們通常的認知中,都認為 dispatch_async 非常高效不會卡頓,Peak 在實際專案中發現一個卡頓堆疊可能與 dispatch_async 有關, 之後利用 TSI 向 Apple 尋求 technical support,通過問答形式解釋了為什麼 dispatch_async 有時也會卡頓。

? 高效的資料壓縮編碼方式 Protobuf

本文通過詳細的介紹,幫助讀者瞭解 Protocol buffers 的最新版本 proto3 基本用法和主要特性,並闡述了 Protocol buffers 的編解碼流程,是一篇很詳盡的 Protocol buffers 入門級學習資料。通過閱讀本文,讀者能夠明白以下幾點:

  • Protocol Buffer 利用 varint 原理壓縮資料以後,二進位制資料非常緊湊,option 也算是壓縮體積的一個舉措。所以 pb 體積更小,如果選用它作為網路資料傳輸,勢必相同資料,消耗的網路流量更少。但是並沒有壓縮到極限,float、double 浮點型都沒有壓縮。
  • Protocol Buffer 比 JSON 和 XML 少了 {、}、: 這些符號,體積也減少一些。再加上 varint 壓縮,gzip 壓縮以後體積更小!
  • Protocol Buffer 是 Tag - Value (Tag - Length - Value)的編碼方式的實現,減少了分隔符的使用,資料儲存更加緊湊。
  • Protocol Buffer 另外一個核心價值在於提供了一套工具,一個編譯工具,自動化生成 get/set 程式碼。簡化了多語言互動的複雜度,使得編碼解碼工作有了生產力。
  • Protocol Buffer 不是自我描述的,離開了資料描述 .proto 檔案,就無法理解二進位制資料流。這點即是優點,使資料具有一定的“加密性”,也是缺點,資料可讀性極差。所以 Protocol Buffer 非常適合內部服務之間 RPC 呼叫和傳遞資料。
  • Protocol Buffer 具有向後相容的特性,更新資料結構以後,老版本依舊可以相容,這也是 Protocol Buffer 誕生之初被寄予解決的問題。因為編譯器對不識別的新增欄位會跳過不處理。

擴充套件閱讀

iOS 中使用 Protocol Buffer

Protobuf 中 set_allocated_xxx 排雷

Protobuf3 進階系列

Protobuf 應用實踐之RPC框架:Google gRPC

隨手記實踐 Protobuf 經驗分享

? iOS-factor

12-Factor 是軟體即服務應用(SaaS)的一個著名方法論集合。iOS-factor 則從這個專案得到靈感,提煉出 iOS 開發相對應的方法論。本文則是闡述了這一方法論。目前總共有:依賴管理,配置,開發環境與線上環境等價,部署,本地優先於遠端,向後相容的 API,版本號,持久化資料這八個類別。

? Static linking vs dyld3

優化應用啟動時間是 app 開發中必不可少的一個環節。Allegro 的開發工程師在文中總結了他們如何通過靜態連結優化減少啟動時間的實踐過程。以及遇到了如下幾個問題:

  • 如何解決 Xcode8 不支援 Swift 靜態連結的問題
  • 如何解決靜態連結後資原始檔管理問題
  • 如何解決一個靜態庫被多個庫引用的問題

在文章的第二本部分,Allegro 的開發工程師描述了他如何繞過系統限制讓 app 用上 dyld3,並且通過冷熱啟動的方式對比了 dyld2、dyld3、靜態連結三個之間方式的啟動速度對比。

? 不必要的 HTTP 頭資訊

作者統計了 30 個最常見的 HTTP 頭資訊,其中很多並沒有使用的必要。例如並沒有什麼用,只是起到註釋作用的 Server、X-Powered-By、Via。有實際效果,但並不是實現該效果的最佳方式的 P3P、Expires、X-Frame-Options、X-UA-Compatible。在標準之外的不會被任何瀏覽器識別的 X-ASPNet-Version,X-Cache。 而一些更有用的頭資訊卻很少網站使用,例如提高安全性的 Content-Security-Policy 和 Strict-Transport-Security,提升效能的 Link rel=preload。

? Writing self-documenting Swift code

我們應該儘可能使我們的程式碼和我們設計的 API 更容易被理解,可以拆分複雜的方法,使用清晰明瞭的 API, 為識別符號建立新型別或別名。寫好自解釋程式碼,可以讓我們的註釋專注於架構設計,而不是經常變化的實現細節。

工具

Crunch

一款超好用的 PNG 圖片無失真壓縮工具,提供了三種方便的使用方式:CLI、GUI 和右擊服務,雖然與其他大多數壓縮工具一樣都是基於 Google 的 zopfli 演算法,但 Crunch 會根據不同的圖片,動態調整壓縮引數,以達到最好的壓縮效果。

另外,如果對壓縮率要求不高,但是希望有個萬能的 CLI 壓縮工具的話,Leanify 會是個不錯的選擇,它支援多達 20 多種檔案格式的壓縮。

程式碼

KTVVideoProcess

KTVVideoProcess 是唱吧開源的一個視訊處理框架,整體的設計靈感(Source -> Filter Pipeline -> Output)參考了 GPUImage,但其聲稱提供了比 GPUImage 更高的效能。和作者簡單交流得知其中核心提升就是加入了 concurrent 的能力,GPUImage 只有一個 video process queue 來序列的執行 filter,沒有最大限度壓榨 CPU/GPU 的效能。對於視訊處理的場景,我們需要對每一幀都應用同一組 filter,如果 filter 處理時間太久就會導致丟幀。KTVVideoProcess 針對該場景,實現了並行處理多個幀的機制,較好的解決了極端情況丟幀的問題。

為了提升序列 filter 佇列的效能就寫一個全新的框架,是不是最好的解決辦法呢?這點我持保留意見。一般情況下多 Filter 效能問題可以通過合併 filter、優化 shader 演算法的實現的方式來解決。

初步看了一下,目前完成度還不算高,提供的內建 Filter 還比較少,而且缺少 TwoInputFilter 這樣的常用的基礎 Filter,如果使用免不了會有較多場景需要手寫 shader 來完成。不過框架的程式碼簡潔清晰,如果有希望學習 GPUImage 內部實現的同學倒是可以考慮從這個框架學起。

The unofficial WWDC app for macOS

macOS 平臺上的 Unofficial WWDC app for macOS 這款第三方 WWDC 應用更新了,新版本加入了對 iCloud 同步、Touch Bar 和日曆整合等功能的支援。該應用完全開源,感興趣可以到它的 GitHub 專案頁面看看。

音視訊

? WWDC 97

有網友意外發現 WWDC 97 的 session 居然發行過光碟,釋出到了 youtube。有懷舊情節的朋友可以看看。

推薦兩個視訊:

內推

深圳頭條研發中心誠招各路 iOS 好手一起做取悅自己的專案

關注我們

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

老司機 iOS 週報 #22 | 2018-06-04

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

本期編輯

@沒故事的卓同學@四娘@mmoaay@享耳先森@Damonwong@折騰範兒_味精@張嘉夫@AidenRao@Parsifal@aaaron7@方秋枋,kyo,tom510230

說明

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

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

相關文章