Apple Watch應用開發經驗談:我遇到的那些坑

發表於2015-04-26

本文作者張忠良是滴答清單Apple Watch版應用的開發工程師,他用了一週的時間使用純Objective-C語言完成了Apple Watch版滴答清單應用的開發工作。在這裡,他從開發角度闡述了個人對於Apple Watch的理解,以及Apple Watch應用開發過程的經驗心得,適合對iOS開發有一定了解的同學。

首先,開發Apple Watch應用必須掌握WatchKit Framework,這是Apple專門為Apple Watch開發而推出的一套新框架。這套框架中所有的類都是“WK”開頭的,包括檢視控制器類WKInterfaceController、WKUserNotificationInterfaceController,其他UI元素類比如WKInterfaceGroup、WKInterfaceTable、WKInterfaceLabel、WKInterfaceButton等。具體用法就不在這裡贅述了,想要系統地學習WatchKit可以閱讀Chun Tips的《走進WatchKit Framework》。

不過,我個人還是強烈建議大家有時間最好還是仔細看一遍官方原版文件,在幫助你更好地理解API來進行開發的同時,還能從一定程度上降低產生bug的機率。

滴答清單Apple Watch版本的開發基本上還是比較順利的,有設計師和產品經理灑下的血和淚,本人差不多搞了一週,目前應用已經完成上線。在此,具體的開發過程就不詳述了,無非是UI搭建和邏輯處理。簡單講幾個開發中需要注意的點,希望對大家有所幫助。

  • 從技術上講,WatchKit App類似於之前iOS 8上新推出的App Extension(應用擴充套件),比如Today Extension(今天擴充套件)和Share Extension(分享擴充套件)。只要你對iOS開發有一定經驗,UI的搭建相對是比較容易的。重點在於如何讓iPhone和Apple Watch上的資料同步,這時候問題來了,how?

請看:

iOS 8之後,NSFileManager中有了這麼個方法,假設你的應用已經支援了App Group(稍後會介紹),那麼你肯定也有了groupIdentifier,呼叫這個方法會返回一個本地檔案目錄的URL。簡單講它就是一個共享資料夾,任何應用或者擴充套件,只要支援App group並擁有相同的Group ID,都對它有讀寫許可權,這樣一來資料同步就不是問題了。想詳細學習這個的可以閱讀《iOS 8 Extensions》,我只能說看了這個你不懂也難!不過,還是推薦大家閱讀Apple官方文件,一樣的道理,原版的才是最好的。

雖然資料是能夠同步了,但是我如何在Apple Watch上知道iPhone上剛剛建立了一條新任務呢?不用想了,造輪子的成本又高且容易出問題,這裡推薦MMWormhole,它是一個比較成熟穩定的第三方開源庫,用在App Group內的通訊,非常方便好用。原理就不講了,有需要的同學可以去下載研究一下。

  • 搭建UI的時候你會發現Apple Watch並不支援AutoLayout(如果你還在手動佈局,不要掙扎了孩子,好好學習AutoLayout),那麼該怎麼辦?難道只能純程式碼佈局了麼?

Apple當然不會這麼土,WatchKit裡有個類叫做WKInterfaceGroup,乍一看像是UIView,但是這貨其實是用來佈局的。從Storyboard中拉一個WKInterfaceGroup出來,在屬性檢查器(Attributes Inspector)中有個Layout屬性,通過設定成Horizontal或Vertical,就可以讓這個group下所有的子檢視水平排列或豎直排列。再結合AutoLayout的知識,就可以輕鬆滿足設計師大人的任何非人類要求啦。

  • WatchKit中的WKInterfaceTable不同於UITableView,沒有dataSource和delegate,只能通過主動方式填充並展現資料。對應每一種不同型別的cell,都需要為它構造一個rowController(繼承自NSObject),這個rowController負責往這種型別的row中填充需要展現的內容。

方法如下:

通過呼叫這個方法得到指定行的rowController,再呼叫這個rowController的自定義方法來進行渲染。例如:

另外,如果要插入行和刪除行,則要在上述操作之前先呼叫:

到這裡一切順利,但不要太開心,Apple在這裡挖了個大坑,請大家千萬要踩進去!

我們在iOS開發中如果要重新整理UITableView,只要更新資料來源後再呼叫reloadData方法就可以。但是就像之前說的,WKInterfaceTable並沒有主動重新整理資料的方法,只能通過呼叫 [table setRowTypes:nil] 方法先清除所有資料,再用新資料來源重新填充一遍。僅僅是這樣就算了,還有更凶殘的。

假設你現在檢視控制器A中,然後被push到了檢視控制器B,那麼如果你在B中重新整理A中的WKInterfaceTable是沒有用的。但是不是完全沒用,經過多次測試,我發現,資料來源確實是被更新了,但是介面上的內容並沒有重新整理。也就是說,資料來源和介面沒有保持一致。翻遍官方文件和各大技術論壇,都沒有找到解決方案,好不容易在開發者論壇發現這似乎是Apple的一個bug。

暫時的解決方法是,在需要重新整理的時候記錄一個標記位,然後在willActivate的時候根據這個標記位進行延時重新整理。一個很明顯的副作用就是重新整理時會產生跳動,相信之後的版本Apple應該會修復這個問題。

再談幾點個人體會:

個人覺得不管是對Apple Watch持有樂觀期望或是悲觀態度,都只是針對智慧手錶這個新生平臺而非產品本身。我相信任何一個挑剔的人都沒辦法從這個藝術品裡挑出什麼刺來。Apple在預售開始當天就不得不延遲了發貨時間就很好的說明了它的魅力。

也許你們會說這是因為人們普遍會對新鮮事物產生好奇並積極關注它,並不完全是因為它很優秀,但是我們不得不承認,Apple Watch正在衝擊智慧手錶平臺甚至整個生態圈。健康監測、遠端控制、移動支付,像這些操作成本小、週期短、時效性高的任務如果全都能託付給它,那我們的生活是不是會變得更加簡單?

就拿滴答清單來說,一開始開發Apple Watch版本想到的就是加強提醒。手機放在兜裡或者放在一邊的時候,正好有一條任務來了,很可能沒接到(我自己就經常遇這種情況),等想起來去檢視手機的時候已經晚了。和手機不一樣,Apple Watch戴在手上幾乎不會出現人機分離,任務提醒也不容易被miss掉。

所以我們比較看重的是它在移動場景中表現出來的優勢:解放雙手,隨時隨地。手機也很方便,但也不會有人總是拿著手機吧,一旦手機不在手上的時候,很多事情就沒法處理。雖然Apple Watch螢幕比較小,但某些場景下進行操作的時候會簡便很多。

未來規劃的話,也會主要從Apple Watch本身的優勢出發,結合我們產品的一些特性。當前我們開發的Apple Watch應用,就像精簡版的手機應用,只是加強了輔助功能。以後可能會嘗試做一些跟手機應用不一樣的東西,Apple Watch本身有一些強大的功能,比如監測使用者的心率等資料,我們可能會根據這些資料做一些實時的智慧提醒,當然都還只是些想法,有待檢驗。

相關文章