iPlayground 2020 精彩回顧

Introduction 

iPlayground 是近幾年在 iOS 社群中非常重要的活動,聚集了非常多專業且具經驗的工程師來當講師,分享他們在 iOS 開發上的經驗以及新技術的使用,對於 iOS 開發上有相當大的幫助,所以一到會場就看到滿坑滿谷的人群。

今年演講場地總共有 3 個同時進行,大家可以各自選擇想聽的主題,即使因此沒聽到某些主題,之後主辦單位也會把錄影放到 Youtube 上,所以不用擔心會錯過任何演講主題。

另外今年也有獨立區域,提供給各公司進行不論是公司文化介紹或是徵人活動,工程師之間也可以互相進行交流,可以深深感受到 iPlayground 這幾年的蓬勃發展。

iPlayground 會旗
議程

Session 介紹

為什麼 App 卡卡的?

這次 iPlayground 的 Keynote 是由 John Lin 分享「為什麼 App 卡卡的?」,如同講者本人所言,一個 Keynote session 是要為整個研討會設定一個承先啟後的框架,而 app 的效能也直接影響了使用者的體驗,這確實是 app 開發中最重要的議題之一。

App 用起來要順手

講者自身有 HCI(人機介面互動)研究的相關經驗,分享了除了「感覺」之外,用客觀的數據來衡量什麼才是順手,例如人眼的敏銳度是可以看到 76 Hz 的閃爍;而人對拖曳動作跟點擊動作的忍受程度也不同,點擊超過 69ms 或拖曳超過 11ms 才有反應的話就可能讓使用者覺得「卡」。這提供了我們一個相對客觀的標準來衡量使用者體驗而不再只是靠感覺。

常見的解決方案

接著講者也分享了一些造成使用者覺得 app 不順暢的原因是在一個處理使用者介面的週期可能花費了太多的時間,針對這樣的狀況,講者也提供了一些常見的解決方案,像是重複使用列表中的欄位元件使 app 更有效率地繪製 UI 以及善用 iOS 提供的 multithreading 機制將運算分散到其他 threads。除此之外講者也介紹了作業系統的分時機制讓我們更了解系統底層運作的原理。

Safe Area 

值得特別一提的是,講者對於使用者體驗其實相當細心,不僅僅只是在介紹的主題之中,也貼心的在投影片上設計了一個「安全區」(Safe Area, 同時也是 iOS 開發的專有名詞,自從螢幕的形狀不再只有矩形,可能有瀏海或圓角,iOS 提供了安全區用來指稱螢幕中間可以安放內容的區域),不僅有梗,也顧及了在一個簡報場合下後排的觀眾可能會被前排觀眾阻擋而沒辦法完整的看到投影片的內容。講者在投影片上準備的這個安全區貼心地讓所有現場的觀眾都可以完整閱讀投影片,如此注重使用者體驗細節是值得我們好好學習的。

與廣告帳戶間的頂尖對決 – CoreML、CreateML 在線上產品中做為輔助角色的應用案例

這個 Session 由 Marvin Lin 分享他如何使用 Apple 提供的 Machine learning 工具 CoreML 以及 CreateML 來做到初步判斷留言是否為廣告留言,藉以杜絕不好的使用者體驗。

NLP

自然語言處理發展已久也是 AI 領域中很重要的一塊,Apple 也提供了自然語言處理的 Framework,讓 iOS 開發者可以直接使用,其中一個使用案例是可以用來判斷是否為垃圾郵件。這樣的案例給了 Marvin Lin 一個靈感,是否可以用自然語言處理來判斷內容是否為廣告留言進而杜絕呢?

廣告留言帶給 Marvin Lin 開發的 app 產品不少困擾,留言區原本是提供給使用者一個自由討論的區域,但如果留言區充斥著廣告留言,這樣會造成使用者體驗下降,也喪失了留言區功能的設計,但留言動則上千上萬則也不太可能由人工來處理,因為使用機器學習工具的機會就來了。

此 Session 也特別提到,Apple 的 CoreML 以及 CreateML 是對於剛上手機器學習的工程師一個友善的工具,尤其是公司團隊中即使有專門的機器學習團隊,但由於分工以及效益的關係下,該團隊不一定有資源及時間能馬上接手,因為講者決定可以先用 CoreML 以及 CreateML 工具來實作可行性,以提供未來團隊的參考。

實際的執行方式是,首先蒐集 1 萬條留言左右,並先用工人智慧對每則進行標記,屬於廣告留言的設為 true,反之為 false,並將之設定為 csv 檔案並放進 CreateML 工具進行訓練,就可以產生出一個最基本的 Model。當然第一個 Model 也不一定完全準確,還有微調的可能性。因此講者在第一個 Model 所不能判斷的留言上,另外再訓練第 2 個以及第 3 個模型,讓 Model 準確率逐步達到 80% 左右,如此一來就能有足夠的數據及佐證提供給公司團隊證明此舉的可行性,並讓公司的機器學習團隊之後可以正式投入資源進行更精確的 Model 開發。

最後講者也分享到,使用 CoreML 以及 CreateML 是非常適合初期驗證機器學習 Model 可行性的工具,不過由於 CoreML 以及 CreateML 所提供的可調整參數過少,如果想要更進一步,還是建議要使用能夠微調參數的工具,比如可以直接用 CoreML 以及 CreateML 底層的工具 turiCreate。

想看此 Session 的 iPlayground 共筆可以點擊這裡。

Activity Classification with CreateML using AirPod Pro

本 Session 的講者是 Ethan Fan,介紹他如何用 Apple 的 CreateML 工具以及 AirPod Pro 所提供的 Motion API,來產生一個可以判斷使用者頭部動作的機器學習 Model

Activity Classifier

Activity Classifier 是 Apple 的機器學習工具中針對動作的工具,透過產生 Activity Classifier 的 Model,則可以達成讓機器判斷該動作。在今年 Apple 針對 AirPod Pro 推出了對應的 Motion API 可以讓工程師使用,分別有動作方向的 x 軸,y 軸,以及 z 軸,還有各種加速度的數據,因此講者想到可以藉由結合兩者來產生一個機器學習 Model。

首先戴上 AirPod Pro,並先透過 Motion API 來取得點頭,搖頭,順時鐘搖晃頭,逆時鐘搖晃頭,這四種動作的數據。並把這些數據分類標記後,放入 CreateML 的 Activity Classifier 中產生出的 Model,即可直接拖拉至 Xcode 專案裡面進行開發使用。整個分享過程非常有趣,也聽到了不少有趣的應用。比如講者也提到他的朋友建議可以用此套 Model 設計一個偵測開車是否打瞌睡的 Model,來避免疲勞駕駛。

iOS 開發者 13 倍速技巧

這個 session 主要是知名 Podcaster 13 開發者,分享他如何加速他的開發速度,從安裝 Xcode、Debugging、Xcode 使用技巧、團隊的開發環境,他都不藏私的分享他的加速方法,最後還分享他的學習管道,可以說是資訊量相當豐富的一個 session。

安裝 Xcode 的正確姿勢

iOS 的開發者都知道,每當要更新 Xcode 的新版,從下載、解壓縮、到安裝整個過程是十分曠日費時的,這邊講者就提供了一些技巧來加速這件事情。

首先是不要從 Mac App Store 下載,而是直接從 Apple Developer 網站下載 Xcode,這樣方便保留舊版的 Xcode,方便新舊版本的切換,如果從網路上下載還是覺得太慢的話,拿 USB 跟同事複製壓縮檔過來會是更快的方式。拿到壓縮檔之後,在確認壓縮檔的來源是可信任的前提下,可以直接使用 “xip -x Xcode_file_name.xip”(Xcode_file_name.xip 自行取代成壓縮檔的名稱),如此一來,就可以耗時的驗證流程,直接解壓縮,但略過驗證流程是有風險的,此技巧請小心服用。

Runtime Debugging

因為 build 一個 App 是耗時的,雖然在 debug 的過程當中,難免要重新 build App,但如果能減少重 build 的次數、盡量不要重 build 的話,就能省下不少時間。此外,如果是針對 UI debug 的話,有一些工具可以讓我們不用完全重 build 整個 App,如下:

  • Xcode view debugger
  •  Reveal(付費)
  • SwiftUI Preview

善用這些工具也能省下不少時間,做到加速 debug 這件事情。

Xcode 技巧

身為一位 iOS App 的開發者,大部分的開發時間都是與 Xcode 相處,在這個段落,講者分享了很多實用的 Xcode 快捷鍵,使用快捷鍵可以使開發過程更流暢,在不中斷開發過程的前提下,思緒也較不容易被打斷,進而加快開發速度。由於講者分享的快捷鍵太多,我就舉幾個我沒有聽過,應該是比較少人知道但卻實用的來分享。

「多重游標」是一個可以針對多行程式碼同時進行複製、增加程式碼與減少程式碼的技巧,使用的情境是我們很常要對多行程式碼進行相同的修改,例如: 「要把三個 double 的變數,同時改成 int」就能使用此技巧。Library 面板中的 Code Snippet 也是很實用的功能,可以把一些自己常打但語法較難記住的程式碼,儲存在 Code Snippet 中,下次要打的時候就能直接使用,省下許多回想語法或是上網搜尋語法的時間。最後再講一個我個人覺得很實用的技巧,就是「快速產生有 property 的 init」,我們常常創建一個 class 或 struct 後,property 都定義完了,卻要在 init 內再次逐一打上每個 property,有點繁冗,而講者分享這個功能可以讓我們直接針對已定義的 property 產生對應的 init,省下不少時間。

建立學習新知的管道

在 session 的最後,除了加速以外,講者也分享了自己吸取新知的方式,他說其實每個人的零碎時間很多,而他本身就是透過 Twitter 進行碎片化學習,利用零碎的時間吸取新知,Twitter 上面有很多國外開發者,透過追蹤他們,一點一滴地吸取他們分享的知識,由於 Twitter 上面的訊息都比較簡短,閱讀起來比較沒壓力,一點一點的閱讀,不知不覺就會吸取不少知識,最後他分享了一些他覺得值得追蹤的開發者給我們,鼓勵我們即刻開始使用 Twitter 吸取新知。

從獨立開發到大型專案的 CI/CD 攻略

帶來這個 Session 的是經歷橫跨獨立開發到大型專案,目前任職於星宇航空,同時也是頂尖軟體開發者協會的理事長 Hokila,介紹 app 開發中不可或缺的一環:CI/CD 基礎建設的佈建與選擇。

App 開發之中最重要的事情之一就是將 app 編譯好,並上傳到 App Store 向使用者發布。而這個過程在現今稍具規模的組織都會設法進行程度不一的自動化,來增進開發速度以及減少人為錯誤。講者已其自身經驗分享了以下三種常見的情境:

  • 本機 build script
  • 自行架設 build server
  • 採用 Cloud CI

在本機自行撰寫 build script 可以直接撰寫 shell script 來操作 build tool chain,但現在也有業界上更常見普遍的選擇,直接使用 fastlane 來幫助開發者們撰寫 build script。隨著組織的擴張,可能得開始轉往非本機的選項以利管理跟協作,這時候可能有人會選擇自建 build server,或者使用第三方廠商提供的 Could CI Service。自建的好處是可以完全利用機器的效能、限制存取在內網,比方說目前業界蠻多公司是使用 Jenkins 來自建,但其也有 plugin 管理、需要自行維護機器等問題,因此也有公司會選擇直接採用 Cloud CI Srvice。

講者帶來精彩的分享讓我們知道 app 開發比我們想像的更加寬廣,對整個 app 的 release 流程有更深入的理解,可以幫助開發者在大型專案中透過對 CI/CD 的知識快速的排除可能的問題也幫助相對獨立的開發者建立自己的自動化流程。講者也提供了投影片可以參考詳細的 scripts。

用你我都會的 Swift 語言寫出 LINE 聊天機器人

講者鄭宇哲在這個 session,分享他自己用 Swift 打造 LINE Chatbot 的經驗。為了遊玩動物森友會時,查詢名畫真偽,進而做出的查詢 chatbot。從基礎開始一步步教導大家,涵蓋了所有設定步驟,包含 LINE Developer console,chatboot webhook,server-side Swift Vapor,deploy 到 Heroku, 以及 ngrok 本地端驗證的流程。

打造 LINE Chatbot, 需要在 LINE Developer Console 申請,創建好 Provider 及 Channel,並設定好 web-hook,這樣在自己的 server 上即可收到來自 LINE Platform 的訊息。

LINE Platform

設定好 webhook 後,接下來就是打造自己的 bot server 了。在眾多的 Server-side Swift 的框架中,講者選擇 GitHub 上的星星數最多的 Vapor,使用起來也相當流暢。

目前 LINE 官方 Messaging API SDKs 中,還沒有放上 Swift 的版本,而講者大方地把實作的 Swift 版本放在 GitHub 上,非常有開源精神。

照著範例,即可在 Vapor 的 callback 中,接收到 webhook 傳過來的訊息 payload。此時,會遇到 payload 中的 events array 裡面是不同結構的 json,此時若使用 Swift 的 Codable 來做解析,會需要處理 dynamic type 的問題。講者分享他的作法,在對應的 decode 方法中去對應每一種 event 用不同的 model 進行解析

另外講者也提到開發過程中,通常會是在本地端開發,若要收到 LINE Platform 傳過來的 webhook 則需要連外,此時就必須讓外網能夠連到本地 server,若要自己處理 port forwording 相對比較麻煩。ngrok 是一個方便處理

ngrok intro. image source

除了上述之外,這個 session 還有其他更多內容,深入淺出,非常推薦大家觀看,一起用 Swift 打造自己的 ChatBot!

結語

今年的 iPlayground 同樣誠意滿滿,我們吸取了不少 iOS 的新知以及各講者的開發經驗,也看到許多許久不見的朋友們。透過相互交流,我們可以不斷精進 iOS 知識,也期許可以打造出令用戶更滿意的產品。

在 LINE 很鼓勵工程師參與各種技術研討會,也感謝公司贊助報名費用。

期待明年的 iPlayground 的來到,不論是當講師或是聽眾都會有相當大的收穫。

我們下次再見囉~ Happy Coding!