WatchKit for watchOS 2 第一印象

WatchKit by tutorials 笔记第二篇其实已经快写完了,苹果也放大招了: WWDC 2015 直接推出了原生的 WatchOS 2,终于可以在 Watch 上运行代码了,之前很多 API 也都 deprecated 掉了,意味着上个月才学过的知识又都过时了(我擦),真是一个日新月异的时代。Ray 家出了篇 WatchKit for watchOS 2: Initial Impressions,这次尝试翻译一下吧。

WatchKit for watchOS 2: Initial Impressions

和 Ray 一样,今年的 WWDC 我也没有参加,但我在线下一直都在饶有兴趣地观看视频,读文档,和基友们讨论。如果你听过我们的 podcast,你就知道我是苹果的狂热粉丝,所以我对这次 WatchOS 2 释出的新东西都很兴奋。

我花了几天去翻阅了 Apple Watch 文档,让我们快速预览一下,我想你会喜欢这些新 feature 的。有什么问题尽管留言,我也好查漏补缺。

Architecture

或许这次 WatchKit 最大的变化就是可以运行原生代码了,不像之前的版本,只有界面元素等资源运行在 watch 上,但真正的代码逻辑还是在你的 iPhone 上执行。而这次发布的 watchOS 2 将所有的一切都放在了 watch 上运行。

Wait, did he just say native?

这将会产生非常积极的效果,首先能够使你的 app 更快启动,其次能够更快地响应用户的交互请求,不用每次再通过 iPhone 上的蓝牙绕一圈回来了。

下面是一些迁移到原生应用 native apps 时需要注意的地方:

  • openParentApplication(_:reply:) 该方法已经从 SDK 中移除了,但是别担心,将会被更加强大的 Watch Connectivity 框架所取代,稍后会介绍。
  • 通过 shared app groups 进行文件共享不在是唯一的选项,同样可以使用 Watch 的 Connectivity framework 来很方便的实现这一功能,但是 Apple 为运行在 watchOS 2 上的原生 App 提供了网络访问能力,也就是说通过 iPhone 下载数据,然后放到 app groups 共享给 watch 这种方式已经过时啦,你可以直接使用 Watch 的 NSURLSession 进行数据下载。
  • iCloud 在 Watch 上不可用

Watch Connectivity

通过 Watch Connectivity 框架你可以在 Watch 和他配对的 iPhone 直接传递数据和文件,如果两端的 app 都运行在前台,那么通讯就建立起来了,如果有一方在后台,那么只有进入前台后才会建立通讯连接。

这个新框架的主角是 WCSession,负责处理两种设备直接的通讯交流,该类提供了一个 defaultSession 单例对象,你不需要自己去创建实例对象。

要启动和运行,你仅需要简单将一个遵守 WCSessionDelegate 协议的对象,分配给 session 的 delegate property,然后调用 activateSession(). 如果你打算频繁使用 Watch Connectivity,那么我建议尽可能在 app 生命周期的早期做这些设置。

一旦你将 session 设置好并激活,你就可以使用下面的方法来传送数据和文件:

  • updateApplicationContext(_:error) 将数据以字典类型传送给相应的 App,这个过程不会立即发生,但是一旦 app 醒来(wakes up)数据就会发送出去。对应的接受一方通过 session 的 delegate 方法 session(_:didReceiveUpdate:) 来接收发送过来的字典数据。
  • sendMessageData(_:replyHandler:errorHandler:) 用来传送数据给对应的 App,这一过程是立即执行的。调用该方法发送的数据将会进入一个队列,并按照进入的先后顺序依次被发送出去。如果是从 watch 给 iOS app 发送数据,当 app 没有被运行时将会从后台被激活。如果顺序反过来,从 iOS app 给 watch 发送数据,此时 watch 没有运行的话,errorHandler 将会被调用。同样接收一方将会调用 session 的 delegate 方法 session(_:didReceiveMessageData:replyHandler:) 来接收数据。
  • transferFile(_:metadata:) 用来传送文件,比如在后台传送图片,和前面的方法一样,在数据传送时,当 iOS app 没有运行则唤醒他,而当 watch app 没有运行则执行 error handler 方法,最后相应的接收方要实现的 delegate 方法是 session(_:didReceiveFile:)

除此之外,Watch Connectivity 框架还提供了很多方法,有兴趣的可以去查阅文档

看到了吗,这就是为什么我告诉你不需要担心失去了 openParentApplication(_:reply:)

Other WatchKit Highlights

上面我们讨论一下这次 WatchKit 最大的两个改变,但是也有其他一些我认为值得讨论的亮点。

Animation

WatchKit 依旧可以通过之前原始的方式实现动画,轮询一系列的提前处理好的图片。但现在 WKInterfaceController 支持通过 API (animateWithDuration(_:animations:)) 生成一些基础动画(类似于 iOS),新的方法带两个参数:durationblock,在给定的时间 duration 内执行 block 中的动画,例如:

animateWithDuration(1) { () -> Void in  
  self.label.setHorizontalAlignment(.Left)
  self.label.setAlpha(0)
}

你可以修改 WKInterfaceObject 的下列属性进行动画

  • alpha
  • width and height
  • vertical and horizontal alignment
  • background color
  • layout group insets

注意:动画还不支持 glances自定义通知

我注意到动画还比较简陋,还不支持时间曲线,和动画完成后做一些操作(completion block)。但是你也会相信,苹果绝对是走在了正确的道路上。

More Access To The Hardware

WatchOS 2 开放了更多硬件传感器的访问,包括 数字表冠 Digital CrownTaptic Engine,心率传感器 heart rate sensor,加速计 accelerometer,麦克风 microphone

这将为你的 App 打开一个新的世界,比如能够让你的健康类应用精确监控心率,或者使用 Taptic Engine 提供更逼真的游戏体验。想想都很激动呢 XD

New Interface Objects

这个版本的 WatchKit 苹果释出了一个全新的 interface 对象:WKInterfacePicker,展示了一个可滚动列表,使用 Digital Crown 来进行交互

在 picker 中的 item 可以是文本、图片或者图文混合。当用户选择一个 item 时,WatchKit 调用 action method 传递当前索引

一个 picker 可以显示三种形式:

  • List:将 items 显示为一个垂直列表
  • Stacked:将 items 作为一堆卡片,用滚动 Digital Crown 的方式一张张显示
  • Image Sequence:从图片队列中抽出一张图片进行展示

此外值得注意的是,单个 interface controller 能够包含多个 pickers

提到 interface controllers,WKInterfaceController 现在提供了---允许你直接展示 alertsaction sheets 的方法

调用 presentAlertControllerWithTitle(_:message:preferredStyle:actions:) 展示一个 alertaction sheet 到当前 interface controller 上,具体的样式取决于你传递的 preferredStyle 参数。action 这个参数是一个包含 WKAlertAction 实例的数组,他自身提供了一个 block,当相应的 button 在被按下时执行。还需要注意的是在这些 block 中,你同样需要 dismiss 这些 alertaction sheet

One More Thing…

在之前的 podcast 中,我和 Jake 讨论了我们希望在 WWDC 上看到宣布什么,其中我们都同意的一件事是 Apple Watch 可以自定义 complications 了,你可以想象一下在时钟界面安装各种 widgets。

没错,现在你可以为 watch app 创建自定义的 complications ,并且将你的数据展示到用户选择的 watch 界面上。

自定义的 complications 是围绕家族的概念构建的,每一个家族都提供了一个或多个模板类,你可以子类化这些模板然后实现自己的 complication。当前有五种家族类型的 complication

  • Modular:存在 small 和 large 两种家族类型的变种,通常在 MODULAR watch face 上看到
  • Circular:只有 small 家族类型,在 SIMPLE watch face 上看到
  • Utilitarian:和 Modular 一样,存在 small 和 large 两种类型的家族变种,通常在 UTILITY watch face 上看到

如果你没有 Apple Watch 或不熟悉 watch faces 可以查看这个 guide 了解详情,文档里也介绍了如何实现自定义的 complications。

自定义 complications 对我来说是这版 WatchKit 的亮点,我都等不及去研究这些 APIs,然后创建我自己的 complications!

Where To Go From Here?

总之,我对 watchOS 2 的这些新功能非常兴奋,在接下来几个月,我会和同事一起完成 WatchKit by Tutorials 的第二版(本人注:好吧,第一本可以不用再看了)

值得注意的是,这仅仅是 watchOS 2 的第一个版本,随后 Apple 可能会增加更多新的特性和 Api,到那时可能这些东西又过时了,或被更好的替代。就像之前发生过的之后也一定会再次发生。


-EOF-

如果感觉此文对你有帮助,请随意打赏支持作者 😘

chengway

认清生活真相之后依然热爱它!

Subscribe to Talk is cheap, Show me the world!

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!