作者:Chris Wagner
原文地址:tvOS SDK: An iOS Developer’s Initial Impressions
在Walter Isaacson編寫的《Steve Jobs》的最後一章中,Steve說過“我最終實現並讓它擁有了你們能想象到的最簡單的用戶界面”。當時他指的就是Apple TV。
Steve不幸離世已經過去很久了,但是人們一直翹首以盼著這款產品。就在昨天2015年9月9日,超過四個春秋的期盼,我們終於等來了這個禮物,雖然可能與Steve對這款產品的願景和理想有所差距,?但是革命的步伐已經堅實的邁出了第一步。
作為一名iOS開發者,蘋果的產品發布會讓我心潮澎湃,因為Apple宣布,新的Apple TV集成了App Store,這就意味著我們可以為它開發專有的應用,並且會讓我們重新認知已了解的iOS知識,以及會開啟更多新的展現想法、創意的機會。
我和其他教程團隊的成員已經開始深入研究tvOS SDK,並且正在努力准備一些有價值的tvOS教程(通宵達旦!),在此同時,我想從一個iOS開發者的視角與大家分享我對tvOS的初步印象。
讓我們一探究竟吧!
基本概念
老款的Apple TV其實類似一個機頂盒,主要提供的功能是讓用戶通過及其簡單的操作界面導航或浏覽視頻內容。昨天發布的新Apple TV在此基礎上進一步的擴充功能,使一些成熟的應用能在Apple TV中運行,比如購物應用,甚至是游戲。
讓我們來看看以下這些信息:
硬件規格: 值得一說規格是64位 A8處理器,32G或64G的存儲空間,2G的內存,1080p的分辨率以及支持HDMI,Siri遠程遙控,新的Apple TV遙控器。
價格: 新Apple TV的定價為32G 149美元,64G 199美元。這樣的定價出乎大多人的以外,原以為新Apple TV的價格會更高一些。
發售時間: Apple在發布會上給出了一個非常模糊和不確定的發售時間“十月下旬”,但是Apple在發布會之後就立即向開發者們提供了tvOS SDK。現在離正式發售已時日不多,如果大家有針對新Apple TV好的想法,我建議你們要抓緊時間了。
開發硬件: Apple已經宣布了一個開發者計劃允許已經注冊的開發者們請求Apple TV Developer Kit。該計劃可以讓開發者們提前對Apple TV進行開發測試。這看起來似乎是一件很美好的事,但是如果你真的要加入該開發者計劃,那麼仔細看看下面的建議:
-> 注意: 眾所周知,iOS、OSX的開發者計劃都是收費的,tvOS的開發者計劃應該也不例外,不過之前對於該計劃的收費信息是非常含糊不清的,但是現在我們通過Apple員工在開發者論壇上發的帖子中確認了該計劃只需要話費1美元即可加入。如果大家有意為tvOS貢獻一份力量,或者需要編寫教程材料的話,強烈建議你們加入該開發計劃。
開發 tvOS 應用
啰嗦完一堆後,顯然最重要的事就是怎樣為新Apple TV開發應用,這應該也是大家最感興趣的事!
為新Apple TV開發應用實際就是在為tvOS開發應用,當然tvOS這個名字是由Apple根據不同設備而創造的。tvOS仍然是基於iOS開發的,所以有很多框架大家都應該非常熟悉了。
如果要為tvOS開發應用,大家必須要從開發者中心下載Xcode7.1進行開發。該版本是Xcode新的beta版,目前只有該版本支持tvOS以及提供tvOS的模擬器。如果你有需要的話,也可同時下載Xcode7 GM版本,他們可以共存於你們的電腦中。
Apple提供了兩種在tvOS上開發應用的方法:
TVML Apps: 這類應用是使用完整的新開發技術開發的,比如TVML、TVJS、TVMLKit。這對我們來說是一個巨大的驚喜,我們會在之後有較詳細的介紹。
Custom Apps: 這類應用是使用我們已經比較熟悉的開發技術進行開發的,比如大家熟知的一些iOS框架,Storyboard、UIKit、Auto Layout等。
當你們在為Apple TV開發應用時,你們會發現Xcode中會出現單獨的程序目標(這意味著用戶將會單獨購買的形式購買tvOS應用)。雖然Apple在發布會上說Apple TV中的應用支持通用購買模式,也就是針對iOS和tvOS都支持的應用,用戶只需要購買一次即可同時在iPhone和Apple TV上使用。但是從目前的情況來看,我們還不確定Apple是如何實現的,或許在Itunes Connect中支持連接兩個程序目標的功能即將來臨?
TVML Apps
先前我提過,為tvOS開發應用有兩種方式,第一種就是通過TVML、TVJS和TVMLKit技術。如果這些縮寫對於你們來說非常陌生,那麼不要著急,這就告訴你們他們都是什麼:
TVML是一種基於“Television Markup Language”的XML格式。
TVJS是基於JavaScript APIs的腳本語言,它可以根據TVML中定義的內容展示應用。
TVMLKit是連接TVML、TVJS和原生tvOS應用的工具包。
如果你是一名經常使用原生APIs開發原生iOS應用的開發者,那麼看到這些類似前端的技術可能會有點退縮。但希望你能保持一顆學習的心,學習了解這些新的強大的特性。
我在這列舉一個非常典型的Apple TV的應用場景。大家可以想象一下:你們想把一些內容或信息展現給用戶,這些內容和信息儲存在你們的服務器上,並且這些內容的格式、查詢方式都服務於iPhone或iPad中的應用,那麼你肯定會希望你的tvOS中的應用也能方便的使用這些內容,並做到與iOS中應用有相似的展現、查詢、導航方式。
如果我列舉的這個例子正好是你們tvOS應用的需求,那麼你可能需要考慮如何使用TVMLKit工具包。Apple已經為我們開發者完成了一些主要的工作,比如提供了許多可重用的tvOS界面展示模板,這些模板大都與iOS應用的界面神似,所以用戶們並不會感到陌生,這些模板大概有18種之多。大多數模板都可以讓你創建出脫凡的、非常適合家中電視展示的界面。大家可以訪問Apple的文檔查看這些我們強烈推薦使用的模板。
我也推薦大家在tvOS模擬器運行TVML Catalog sample app去查看每個模板。同時你需要啟動一個本地的web服務器,便於tvOS應用通過模板展示內容時訪問,所以你需要仔細查閱README.md文件去了解相關內容。
誠然TVMLKit還有許多知識點,如果你希望基於它開發一款tvOS應用,那麼我提到的一些文檔是非常值得你們去查閱參考的。這裡我著重推薦大家首先看看如何使用菜單導航類的模板,比如menuBarTemplate、mainTemplate、searchTemplate等。然而,如果你希望用戶不只是被動的通過你的tvOS應用觀看或收聽內容,而是希望用戶與應用有更多的交互,給用戶高質量的用戶體驗,那麼你們就需要了解如何開發完整的自定義的tvOS應用。
Custom Apps
你所知道的大多數iOS框架,比如UIKit、Core Graphics、CloudKit等等都可以在tvOS中使用。你可以在Apple提供的這個文檔中查看哪些框架可以用,哪些不可以使用。如果你現在正是一名iOS開發者,那麼會對這個文檔中的列表非常熟悉。而且不管使用Swift還是Objective-C或者C都可以開發tvOS應用。盡管如此,如果想開發自定義的tvOS應用,還是有許多新的知識需要我們學習,作為一名iOS開發者,也應該掌握甚至精通這些新的知識。
Focus Engine
其中一個對於iOS開發者比較陌生的概念是用戶輸入/選擇方法。在使用Apple TV的過程中,用戶不會用手指去按壓或滑動屏幕,取而代之的是使用Apple提供的遙控器或者是一些游戲控制器。
tvOS采用了一個被稱為Focus Engine的引擎系統,它在整個tvOS中有且只有一個。該引擎負責響應當用戶使用遙控器上的手勢操作或按鍵操作對菜單或內容進行上下左右的選擇。
Focus Engine會自動根據用戶的選擇決定要聚焦或展示的視圖,你不需要在代碼中做任何類似選中或導航的處理。比如說,此時展示的界面是你已經在Storyboard中設計好的視圖布局,其中有一個視圖是當前聚焦狀態,那麼當用戶通過手勢往右滑動時,Focus Engine會自動根據當前聚焦的視圖找到與之相鄰的左邊的視圖,並將其選中和聚焦。
作為一個開發者,你必須要學習與Focus Engine相關的API,比如當聚焦的視圖發生變化時如何獲取通知、如何通過編碼觸發聚焦視圖的改變扥等。更多關於Focus Engine的API可以參閱App Programming Guide for tvOS文檔中的 Supporting Focus Within Your App章節。
TVServices
雖然iOS開發者在tvOS應用的開發過程中,主要使用的是一些已經比較熟悉的iOS框架,但是也有一些tvOS特有的框架需要開發者們去了解掌握,比如像新加入的TVServices框架。
TVServices的主要作用是描述你的應用的內容,以便tvOS在首頁的頂部欄位顯示。在首頁頂部欄位顯示的應用都是用戶自己設置的,用戶可以將他們認為最為常用的或最為重要的應用放在首頁頂部欄位,便於快速打開或浏覽其中主要信息。
你們的應用可以在用戶不進入應用的情況下,向用戶提供簡短的、感興趣的信息,這就會使你的應用有了額外價值,使用TVServices無疑是提高你的應用下載量的絕佳手段。比如一個游戲應用,通過TVServices顯示游戲存檔,那麼用戶就可以直接從首頁通過游戲存檔進入游戲。如果是一個社交應用,那麼就可以在首頁顯示社交動態信息,如果是一個照片分享應用,那麼就可以顯示近期朋友和家人分享的照片。
更多關於TVServices的信息可以查閱TVServices Framework Reference文檔。使用好它對你的應用非常有益。
Parallax Images
還有一件會讓你疑惑的可能就是在發布會的Keynote中,Apple著重強調了圖片和應用圖標的視差效果。這是一個非常棒的視圖效果,但是為什麼這個特性會被放在Keynote中提及,它為什麼這麼重要呢?
如果你使用了tvOS模擬器,你就會明白為什麼這個特性如此重要。當移動聚焦視圖時,你需要向左或向右滑動,但如果你只滑動了一點,Apple會對當前聚焦的視圖做一個輕微的旋轉處理,目的是讓用戶知道現在正在作以操作(但是還需要繼續滑動來改變聚焦視圖)。這是一個著眼於細節但又非常有用的特性。
Apple把視差效果看做tvOS設計中的一個關鍵組成部分,並強烈建議應用圖標和電影海報使用該特性。不過感謝Apple在App Programming Guide for tvOS文檔中提供了Creating Parallax Artwork章節,幫助我們創建視差特性的圖片資源,以及為我們提供了視察圖片資源的預覽應用。
Controllers
每一個購買了新Apple TV的用戶,都會收到一個功能強大的新版遙控器。上一代只能上下左右簡單選擇方位以及只有幾個簡單導航按鍵的遙控器,而新一代的Apple TV遙控器增加了更多令人激動的新特性:
玻璃觸控板:位於遙控器的頂部,可以讓用戶在其上面進行一些手勢操作,比如滑動、輕拍、點擊。
麥克風:可以讓用戶通過遙控器訪問Siri(Siri有使用國家的限制)以及可以通過語音控制電視的音量。
陀螺儀:結合動作傳感器可以為用戶提供非常棒的游戲體驗。用戶可以通過傾斜遙控器在游戲中控制方向盤開車,或者控制英雄奔跑穿越山洞。
你可以使用你知道的處理手勢操作的API去監聽滑動或輕點,還有一些新的API去監聽遙控器上不同的按鈕,比如pressesBegan()、pressesEnded()、pressesChanged()和pressesCancelled()。
遙控器通過藍牙技術與Apple TV主機交互,這意味著為藍牙游戲控制器敞開的大門(恕我直言,用Apple的遙控器玩游戲並不是很好的選擇)。Apple已經宣布Nimbus Steelseries Controller將會支持新Apple TV。想了解更多關於這方面的信息請查閱Working with Game Controllers。
tvOS and Games
我們衷心的希望游戲能在tvOS上火起來,Apple似乎是直接瞄准了任天堂漠不關心的一個游戲市場。
tvOS有很健壯的游戲技術作為支撐,SpriteKit和SceneKit都可以在tvOS中正常工作,在Keynote中Crossy Roads開發者展示了他們的tvOS游戲,該游戲使用Unity開發,所以
這也暗示著在不久的將來tvOS也會支持Unity開發的游戲。
大多數用SceneKit開發的游戲都可以無縫移植到新Apple TV中。比如Ray就將教程中介紹過的Zombie Conga游戲移植到了新Apple TV中,花費時間還不到10分鐘,幾乎不需要修改任何代碼。
-> 注意:游戲視頻可前往原文查看,但需要科學上網。
Limitations
或許目前關於tvOS比較有疑惑的兩點就是本地存儲和應用大小的限制。
Limitation: Local Storage
關於本地存儲,基本確定是沒有!如果你的應用需要持久化用戶的數據,那麼你需要使用iCloud、CloudKit或者自己的備份服務去實現。任何試圖存在Apple TV中的數據都不保證在下次打開應用時還嫩存在。如果你想同步不同設置之間的數據,那麼你就需要將數據線存在某個地方,但絕不是Apple TV中。
一定要牢記這點,它對於你設計tvOS應用的結構時很關鍵。這裡列出了一些規則:
如果你需要存儲的數據量小於1MB,iCloud的key-value存儲方式是一個可以選擇的方案。但是要切記,iCloud KVS嚴格限制了只能有所屬者才可以訪問數據,並且不能共享給其他用戶。
如果你需要分享事件或者數據給其他用戶,CloudKit是一個不錯的選擇方案。
如果你開發的是一個跨平台的應用或者有特殊的需求,你就得使用你自己的備份服務了。
Limitation: App Size
另一個限制是關於應用大小的限制,規定不能超過200MB。
在你們掀桌之前,請回顧一下WWDC2015以及介紹過的“On-Demand Resources”相關API。這幾乎像是Apple為tvOS提前鋪墊的。
這些API通過按需下載資源文件減小應用初始安裝時的大小。開發者可以在Xcode中給多媒體資源文件用標簽進行標記,將應用提交後,App Store會自動根據標記將多媒體資源文件拆分為一個一個下載包。當用戶在使用應用時如果需要用到某類標記的資源文件,就可以請求下載該標記的資源文件。當然你得有預期的判斷,要先於用戶使用資源前開始下載他們需要的資源,這樣對於用戶來說他們根本不會感受到因為下載資源帶來的不好的用戶體驗。
舉一個簡單的例子,比如你有一款游戲應用有10個關卡。在用戶安裝該游戲時可以只包含兩個關卡的多媒體資源文件。一旦用戶完成了第一個關卡,你應該發送一個下載請求,下載第三個關卡的多媒體資源文件。當用戶完成了第二個關卡時,第三個關卡需要的資源文件早已下載好准備妥當。在用戶的整個游戲過程中,你就可以運用該機制一步一步去下載所需的資源文件。
雖然這種機制對於開發者來說無疑增加了工作量,但是這對用戶來說是一件非常愉悅的事情。你試想一下,用戶是願意等待下載一個1GB大小的游戲呢,還是更願意下載一個100MB大小的游戲並立即開始游戲呢。不過該機制也存在一個隱患,如果用戶的網絡條件很差,他們一般都更願意在晚上掛著下載。那麼如果用戶在白天玩你的游戲,然後同時用龜速的網絡下載後面關卡的資源文件,這簡直是令人發指的用戶體驗。不幸的是作為tvOS開發者,在這種情形下目前也無能為力。