WWDC 2019 朝聖與充電之旅

以通訊軟體為核心,LINE 持續發展圍繞用戶生活的各種服務,同時也抱持著開放的態度,積極與不同的平台或開發工具串聯。因此,我們鼓勵、更贊助 LINE 的工程師參與各式各樣的外部研討會,激發更多創意或合作的可能性,並於會後撰寫見聞,分享給 LINE Engineering Blog 的讀者們。

《LINE 強力徵才中!》與我們一起 Close the Distance 串聯智慧新世界 >> 詳細職缺訊息

蘋果開發生態圈中最重要的技術研討會:Apple World Wide Developer Conference (WWDC) 2019 於 6 月 3~7 日,在美國 San Jose 舉行。在會場上蘋果發布他們最新的技術與連串的議程,開發者隨後可以應用在自己的作品中。這次大會的標誌,一個大腦湧出大量資訊的機器人,真切地讓開發者們體驗到了大量爆炸性的新技術變化。

身為 iOS 開發者,參與 WWDC 著實是一個朝聖與充電之旅。很榮幸也很感謝公司贊助此行,LINE 鼓勵開發者們參與各種技術活動,或至研討會分享,與會眾交流帶回新的想法,進而讓產品更好。

WWDC 官網標誌:出處

The Conference

研討會的開場影片 Goodnight Developers,著實鼓舞了許多努力解決技術難題,用熱情打造產品的開發者們。我特別喜歡其中一個標語,”While the world sleeps, you dream.”,工程師們熬夜開發的確是為了追一個夢想。

WWDC 開場影片:出處

此次大會上發布了頗多開創性的更新與 framework,其中最令開發者們關注的莫過於 SwiftUI。Xcode 及 SwiftUI 的新 canvas 讓開發者可以即時預覽畫面相關的程式碼,而在 canvas 中所做的設定改變會自動即時同步改動回程式碼中。發佈現場觀眾相當喜愛這個功能而起身鼓掌。SwiftUI 的聲明式語法讓程式更容易閱讀與撰寫,用更少的程式碼來實作功能。SwiftUI 語法構成的關鍵,是這次新發佈的 Swift function builder,開發者可以用此來客製特定領域語言,優雅地處理各種不同的複雜開發任務。

Announcing SwiftUI

全新的深色外觀模式對使用者來說是相當貼心的設計,身為一個 iPhone 使用者,我早已引頸期盼這個能讓夜間瀏覽更舒適的功能。要支援這個功能,其中所需要的設計以及開發工作其實並不簡單,尤其是對於擁有大量介面以及主題的大型 App 來說更顯得工程浩大,期望這個新功能可儘早上線。

Keynote, Platform State of the Union 和所有議程的影片都已收錄在官方網站。在此我想分享一些只能在 WWDC 會場中看到,沒有被錄影的 demo。這也是此趟行程所設定的目標之一,盡量參加且分享各種 “線上” 所看不到的,只有發生在 “線下” 的活動。ARKit 3 主打良好的真人及 AR 場景互動整合,在會場中展示了一個 3D 保齡球對戰遊戲,主打的 People Occlusion 技術著實達成順暢地沈浸式遊戲體驗。

ARKit3 保齡球對戰遊戲 Demo

Reality Composer 的展示也相當令人讚嘆。開發者可以使用 Mac 甚至 iPad 快速完成一個 AR 遊戲,而整個開發步驟相對地簡單直覺。在展示影片中,工作人員只用了幾個手勢操作就完成了火山及飛行直升機的 AR 展示。除了作為娛樂目的之外,這種 AR 互動展示也相當適合用在教學上,舉例來說可在動物園或博物館使用 AR 互動軟體來進一步增強小朋友的學習興趣及效果。相當期待未來有更多運用這令人驚艷功能的軟體!

Reality Composer Demo

App Store Lab

在 App Store 中開發者可以和 Apple 的顧問們進行面對面討論,主題涵蓋 App 審核、行銷及分析等。大部分的 App Store Lab 需要事先預約,但收穫絕對值得。對於新創或獨立開發者而言,正面臨已有眾多 App 競逐使用者注意力時,除了靜靜地等待自己的 App 被發現的同時,也很適合參加 App Store Lab 的 “Business & Marketing” 或 “App Review” 等相關主題來得到專家建議。附帶一提,也可以在 App Store 的 Tell Us Your Story 上自我推薦。

在 “Expanding to Taiwan” Lab 中,我遇到了幾位想把服務打進台灣市場的創業家們。正好 LINE 是台灣最多人使用的社群軟體,我們討論了如何在 LINE 上進行廣告及官方帳號的推廣。能跟潛在的使用者及顧客交流,了解他們的需求及期望,作為以後開發上的一些參考,對我來說也是一次相當寶貴的經驗。

Technology Lab

身為開發者,在 WWDC 中最令我期待的莫過於參加 Technology Lab,這是少數幾個開發者能面對面請教 Apple 的工程師的機會。相對地,雖然議程重要且精彩,但可以之後再上網瀏覽。而 Technology Lab 中的各種技術討論只有在 WWDC 的會場中能參與到。除了問各種技術問題之外,開發者甚至可以帶著筆記型電腦,打開 Xcode 及 Instrument,和 Apple 工程師們針對開發上的 Bug 進行討論。現場狀況如下圖,Apple 非常重視與開發者的交流,派出很多有經驗的工程師及顧問在現場 (著深藍色 T-Shirt) 。

開發者與 Apple 工程師在 Technology Lab 中進行討論

LINE 的開發團隊一起整理了一大張開發問題清單,而幸運地抽到 WWDC 門票的同仁負責在 Technology Lab 中詢問這些問題帶回解答。在此紀錄一些我自己日常開發上遇到的問題與 Technology Lab 中得到的回覆。

Performance, Power, Crashes, and Debugging Lab

這個 Lab 的主題涵蓋各種效能分析、偵錯工具,如 Instruments, LLDB, Thread Sanitizer 等等。我事先在 MacBook Pro 上準備了 demo project,請教了在偵錯時使用 LLDB 指令的建議步驟,以及在查看變數常遇到的錯誤。在研究這個可重現的 “Couldn’t materialize” 的錯誤訊息後,Apple 工程師確認這需要修正,和我一起把詳細的 log 上傳到官方的 bug report 系統上。他另外推薦了他主講,沒有在議程表中只有在官網上的議程,LLDB: Beyond “po”。在此議程中,他介紹了在探查變數時使用 “po/p/v” 的準則,以及指令背後的詳細流程概念。整體而言,因為 dynamic type resolution 的緣故,建議第一步先使用 “v” 指令來查探變數。

LLDB: Beyond “po” 投影片內容:出處

HTTP Live Streaming Lab

HTTP Live Streaming (HLS) 讓聲音及影像內容能夠在不同的網路狀況下穩定地被傳送。之前我自己在參與開發 LINE TODAY APP 讓使用者自行切換影片解析度的功能時,相當希望 Apple AVPlayer 已內建這個功能。我們必須處理下載分析 m3u8 playlist 拿到 bitrate 及解析度列表,才能讓使用者用類似 AVPlayerItem preferredMaximumResolution 的指令來指定希望的解析度。但這個指令僅能給定一個期望的最大值,無法指定固定的解析度。Apple 工程師回覆提到他們尚未提供手動指定解析度功能,也沒有類似的最小解析度的指令,但她鼓勵我們把這個願望清單提交到官方的 bug report 系統上,作為未來功能計畫參考。基本上為了讓使用者有順暢的觀影體驗,Apple 建議使用解析度自動調整的功能。在了解我們的期望是在使用者已有 “Auto” 解析度的按鈕選項基礎上,想提供某些使用者寧願暫停以觀看更佳解析度的彈性,她給出了寶貴的建議,我們可以自行實作客製化的影片來源 AVAssetResourceLoaderDelegate 來達成這樣的規格。

UIKit and Collection Lab

SwiftUI 發佈之後立即引起了相當廣泛地討論,不過在我們的程式碼中有大量的 UIKit 及 UICollectionView,也無法立即升級最低支援作業系統版本到 iOS 13 以上,所以短時間內無法應用 SwiftUI 到目前的專案上。在 UIKit Lab 中,我想詢問關於 UIKit 及 SwiftUI,Apple 給開發者的建議。Apple 工程師提到 UIKit 不會被 deprecate,甚至 SwiftUI 的元件 List 也是應用到 UIKit 的 UITableView。此外,SwiftUI 目前仍無法支援二維可重複使用 cell,如同 UICollectionView 的元件。

與此同時,UICollectionView 在這次 WWDC 上有發佈令人激賞的更新。在發佈新的 CompositionalLayout 和 DiffableDataSource 之後,UICollectionView 成為相當萬用的框架,開發者可以用更少的程式碼來開發新功能。CompositionalLayout 中的 reusable orthogonal section 無疑是開發者的救星,在此之前要自己實作類似的功能需要不少功夫,其中的新增及回收的 pool 的管理相當困難,之後開發者僅需要一行指令 orthogonalScrollingBehavior 即可完成。而 DiffableDataSource 運用了 unique identifier 來建立 sections 和 items 的 snapshot,相比既有的 performBatchUpdates() 指令來說更穩定容錯率更高。下面這段影片是 Apple 提供的 Sample Project,其中整合 CompositionalLayout 及 DiffableDataSource,順暢地展示數百個 cells 的排序動畫,而所需要的程式碼僅僅數行而已。推薦瀏覽這個 Sample Project 來體驗這些新發佈的功能。

Insertion Sort of WWDC Sample Project

AltConf

AltConf 是一個社群發起的研討會,舉行地點位於 WWDC 會場旁,日期為六月三至六日。提供無緣抽到 WWDC 門票的開發者們一個額外的選項,AltConf 著重在社群內分享自己開發的洞見及經驗。在 AltConf 會場中,有很多人一邊觀看 WWDC 的議程直播,一邊參與社群的技術討論,這樣的技術社群氛圍相當吸引人。AltConf 中所分享的內容技術水準頗高,所以除了 WWDC 之外,我也參加了幾場 AltConf 的議程與 Lab。

AltConf 議程時間表

AltConf Lab – Fast iOS builds with Bazel

來自 LINE 東京辦公室的同事 Thi Doan 主持了一場相當實用的 Lab,Fast iOS builds with Bazel Lab。他分享了實務上運用 Bazel 來大幅降低編譯所需要的時間。依據依賴關係圖,只重新編譯必要的程式碼,以及運用平行化以及遠端緩存來加速編譯時間。Lab 中有提供給參加者一步步的教學,以及清楚的範例,相當值得深入地研究。

Fast iOS builds with Bazel Lab

AltConf Session – Generic Swift: It Isn’t Supposed to Hurt

“Generic Swift: It Isn’t supposed to Hurt” 是一場非常精彩的演說,講者為 Rob Napier,從中我獲得不少啟發。自從 WWDC 發佈了 Protocol Oriented Programming in Swift,開發者們開始廣泛地運用 protocol、generic 以及 extension。雖然 POP 相當實用,但若在誤用的情況下,容易遇到編譯錯誤,整體程式碼也可能因此變得更複雜難以維護。這場演講用實際的例子來深入地講解正確的概念,來避免 protocols 和 generics 的誤用情形,相當值得一讀。

Generic Swift: It Isn’t Supposed to Hurt

Conclusion

參加 WWDC 於我而言是個不可思議的旅程,更了解行業發展趨勢,遇到來自世界上不同國家的熱情開發者們,相當地具有啟發性。期待好好運用發佈更亮眼的功能给使用者們!

Related Post