金氧

一个iOS开发者对tvOS SDK的初探

在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中运行,比如购物应用,甚至是游戏。

tvOS-1

让我们来看看以下这些信息:

  • 硬件规格: 值得一说规格是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上开发应用的方法:

  1. TVML Apps: 这类应用是使用完整的新开发技术开发的,比如TVML、TVJS、TVMLKit。这对我们来说是一个巨大的惊喜,我们会在之后有较详细的介绍。
  2. 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-2

如果我列举的这个例子正好是你们tvOS应用的需求,那么你可能需要考虑如何使用TVMLKit工具包。Apple已经为我们开发者完成了一些主要的工作,比如提供了许多可重用的tvOS界面展示模板,这些模板大都与iOS应用的界面神似,所以用户们并不会感到陌生,这些模板大概有18种之多。大多数模板都可以让你创建出脱凡的、非常适合家中电视展示的界面。大家可以访问Apple的文档查看这些我们强烈推荐使用的模板。

tvOS-3

我也推荐大家在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会自动根据当前聚焦的视图找到与之相邻的左边的视图,并将其选中和聚焦。

tvOS-4

作为一个开发者,你必须要学习与Focus Engine相关的API,比如当聚焦的视图发生变化时如何获取通知、如何通过编码触发聚焦视图的改变扥等。更多关于Focus Engine的API可以参阅App Programming Guide for tvOS文档中的 Supporting Focus Within Your App 章节。

TVServices

虽然iOS开发者在tvOS应用的开发过程中,主要使用的是一些已经比较熟悉的iOS框架,但是也有一些tvOS特有的框架需要开发者们去了解掌握,比如像新加入的TVServices框架。

TVServices的主要作用是描述你的应用的内容,以便tvOS在首页的顶部栏位显示。在首页顶部栏位显示的应用都是用户自己设置的,用户可以将他们认为最为常用的或最为重要的应用放在首页顶部栏位,便于快速打开或浏览其中主要信息。

tvOS-5

你们的应用可以在用户不进入应用的情况下,向用户提供简短的、感兴趣的信息,这就会使你的应用有了额外价值,使用TVServices无疑是提高你的应用下载量的绝佳手段。比如一个游戏应用,通过TVServices显示游戏存档,那么用户就可以直接从首页通过游戏存档进入游戏。如果是一个社交应用,那么就可以在首页显示社交动态信息,如果是一个照片分享应用,那么就可以显示近期朋友和家人分享的照片。

更多关于TVServices的信息可以查阅TVServices Framework Reference文档。使用好它对你的应用非常有益。

Parallax Images

还有一件会让你疑惑的可能就是在发布会的Keynote中,Apple着重强调了图片和应用图标的视差效果。这是一个非常棒的视图效果,但是为什么这个特性会被放在Keynote中提及,它为什么这么重要呢?

如果你使用了tvOS模拟器,你就会明白为什么这个特性如此重要。当移动聚焦视图时,你需要向左或向右滑动,但如果你只滑动了一点,Apple会对当前聚焦的视图做一个轻微的旋转处理,目的是让用户知道现在正在作以操作(但是还需要继续滑动来改变聚焦视图)。这是一个着眼于细节但又非常有用的特性。

tvOS-6

Apple把视差效果看做tvOS设计中的一个关键组成部分,并强烈建议应用图标和电影海报使用该特性。不过感谢Apple在App Programming Guide for tvOS文档中提供了Creating Parallax Artwork章节,帮助我们创建视差特性的图片资源,以及为我们提供了视察图片资源的预览应用。

tvOS-7

Controllers

每一个购买了新Apple TV的用户,都会收到一个功能强大的新版遥控器。上一代只能上下左右简单选择方位以及只有几个简单导航按键的遥控器,而新一代的Apple TV遥控器增加了更多令人激动的新特性:

  • 玻璃触控板:位于遥控器的顶部,可以让用户在其上面进行一些手势操作,比如滑动、轻拍、点击。
  • 麦克风:可以让用户通过遥控器访问Siri(Siri有使用国家的限制)以及可以通过语音控制电视的音量。
  • 陀螺仪:结合动作传感器可以为用户提供非常棒的游戏体验。用户可以通过倾斜遥控器在游戏中控制方向盘开车,或者控制英雄奔跑穿越山洞。

tvOS-8

你可以使用你知道的处理手势操作的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-9

一定要牢记这点,它对于你设计tvOS应用的结构时很关键。这里列出了一些规则:

  • 如果你需要存储的数据量小于1MB,iCloud的key-value存储方式是一个可以选择的方案。但是要切记,iCloud KVS严格限制了只能有所属者才可以访问数据,并且不能共享给其他用户。
  • 如果你需要分享事件或者数据给其他用户,CloudKit是一个不错的选择方案。
  • 如果你开发的是一个跨平台的应用或者有特殊的需求,你就得使用你自己的备份服务了。

Limitation: App Size

另一个限制是关于应用大小的限制,规定不能超过200MB。

tvOS-10-FlipTable

在你们掀桌之前,请回顾一下WWDC2015以及介绍过的“On-Demand Resources”相关API。这几乎像是Apple为tvOS提前铺垫的。

这些API通过按需下载资源文件减小应用初始安装时的大小。开发者可以在Xcode中给多媒体资源文件用标签进行标记,将应用提交后,App Store会自动根据标记将多媒体资源文件拆分为一个一个下载包。当用户在使用应用时如果需要用到某类标记的资源文件,就可以请求下载该标记的资源文件。当然你得有预期的判断,要先于用户使用资源前开始下载他们需要的资源,这样对于用户来说他们根本不会感受到因为下载资源带来的不好的用户体验。

举一个简单的例子,比如你有一款游戏应用有10个关卡。在用户安装该游戏时可以只包含两个关卡的多媒体资源文件。一旦用户完成了第一个关卡,你应该发送一个下载请求,下载第三个关卡的多媒体资源文件。当用户完成了第二个关卡时,第三个关卡需要的资源文件早已下载好准备妥当。在用户的整个游戏过程中,你就可以运用该机制一步一步去下载所需的资源文件。

虽然这种机制对于开发者来说无疑增加了工作量,但是这对用户来说是一件非常愉悦的事情。你试想一下,用户是愿意等待下载一个1GB大小的游戏呢,还是更愿意下载一个100MB大小的游戏并立即开始游戏呢。不过该机制也存在一个隐患,如果用户的网络条件很差,他们一般都更愿意在晚上挂着下载。那么如果用户在白天玩你的游戏,然后同时用龟速的网络下载后面关卡的资源文件,这简直是令人发指的用户体验。不幸的是作为tvOS开发者,在这种情形下目前也无能为力。

原文地址:tvOS SDK: An iOS Developer’s Initial Impressions

« Go 编译跨平台 ConurrentHashMap和Hashtable的区别 »