最多200MB大小,不允許存儲,不允許使用網頁:tvOS 真的代表了應用的未來嗎?
“電視的未來將被應用占領”。這是2015年9月9號那場蘋果發布會上蒂姆·庫克所做的挑釁般的聲明。它代表了蘋果關于電視未來所持有的看法。我 們終將直接進入到應用當中,選擇自己所喜愛的電視節目,從而感受更豐富的自由體驗,而不是像現在這樣被動地等待電視臺給我們播放節目。
由于蒂姆最大膽的做法就是,將成功取決于開發者們在它的 tvOS 平臺上最終能夠做到什么樣子。
因此,盡管蘋果認為電視的未來將被應用占領,那么這是否意味著 tvOS 將是這個未來的一份子呢?
現在,我們開始著手搭建一個示例應用,展示 我們舉辦的多個演講中所用到的技術 ,然后測試這個新平臺上這些庫的兼容性。之后,大家會發現我們會遇到不少的限制以及奇怪的特性,至于這些特性是讓人興奮還是讓人嘆息,就完全取決于大家自己的看法了。
不能進行本地存儲
第一個問題,同時也是重要的一個問題,就是 tvOS 不允許進行本地存儲。從某些方面來看,這種做法是可以理解的,因為我們的設備的存儲容量較小,只有 32GB 或者 64GB。雖然這個空間比一般的 iPhone 要大那么一點點,但是面對目前 1080p HD 電影動輒 4~6 GB 的容量大小,這個空間還是太小了。因此,盡可能保留更多的空間以便存放電影是十分有意義的。然而,由于缺乏本地存儲,這導致所有的應用提供商都必須使用 CloudKit 或者其他云服務,才能夠在啟動時恢復應用退出之前的狀態。
當然,我們作為持久化服務提供商,我們可能會擔心這一點會對我們造成不利。但實際上,Realm 在這個環境下依然有用,因為我們提供了內存模式(in-memory mode)。這個模式需要某些硬盤權限來協調內部鎖的執行。當我們在文檔(document)目錄下試圖打開一個 Realm 數據庫時,立刻遇到了這樣一個錯誤:
open() failed: No such file or directory
研究后我們發現,文件系統中的文檔文件夾已經被禁用了,只有 NSCachesDirectory 和 NSTemporaryDirectory 中可以寫入數據。因此,使用 Realm 搭建的 tvOS 應用需要使用緩存(cache)目錄,而不是使用通常的文檔目錄。
應用大小最多 200MB
tvOS 強制規定了應用大小最多只能有 200MB,這可能會極大地影響絕大多數應用。尤其是那些包含靜態資源的游戲,它們的大小往往都會達到 1GB。雖然蘋果通過提供 App Thinning 以及按需資源 來試圖解決這個問題,然而這和他們其他平臺的約束形成了鮮明的背離。
不能使用 Mach 消息
Mach 消息 是一個用來在不同進程間傳遞消息的底層內核技術。我們使用這種技術來讓 Realm 和內置的加密支持模塊建立關聯。我們瀏覽了一遍 tvOS SDK,發現 mach.h 頭文件中列出的發送和接收進程間通信的函數,就像 watchOS 中那樣設定成了不可用狀態。
__WATCHOS_PROHIBITED __TVOS_PROHIBITED extern void mach_msg_destroy(mach_msg_header_t *);
__WATCHOS_PROHIBITED __TVOS_PROHIBITED extern mach_msg_return_t mach_msg_receive(mach_msg_header_t *);
__WATCHOS_PROHIBITED __TVOS_PROHIBITED extern mach_msg_return_t mach_msg_send(mach_msg_header_t *);
多任務不能在 tvOS 上運行似乎很有道理,就像在 iOS 或者 OS X 上。因此,我們不得不禁用 tvOS 上 Realm 的加密功能。
不存在命名管道
和 Mach 消息類似, 命名管道 (Named Pipe)實際上也是進程間通信方式的一種。Realm 增加了進程間通知的支持,以能夠在 Cocoa 上多個進程間支持 Realm 文件的無縫共享。這同樣也允許使用 Realm 瀏覽器來調試文件,即使這個文件正被使用,或者在 iOS 應用和 Watch 擴展中共享同個 Realm 文件的時候。這個通知是通過命名管道來發送接收的,因此每當寫入事務發生之后,通知就能夠被發送給其他的進程,以通知它們 Realm 數據庫發生了變化。
在一開始的時候,Realm 并沒有對此提供支持。因此要讓 Realm 能夠在 tvOS 上工作,我們只是簡單地 回滾到了原先的代碼 ,這樣它只提供了相同進程之間的通知。
粘貼板 API 禁用
既然 Mach 消息和命名管道都那樣了,那么這貨被禁用自然也不奇怪。粘貼板是最頂層的進程間通信 API 形式,允許在 iOS 以及 OS X 中使用拷貝/粘貼功能。在 API 內部,粘貼板實際上使用的是 Mach 消息以在進程間來回地傳遞數據的,因此自然 tvOS 也不支持拷貝或者粘貼。
不支持網頁
這或許是開發者所要處理的最頭疼的限制了。網頁視圖在 iOS 應用中應用廣泛。因為絕大多數應用都要支持多個平臺,因此往往非核心組件都會通過網頁來顯示,以便能夠簡化開發。此外,網頁視圖還能夠在應用交付后隨時更 新,因此測試功能的時候非常靈活。最后,這意味著瀏覽網頁通常將被禁止掉。比如說,對于使用支持 OAuth 的第三方登錄認證的應用來說,它們的登錄系統都必須重新設計,以便能夠適應 tvOS。
蘋果用 TVML 的形式來提供了替代品。這是 XML 的一種形式,允許開發者設計它們應用的視圖,然后通過 Javascript API,結合 TVJS 來一同創建完整的服務器-客戶端應用。這允許開發者在應用發布后調整應用的內容,但是這意味著我們需要使用此項技術來重新構建應用中存在的所有網頁視圖。
沒有內置畫中畫功能
我們在構建 RealmTV 應用的時候遇到了這個問題,那個時候我們正打算實現在視頻的邊緣顯示幻燈片。由于 iOS 9 增加了 iPad 畫中畫功能,我們覺得 tvOS 也會支持這個特性。然而, 新的畫中畫功能只能夠在 iOS 中的 iPad 實現 。最后,我們只能通過調整 AVPlayerViewController 的視圖層級來最終實現畫中畫效果。