[原]Apple WatchKit 基础篇
当平台的制约成为限制开发者的角色的时候,WatchKit 倾听了最为早期的 iOS 开发。相比 OS X & AppKit 之前参差不齐的十年,iPhoneOS& UIKit 像一阵清风。Apps 也是小巧的、简单的、短小的。
在经历了7年时间和许多重大版本的发布,从 iPhones 和 iPads 的全部尺寸和形状到TV 和 CarPlay ,iOS 已经成长到包含无数设备型号和配置了。这仍然是一个令开发者惊异的体验(大部分是这样的),但是感觉魔力也失去了前进的方向。
不管你从哪里来,WatchKit 的简单将会令人愉悦和庆幸。
ᴡᴀᴛᴄʜ 令每个人们兴奋。对于开发者来说更甚。
Ÿ1、入门学习最好的方法是什么?只有 Apple‘sWatchKit developer resources 。
Ÿ2、阅读 HumanInterface Guidelines —考虑到它是你设计你程序的先决条件。
Ÿ3、精读介绍此框架方方面面的 WatchKit Programming Guide 和 WKInterfaceCatalog 。
Ÿ4、当你最后准备给你的 app增加对手表的拓展,查阅下 ListerSample App (使用 Objective-C & Swift !),看是如何在一起适配的。
Ÿ5、 WatchKit
Ÿ6、 WatchKit Tutorialwith Swift: Getting Started
Apple Watch规格:
Ÿ1、Apple Watch 共有不锈钢外壳的三种版本:原装版(Apple Watch)、铝金属外壳的运动版(Apple Watch Sport)、18K 金制的典藏版(Apple Watch Edtion),分别对应三种萤幕:Retina 萤幕、强化玻璃、蓝宝石玻璃,每种版本皆有1.5 吋与1.65 吋两种尺寸,消费者可依照自己的手腕粗细自由选择;
2、Apple Watch 推出的六款表带:磁嵌式表带、磁吸式表带、皮革表带、皮扣型表带、不锈钢表带、网状表带等多种材质和颜色搭配,对照以往单纯的产品选择方式,Apple Watch 可以说是苹果产品的一大变革。
Ÿ3、Apple Watch 有不同的屏幕分辨率。小尺寸38毫米 Apple Watch 的屏幕分辨率为272 x 340,而大尺寸的42毫米
ŸApple Watch 屏幕分辨率为 312 x 390。在 WatchKit 文档中,苹果提到 Apple Watch 屏幕是 Retina级别,并建议开发者使用 2x 图像元素。
Ÿ4、内置LED、红外线、心律感应器、 加速器
WatchKit apps
WatchKit提供了三种形式,扩展你的iPhoneapp:WatchKit App,Glances,Notifications。
Watchapp 安装原理
首先说明有关Apple Watch的三个重要组件:
组件名 |
功能 |
iPhone 主App |
所有的运算、逻辑以及控制实际上都是在 iPhone 中完成的 |
Watch App |
负责界面部分的 WatchKit App 将会在主程序安装后由 iPhone 检测有没有配对的 Apple Watch,并提示安装到 Apple Watch 中 |
WatchKit Extension |
负责逻辑部分,负责iPhone 主App 和Watch App通信 |
重点:在安装应用时,负责逻辑部分的WatchKitExtension将随iOS主app的主被一同安装到iPhone中,而负责界面部分的WatchKitApp将会在主程序安装后由iPhone检测有没有配对的AppleWatch,并提示安装到AppleWatch中。
Watch App 刚工作原理watch app 刷新界面
watch app 事件处理
WatchApp 和iOSApp共享数据必须启用AppGroup的特性,这个部分在Extension和iOSApp之间的数据共享时已经引入了。
基础控件比较
WatchKit |
UIKit |
具体说明 |
WKInterfaceController |
UIViewController |
初始化: -initWithContext: 将要呈现: -willActivate 呈现结束后: –didDeactivate 上面的方法代替了下面的方法: -viewDidLoad: -viewWillAppear: -viewDidDisappear:。 |
WKInterfaceObject |
UIView |
注意:WatchKit 的实际的 View 的一个在 Watch Extension 端的代理,而非 View 本身 包含下面控件:WKInterfaceButton,WKInterfaceLabel 或 WKInterfaceImage等 Apple Watch view 想要将用户交互事件传递给 iPhone 也需要通过 WKInterfaceObject 代理进行。每个可交互的 WKInterfaceObject 子类都对应了一个 action,比如 button 对应点击事件。 |
|
||
WKUserNotificationInterfaceController |
UIApplicationDelegate + UIAlertController |
|
WKInterfaceGroup |
UIScrollView |
|
WKInterfaceImage |
UIImageView |
尽量使用它的 -setImageNamed: 方法。 |
WKInterfaceDevice |
UIDevice |
|
WKInterfaceMap |
MKMapView |
|
WKInterfaceSeparator |
UITableView.separatorColor / .separatorStyle |
|
WKInterfaceMenu (WKInterfaceMenuItem ) |
-addMenuItemWithItemIcon:title:action: -addMenuItemWithImageNamed:title:action: -addMenuItemWithImage:title:action: -clearAllMenuItems |
WKInterfaceButton |
UIButton |
它的可以包含是单一的文本标签或者是一组标签。为了更小, 关闭了控制器的状态集合, 这种方法更加的吸引人—比起输入 UIControlEventTouchUpInside 更加优秀。 |
WKInterfaceTable |
UITableView |
WatchKit 列表没有 sections、headers、footers、editing、或 data sources, 或 delegates。 WKInterfaceController可以对列表的交互进行反馈,通过 table:didSelectrowAtIndex: 的代理方法,或者是用之前提供的对象-动作的方法。 |
|
||
WKInterfaceLabel |
UILabel |
WKInterface 可能是从iOS中变化最小的。支持 NSAttributedString ,自定义字体以及字体的尺寸, |
WKInterfaceDate |
UILabel + NSDateFormatter |
(新)WKInterfaceDate 是一个特殊的标签,它用来展示目前的日期或是时间。 |
WKInterfaceTimer |
UILabel + NSDateFormatter + NSTimer |
(新)WKInterfaceTimer 相似,除了它可以到指定日期并且倒计时。 |
WKInterfaceSlider |
UIStepper + UISlider |
没有了触摸手势,交互回归到基础。Tap,Tap,On / Off,Tap,Tap,+ / -,易自定义性。 |
WKInterfaceSwitch |
UISwitch |
没有了触摸手势,交互回归到基础。Tap,Tap,On / Off,Tap,Tap,+ / -,易自定义性。 |
ViewController 导航处理对比
WKInterfaceController |
UIViewController |
具体说明 |
-pushControllerWithName:context: |
- pushViewController:viewController animated: |
使用目标 controller 的 Identifier 字符串 (没有你只能在 StoryBoard 里进行设置) 进行创建。。 |
-popController |
-(UIViewController *)popViewControllerAnimated:(BOOL)animated; |
|
-popToRootController |
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated; |
|
-presentControllerWithName:context: |
- presentViewController: viewControllerToPresent animated: completion:(void (^)(void))completion |
|
-dismissController。 |
-dismissModalViewControllerAnimated: |
动画
因为无法拿到实际的视图元素,只有 WKInterfaceObject 这样的代理对象,以及布局系统的限制,所以复杂的动画,尤其是 UIView 系列或者是 CALayer 系列的动画是无法实现的。
现在看来唯一可行的是帧动画,通过为 WKInterfaceImage 设置包含多个 image 的图像,或者是通过计时器定时替换图像的话,可以实现帧动画。虽然 Apple 自己的例子也通过这种方法实现了动画,但是对于设备的存储空间和能耗都可能会是挑战,还需要实际拿到设备以后进行实验和观察。
Glance 和 Notification
Ÿ除了 Watch App 本体以外,Glance 和手表的Notification 也是重要的使用情景。Notification 虽然概念上比较简单,但是相对于 iOS 的通知来说是天差地别。WatchKit 的通知允许开发者自行构建界面,我们可以通过 payload 设置比较复杂和带有更多信息的通知,包括图像,大段文字甚至可以交互的按钮,而不是像 iOS 上那样被限制在文字和一个对话框内。首先无论是通过 Local 还是 Remote 进行的通知发送会先到达 iPhone,然后再由 iPhone 根据内容判断是否转发到手表。WatchKit App 接收到通知后先会显示一个简短的通知,告诉用户这个 app 有一个通知。如果用户对通知的内容感兴趣的话,可以点击或者抬手观看,这样由开发者自定义的长版本的通知就会显现。
ŸGlance 是 WatchKit 的新概念,它允许 Watch App 展示一个布局固定的 WKInterfaceController 页面。它和 Watch App 本体相对地位相当于 iOS上的 Today Widget 和 iOS app 本身的地位,是作为手表上的 app 的最重要的信息展示出现的。Glance 正如其名,是短时存在的提醒,不能存在可交互的元素。不过如果用户点击 Glance 页面的话,是可以启动到 Watch App 的。现在关于 Glance 本身如何启动和呈现还不是很明确,猜测是某种类似 Today Widget 的呈现方式?(比如按下两次表侧面的旋钮)
缺点:
1、没有提供任何获取设备传感信息的 API。不论是心跳、计步或者是用户是否正在佩戴 Watch 的信息我们都是拿不到的,这限制了很多数据收集和监视的健康类 app 的制作。如果希望请求数据,还是不得不转向使用 HealthKit。但是随着 iPhone 6 和 6s 的大屏化,在运动时携带 iPhone 的人可以说是变少了。如果 Watch 不能在没有 iPhone 配对的情况下收集记录,并在之后和 iPhone 连接后将数据回传的话,那 Apple 的健康牌就失败了一大半。相信 Apple 不会放过这种把用户捆绑的机会...不过如果第三方应用能实时获取用户的佩戴状况的话,相信会有很多有意思的应用出现。
2、另外作为在发布会上鼓吹的交互革命的旋钮和触感屏幕,现在看来并没有开放任何 API 供开发者使用,所以我们无法得知用户旋转了手表旋钮这个重要的交互事件。现在看来我们能获取的操作仅只是用户点击屏幕上的按钮或者拖动滑条这个层级,从这个角度来说,现在的 WatchKit 还远没达到可以颠覆移动应用的地步。
建议警告:
Apple 建议最好不要使用那些需要prompt 用户许可的特性,比如 CoreLocation 定位等。因为实际的代码是在手机上运行的,这类许可也会在手机上弹出,但是用户并不一定正是不建议的。
对于要获取这些数据和权限,Apple 建议还是在 iOS app 中完成,并通过 App Groups 进行数据共享,从而在 Watch Extension 中拿到这些数据好在看手机,所以很可能造成体验下降。另外大部分后台运行权限也。