最多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 的视图层级来最终实现画中画效果。

Receive news and updates from Realm straight to your inbox

</div>

观众可以通过长按 Apple TV 遥控器来轮流切换三种不同的画中画模式。虽然我们很高兴当前版本实现了这个功能,但是我们仍然由衷地希望未来 tvOS 能够提供内置的画中画支持。

不允许定制视频播放器

和不支持画中画功能一样,我们对 AVKit 中的内置的视频播放器未提供更好的个性化功能感到失望。当然,你可以到 AVFoundation 来构建自己的视频播放器,但是你会发现在适配 Apple TV 的时候会出现不少问题,比如说在顶部导航栏下滑来调整音频设置之类的功能。考虑到 Apple TV 应用的首要目标是媒体工具,因此应该支持这方面以允许开发者自定义播放器,以便能够创造新的体验。

没有 ReplayKit

和画中画功能的缺失一样,浏览遍了 tvOS SDK 之后,我们惊讶地发现 ReplayKit 被禁用了。这个框架主要是针对游戏玩家,让玩家能够记录他们的游戏过程,然后分享给其他的往家或者网上的观众。鉴于 Apple TV 不仅仅宣称其是一个多媒体设备,而且还是一个游戏设备,因此这个框架不允许开发者进行整合确实有点奇怪。其中的一个猜测就是,电视的硬件并没有强大有能够在游戏过程中处理录制 1080p 高清视频的能力。

不允许读取照片

在 iOS 中,你可以通过 UIKit 的UIImagePickerController class,或者 iOS 8 中的 Photos framework,来为用户提供一个照片选择器。这两者在 tvOS 上都被禁用了,这意味着你的应用不能够使用用户照片。这看起来很奇怪,因为电视支持在 iCloud 中浏览存储在其中的照片。

没有日历、通讯录和iMessage

通讯录、联系人和 EventKit 框架都是不可用的,因此应用不能够读取或者修改存储在 iCloud 的相关数据。此外,MessagesUI 框架也是不可用的,它阻止了发送 iMessage 的能力。鉴于新的 Apple TV 遥控器包含了一个 Siri 按钮,因此开发者们又失去了一些绝妙的功能。

不允许多点连接

最后,在 tvOS 中多点连接框架(Multipeer Connectivity)也是不可用的。这个框架处理通过 Wi-Fi、点对点 Wi-Fi 以及蓝牙来识别 iOS 设备,以及之后的设备间数据传输的管理。对于多人游戏而言,这个框架的缺失意味着在电视和用户的 iPhone、iPad、iPod之间进行一场分屏游戏,需要通过 iCloud 或者其他服务来实现数据的同步。这可能对多人棋牌游戏来说没什么太大影响,但是如果能够降低延时的话,何乐而不为呢?

所以这对 tvOS 以及 iOS 来说意味着什么?

在应用开发方面,tvOS 似乎并没有新的突破。watchOS 一直在努力吸引开发者前来,因为它们所做的仍然有许多限制。但是 tvOS 并没有那么糟糕,可它现在的局限性还是给开发者带来了许多障碍。

禁止网页视图的显示似乎非常的不友好,尤其是考虑到 OAuth 的普遍性。虽然 TVML和TVJS是一个推动原生开发的有趣尝试,但是由于其专有的格式以及网页视图的缺失,这仍然迫使开发者不得不重写它们现有的网页内容。拒绝支持网页视图可能反映了苹果的新的长期立场,就如同它们曾经拒绝支持 Flash 哪样。iOS 9 给 Safari 带来了内容回调(content blocking),因此这似乎意味着苹果视图推动原生开发的发展。

至于其他,显然是第一个版本的临时限制。视频播放器个性化以及多点连接的缺乏,似乎能够在未来版本中得到完善。

总而言之,你现在必须在限制和潜在好处之间建立平衡。在美国,平均每个人每天花费2.8个小时看电视。这实际上比每个人每天花费~1.3小时使用应用的时间要多得多。从这个角度来看,tvOS 可能有比 iOS 更大的发展前途。


我们很高兴看到 tvOS 有所发展,如果你对如何在您的 tvOS 应用中使用 Realm 感兴趣,请查看这个PR,直到我们能够正式发布它。一旦这项功能完成,Realm 应用就能够在 App Store 上下载了^^。_

About the content

This content has been published here with the express permission of the author.


Adam Fish

Adam is the Director of Product at Realm, where he manages the product development for currently supported mobile platforms and upcoming new products. He has a strong background in entrepreneurship and software development, having previously co-founded Roobiq, a mobile-first sales productivity app used by sales teams worldwide.

4 design patterns for a RESTless mobile integration »

close