老司機 iOS 週報 #27 | 2018-07-16

老司機iOS週報發表於2018-07-16

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

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

新聞

WWDC18 Video Transcripts Now Available

WWDC 2018 的字幕支援全文關鍵詞檢索了!而且通過這個關鍵詞開啟的視訊會直接定位到關鍵詞所在的位置,另外分享的視訊也支援分享某個特定的時間點了。

文章

? Swift GYB

大家經常聽到 boilerplate 這個單詞,一般都用來指代一些相似但又不完全相同的程式碼結構。這篇文章講述了關於這個單詞由來的趣聞,而且還介紹了在 Swift 開發中最常用的一個處理 boilerplate 程式碼的工具:gyb.py。如名字所示,gyb.py 是一個 python 指令碼,這個指令碼可以理解成一個模板生成器,你可以按照規定的格式書寫一個 Swift 模板檔案(其中可以使用 python 的程式碼來做一些重複程式碼的生成)。然後使用 gyb.py 執行該模板檔案即可生成最終的 Swift 程式碼檔案。

除了基本使用方法的介紹,文章中還介紹瞭如何將 gyb.py 配合 Xcode 一起使用。工程中有不少 boilerplate 程式碼但又苦於 Swift 沒有巨集支援沒辦法很好的簡化的小夥伴們,不妨試試看這個方案。

? Web Architecture 101

曾經有一段時間很流行一個面試題:請描述一下使用者在瀏覽器輸入一個網址點選訪問,到最終網頁顯示出內容這之間都發生了什麼。如果你對這個問題感到困惑,這篇文章就是為你而生。該文剖析了一個時下流行的網站系統最常見的組成部分。內容很新,比如還介紹了時下流行的 “Data” 系統的概念,現在大資料時代,越來越多的公司會專門開一個 Data Service 來解決日誌資料儲存、分析、挖掘、模型訓練等需求, 和 Database Service 這樣僅僅完成資料儲存的目的不同,Data Service 往往指一整套資料生命週期的邏輯,而在之前這類資料往往只是扔到一個日誌系統裡進行定期存檔。除此之外,經典的負載均衡、DNS、Cache、搜尋等元件也有逐一介紹,是不可多得的 web 系統入門文章,牆裂推薦。

? [譯]Create ML 教程: 開始入門

Core ML 把機器學習的模型應用變得如此簡單,而唯一的問題就是如何快捷地訓練自己的模型。為此,Apple 在 WWDC18 推出了 Create ML。這篇文章以圖片分類器為例,同時使用了 Create ML 與 Turi Create (WWDC17 後被蘋果收購,使用 Python 來自定義模型)作為對比,讓你對圖形化的模型訓練有一個直觀的認識。如何訓練、評估、改進模型都是值得進一步深入思考的。

很明顯,你能在 Create ML 的身上看到許多 Turi Create 的影子,在 Create ML 上實現所有 Turi Create 的功能也只是時間的問題。另一方面,Swift for TensorFlow 也已經來勢洶洶。想要使用 Core ML 又不會訓練模型的同學,絕對值得推薦。唯一的問題是,Create ML 需要 macOS 10.14 Mojave Beta。

? 騰訊社招 iOS 面試記錄

最新出爐的面試真題,一面常規基礎問題,幫助你查漏補缺。二面聊專案,看完也可以回顧一下自己的專案,對使用到的技術,解決的問題是淺嘗輒止,還是層層深入,從原理層面理解技術,理解問題。

? Flutter混合工程改造實踐

鹹魚團隊作為國內 Flutter 的先行者,給我們帶來了好多優秀的 Flutter 實踐,這次給大家帶來的便是 Flutter 與原有 iOS 工程混合改造實踐。在 RN/Weex 的框架機制下,原 iOS 工程只需要引入基礎 SDK ,js 開發的功能只需要將打出來的 jsbundle 下發/資源引入到原有 iOS 工程即可。而 Flutter 由於在機制上和他們截然不同,在 Release Mode 下,dart 開發的功能需要編譯成 iOS 的 framework ,再由原工程引入,因此在工程混合上會需要對現有工程的持續整合打包構建體系進行不小的改造工作。閒魚團隊針對此給大家帶來了他們的解決方案。

? Better iOS projects: How to manage your tooling with mint

Number42 的 "Better iOS projects" 系列旨在收集能夠方便高效處理 iOS 專案的一些工具和環境。這次介紹的是 Mint —— 一個通過 Swift Package Manager 來構建 Swift 命令列工具的依賴管理器。Mint 最大的亮點就是可以指定工具在不同專案環境下執行不同的版本,解決由於環境配置不一致會影響開發效率的問題。同時它也支援通過 Mintfile 來配置和隔離不同專案中使用的工具,確保各個專案在所有開發環境裡使用的工具都是相同的版本。一直被環境配置問題困擾的 Swift 開發團隊可以嘗試下,不管是設計思路,還是使用體驗都是不錯的。

? 你可能會忽略的 Git 提交規範 約束你的git操作,讓你生無可戀。

現今,Git 已經非常廣泛的應用了。它不僅僅被用在程式碼的版本控制上,甚至類似 UI 設計圖( Sketch )這種工程都開始用 Git 進行版本控制。然而,當團隊到了一定規模的時候,沒有一個統一,合理的 Commit Message 會成為嚴重阻礙開發效率的障礙。

這兩篇文章都是通過介紹一些相關的工具來展示如何規範 Commit Message ,進而通過規範化的 Commit Message 來生成 Changelogs 等。雖然文中案例都不是 iOS 相關,但是依然值得學習參考。

? Video Streaming Tutorial for iOS: Getting Started

Ray Wenderlich 的入門教程基本都是通過一個具體,漸進式的案例,來介紹做法,非常適合剛接觸某個領域的開發者。

本文通過幾個簡單的播放器案例來介紹如何使用 AVPlayer 進行開發。對於剛接觸 iOS 視訊的開發者來說,是個很不錯的入門資料。

? 實現一個優雅的 iOS 事件匯流排

iOS 開發中與不同事件打交道是家常便飯,蘋果提供了不同的方式來訂閱各種型別的事件。比如通過觀察者模式訂閱不同的 Notification,通過代理模式實現不同回撥的訂閱,或者通過 Target-Action 模式 UIButton 等控制元件的使用者事件。那麼能不能有一種更加優雅的方式來處理這些事件呢?接觸過函式響應式程式設計的同學應該都會知道 ReactiveCocoa,它通過 Signal 訂閱的方式提供了一系列的 API 來幫助我們方便地處理這些事件。本文則自己實現了一套優雅的事件匯流排機制,只要通過『定義事件』、『訂閱事件』和『釋出事件』三部曲,就可以優雅地使用這套事件匯流排。

? 帶著《iOS應用逆向與安全》,我還在路上

距離慶哥新書『iOS應用逆向與安全』釋出已經有一個多月了,這篇文章上半部分慶哥發表了自己對學習與選擇的一些看法,下半部分則通過《逆向世界盃直播App 央視影音 - iOS 客戶端》的實戰,為大家演示瞭如何完成一次簡單的逆向。

文中關於學習的看法,深表認同,摘錄一部分與大家分享:

還有就是總會想為什麼別人這麼優秀,都是“大佬”,其實並沒有什麼大佬,或者說每個人都是大佬,只是在不同領域不同方向別人比你多花那麼一點點時間和多那麼一點經驗,換一個領域我們都是小白。或者你有沒有想過,你在做什麼事情的時候總是想著推遲一點點再想,晚一點點再做,或者每一點點就是現在的你和優秀的你之間的一點點差距。

? Anti-If: The missing patterns

程式碼中如果有大量巢狀的 if 邏輯判斷會增加程式碼的理解難度,降低可維護性。文中針對幾個使用 if 的場景提出了優化的方案。

? 深入理解 iOS Crash Log

有一定開發經驗的同學對 crash 日誌分析相信都已經非常熟悉了。不論是自研或者第三方的,還是蘋果自帶的 Crash 收集框架,我們往往都能夠通過 dsym 檔案將日誌符號化後找到有用的異常資訊。這篇文章通過系統自動收集的一個微信 Crash Log,很系統地介紹瞭如何獲取 Crash 日誌檔案,以及如何解讀 Crash 日誌檔案中的每個資訊。最後作者還分享了自己的一些常見的 Code 和 Debug 技巧。

? So, you want to build a “Silicon Valley-like” software developer culture

我們經常談論“工程師文化”,而其中說的最多的是“矽谷的工程師文化”。作者從五個角度來分析工程師文化到底是什麼,包括效率、自我驅動、激勵、試錯、成長這幾個角度。過程和結果同樣重要,而“怎麼做每一件事”恰恰是鑄就工程師文化的基礎,尤其對於帶團隊的 team leader 們來說非常值得一看。

? New in iOS 12: Adding a Custom UI and Interactivity in Local and Push Notifications

從 iOS 10 開始,蘋果陸續增強了系統推送通知的能力,包括推送中附帶圖片、重按快捷操作等等。在 iOS12 中蘋果進一步擴充了推送通知的能力,支援在推送詳情中直接加入按鈕等控制元件,給開發者帶來更豐富的可能性。作者介紹了實現新特性所需要操作的每一個步驟,寫的非常詳細。

? iOS 介面效能優化淺析

隨著硬體升級及系統優化,日常開發中需要針對性的做效能優化的地方可能不多,但遇到問題時需要大量預備知識來應對。本文著重講複雜頁面的效能優化,包含了佈局預排版重用池圖片預解碼及預渲染非同步繪製及在非同步繪製實現時候遇到的坑,推薦閱讀。

? @autoclosure what, why and when

Swift 真是門常用常新的語言,如果你之前沒用過 @autoclosure(不是 @autoreleasepool),我相信你看完本文後會說「哇,還能這樣」。

? Swift 裡的原子屬性

雖然 Swift 裡沒有任何語言層面的支援讓我們去宣告屬性的原子性,但蘋果平臺的框架裡卻有多種鎖的 API,這篇文章就介紹了原子性的定義,各種鎖的定義和應用場景,以及通過各種鎖實現出來的原子屬性。

? 減少 ViewController 的繼承

這周 Swift by Sundell 的文章嘗試著不使用繼承去寫頁面,一個 ViewController 對應一個頁面已經成為我們常識,但我們很多時候其實並不需要那些 ViewController 相關的功能,嘗試著打破這樣常識是改善我們程式碼的開始。

? How To Make Your Code Readable

程式碼寫得好與壞,很多時候不是跟技巧性有關,其實也是一種產品意識,即使是自己單幹,3個月以後看自己如天書般的程式碼(尤其是帶著傻氣的演算法實現)也往往無法追憶當時的思路,更何況大部分的專案都是團隊協作型的,一份程式碼往往會由多個人負責維護,這個時候程式碼的可讀性和可維護性就顯得格外重要了。本文從一個常見的 bad case 出發,一步步展示程式碼的優化思路,讓讀者對於好程式碼和壞程式碼有一個直觀的認識。如果想要了解更多的案例,可以讀一下經典書籍《重構:改善既有程式碼的設計》

? Two Years of Functional Programming in JavaScript: Lessons Learned

本文的作者是一位有著十年以上開發經驗的資深的工程師,本文是他在接觸函數語言程式設計兩年後所獲得的心得和體驗。首次面對函數語言程式設計應該如何入手;函數語言程式設計的重點不在於monads等晦澀的概念,而在於編寫簡潔清晰,無副作用的函式;函數語言程式設計在團隊協作中應該如何看待;明白剛開始切換到函數語言程式設計時的困難。作者對以上幾點都做了很不錯的分析和解答。這是一篇值得對函數語言程式設計感興趣的小夥伴們閱讀的好文章。

? Debugging on iOS With Unified Logging System

介紹了 iOS10 新特性標準日誌的特性以及使用方式。標準日誌會對日誌進行基本的分類,並且會附帶一些關鍵資訊,所以可讀性將會大大增強,建議大家嘗試一下。

? iOS視訊開發(一):視訊採集

本文作者採用圖文結合的方式清晰的介紹了 iOS 視訊採集的相關概念及視訊採集的工作原理,並給出了其在使用過程中的踩到的一些坑,是作為 iOS 視訊開發快速上手不錯的參考文章。

? Design Ops — A New Discipline

當專案越來越大,參與的人員越來越多的時候,即使在目前很多公司已經做了諸如敏捷開發這樣的流程來保證專案的迭代,但或多或少也會面臨一些其他問題。例如設計標準的統一,工作流程的衝突,各種質量問題等等,尤其對於一些可能多地協同辦公的公司就更加明顯。 DesignOps 是一種全新的工作方式,通過這種方式,可以有效協調產品、設計、以及開發人員,通過設計即程式碼的理念,保證產品從規劃、設計、開發、交付整個過程不至於出現流程上的問題,並且提高整個團隊的效率。DesignOps 不是一個只存在於理論上的東西,像 Airbnb 團隊就已經嘗試使用這一工作模式,也有相關文章的分享,有興趣的同學可以 google 一下。而且,目前國外甚至已經有一些公司開始招聘這個方面的職位了,相信後面會有越來越多的公司開始重視這一塊。

工具

iOS 除錯線上 app 中 WebView 的方法

在 JSBox 這款工具中提供了一種 Safari 瀏覽器外掛,可以注入 Eruda / vConsole 等知名 web 控制檯除錯工具,來除錯已經上線的 Web 頁面。但是面對線上三方 App 就無從下手了。這裡介紹一款除錯工具 Thor ,以 HTTP 代理的方式修改網頁中的內容,插入了除錯指令碼,從而實現除錯已上線 app 中 WebView 的能力。

程式碼

Awesome macOS open source applications.

Mac 上的高質量開源應用列表,包含大量原生或跨平臺的 app,這個 repo 的主要目的是幫助開發者找到免費的開源 app 並貢獻程式碼。這個列表按照功能將應用分為 36 個大類,包括瀏覽器、通訊、資料庫、開發者工具等等,此外還列出了每個專案的開發語言。無論是希望參考程式碼,還是希望找到優質的開源軟體,這個列表都很有價值。

GPUImage3

GPUImage 的作者實在是太高產了。GPUImage3 的 shader 處理部分完全使用 Metal 框架重寫了。當然 GPUImage 的 pipeline 還是和 swift2 一樣,基於 Protocol,利用 ImageSource 和ImageConsumer 兩個 protocol 來處理多濾鏡的連結問題。 因為 Metal 的 shader 不是用 glsl 寫的。用的是 C++,所以 Brad Larson 也用 C++ 重寫了一部分shader 的程式碼。 如果研究過 GPUImage2 的同學看 3 應該也不會有什麼壓力。畢竟刨去 Metal 的內容,GPUImage3 和 2 區別很小。

內推

位元組跳動北京 iOS 團隊持續招人中

這是一家非常年輕的創業公司,充滿活力與激情,希望能有更多優秀的人,加入位元組跳動,一起讓人們看見更大的世界(今日頭條、西瓜視訊、悟空問答、懂車帝 、TopBuzz、News Republic...),也讓更多人的美好生活被看見(抖音、火山小視訊、Musical.ly、圖蟲、Faceu...),我的郵箱 raozhizhen@bytedance.com,或者新增我的微信 jingmu1994 瞭解更多公司及崗位資訊。

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

如想了解更多深圳頭條的資訊,可以加小T微信:tomtan,切磋技術和聊情懷都可以喔~~~~

杭州/廣州/深圳 奇志科技招聘 iOS、前端

奇志科技自 2016 年起通過行業無人機協同工作流 Mesh 進入物聯網與人工智慧領域, 併成功為房地產、建築、測繪、電力巡檢等行業提供無人機解決方案。Mesh 在運用 yarn, rollup, vue 等技術棧的同時,利用 Couchbase 設計多端資料同步方案,並深入研究 React Native。也可以微博上私信 @沒故事的卓同學 瞭解。

百度教育事業部招 iOS 開發

部門下面有百度閱讀,百度文庫,百度愛聽等 App 產品。團隊技術氛圍濃厚,有興趣的同學歡迎將簡歷傳送到我的郵箱:lizelei@baidu.com。

上海-加入即刻

即刻 iOS 團隊從一開始就使用純 Swift 開發,至今已有三年多時間,是國內較早大規模使用 Swift 的團隊。我們比較偏愛 RxSwift 和 Texture 等框架,追求和最優秀的工程師一起,用最高的標準做用起來最爽的 app。 如果你認識聰明勤奮、膽大心細、有追求的工程師,那就來加入我們吧!任何推薦或簡歷可直接發給 Jason(即刻 iOS leader): jasy@okjike.com,或微博 @JasonYuh

北京-螞蟻金服 招iOS/安卓/前端開發

螞蟻金服招聘,負責支付寶會員及帳號業務線,地點北京國貿,金臺夕照地鐵站出口 100 米。雖然招聘連結只給了 iOS 的 JD,但前端/安卓/iOS 都要,要求相近。有興趣的同學歡迎將簡歷傳送到:weijing.wdf@alibaba-inc.com / weijing.wdf@antfin.com (同一個郵箱) 或這微博私信 @折騰範兒_味精 瞭解情況。

關注我們

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

老司機 iOS 週報 #27 | 2018-07-16

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

本期編輯

@沒故事的卓同學@四娘@mmoaay@享耳先森@Damonwong@折騰範兒_味精@張嘉夫@AidenRao@Parsifal@aaaron7@方秋枋kyotom510230anotheren水水looping@JasonYuh@老老老老老老老驢, @葉孤城

說明

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

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

相關文章