最多200MB大小,不允许存储,不允许使用网页:tvOS 真的代表了应用的未来吗?

jopen 9年前


“电视的未来将被应用占领”。这是2015年9月9号那场苹果发布会上蒂姆·库克所做的挑衅般的声明。它代表了苹果关于电视未来所持有的看法。我 们终将直接进入到应用当中,选择自己所喜爱的电视节目,从而感受更丰富的自由体验,而不是像现在这样被动地等待电视台给我们播放节目。

由于蒂姆最大胆的做法就是,将成功取决于开发者们在它的 tvOS 平台上最终能够做到什么样子。

最多200MB大小,不允许存储,不允许使用网页: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 的视图层级来最终实现画中画效果。