Apple Watch 简介
为什么要做Apple Watch App
基本概念
开始进行开发
- iPhone App、WatchKit Extension和Watch App 三者的关系
- 主要类
- WKInterfaceController
- WKInterfaceObject
- WKInterfaceTable
- Menu
- 用户文本输入
- 与iPhone交互
- 其他
- WatchOS 2.0
- 已有应用分析
- 微信
- 网易新闻
- 家庭用药
- 小结
总结
2014年9月9日,苹果2014年秋季新品发布会在加州库比蒂诺的Flint表演艺术中心举行,会上苹果公司CEO Tim Cook 对外公布了全新的产品:Apple Watch,并于4月24日上市。
Apple Watch采用蓝宝石屏幕,两个屏幕尺寸。支持电话,语音回短信,连接汽车,天气、航班信息,地图导航,播放音乐,测量心跳、计步等几十种功能,是一款全方位的健康和运动追踪设备。
得益于Apple的巨大号召力,Apple Watch是目前看来市场上唯一一款有市场前景和应用前景的智能穿戴设备,人们普遍相信Apple能精益求精,做出出色的产品,Apple也对它寄予厚望:
“No other Apple device has ever been so closely connected to the user.”
现在已有Apple Watch应用适配的App已经有很多,许多常见的App已经对它做了适配,像微信、微博、网易新闻、qq、支付宝等大众应用,早已推出了Watch版。我司的竞品中,也有提供了Watch版的厂商,落后就要挨打,我们在竞争中已经落后了一丢丢,所以有必要对它进行关注,往后推出产品。
除此之外,作为一个iOS开发者,为这样一个新的设备做好适配也是很有必要的。
Apple Watch 是一条全新的产品线,Apple引入了一些全新的概念在手表上,下面简略介绍一下:
Force Touch
用力按压屏幕,这会触发当前屏幕的菜单。
Gestures
分别是点按、横划、竖划、侧滑返回。
Digital Crown
数码表冠可以滚动content,点按可以返回应用列表和表盘界面,长按呼出Siri,这些都是系统管理的, 类似于Home键。
Side Button
可以呼出Friends screen,长按会有关机选项。
Glance
Glance界面可以在表盘页面下边缘滑动弹出,用来显示App的预览信息,可以左右横划,每个页面展示一个App的Glance,对应用来说,它不是必须的。
Notification
分为两种,Short looks 和 Long looks,分别对应刚看到通知的简短信息和停留一会的详细信息。
handoff
Apple Watch helps people quickly access information, but there are times when they may want to dive deeper into content on their iOS devices. Your Apple Watch app uses Handoff to convey information about the wearer’s current activity to their other devices.
iOS8开始Apple推出了一个新的概念App Extension,通过App Extension,开发者可以创建像第三方键盘、TodayWidget的这种扩展。
这是他们之间的关系图:
Apple Watch的开发用的也是这种模式,其中Watch App与WatchKit Extension的通信方式我们不用关注,WatchKit的API就是对这种通信的封装。
在Apple Watch的开发上:
AppleWatch发布的时间并不长,现在WatchKit暴露出来的API不多。下面是一些常见的类。
WKInterfaceController 在 WatchKit 中类似UIKit的 UIViewController,它的生命周期方法比UIViewController少很多:
func awakeWithContext(context: AnyObject?)//类似viewDidLoad
func willActivate() // 类似viewDidAppear
func didDeactivate() // 类似viewDidDispear
WKInterfaceController还可以负责处理通知的action选择事件,table的选择事件等
func handleActionWithIdentifier(identifier: String?, forRemoteNotification remoteNotification: [NSObject : AnyObject])
func handleActionWithIdentifier(identifier: String?, forLocalNotification localNotification: UILocalNotification)
func handleUserActivity(userInfo: [NSObject : AnyObject]?)
func table(table: WKInterfaceTable, didSelectRowAtIndex rowIndex: Int)
除了上面几个它还有API与iPhone App 交互
class func openParentApplication(userInfo: [NSObject : AnyObject], reply: (([NSObject : AnyObject], NSError?) -> Void)?) -> Bool
处理handoff的API,其中updateUserActivity()向iOS App提供handoff信息,可以在iOS应用端处理此信息。
invalidateUserActivity()通知系统handoff信息已经更改。
func updateUserActivity(type: String, userInfo: [NSObject : AnyObject]?, webpageURL: NSURL?)
func invalidateUserActivity()
是UI元素的父类,Button、Label和Image这些类都是它的子类。WKInterfaceObject在功能和用法上有点像UIKit中的UIView,但是它并不是直接显示在Watch上的View,因为代码的逻辑是运行在iOS上的,WKInterfaceObject只是watch app在WatchKit Extension上的代理对象。
在WatchKit 1.0它只有5个API:
func setHidden(hidden: Bool)
func setAlpha(alpha: CGFloat)
func setWidth(width: CGFloat)
func setHeight(height: CGFloat)
var interfaceProperty: String { get }
可见它不支持操作添加删除子元素(只能用storyboard了),不如UIView灵活。
WKInterfaceTable相当于UIKit的UITableView,在WatchOS1.0上,AppleWatch的逻辑代码执行在iPhone上,要以delegate方式交互数据受蓝牙传输的限制,并不现实,要对它进行配置,只能靠初始化时调用代码设置:
// MyRowController.swift
import Foundation
import WatchKit
class MyRowController: NSObject {
@IBOutlet weak var label: WKInterfaceLabel!
}
// InterfaceController.swift
import WatchKit
import Foundation
class InterfaceController: WKInterfaceController {
let tableDataSource :[[String:String]] = [
["title":"title0","description":"description0"],
["title":"title1","description":"description1"],
["title":"title2","description":"description2"],
["title":"title3","description":"description3"],
["title":"title4","description":"description4"],
["title":"title5","description":"description5"],
]
@IBOutlet weak var table: WKInterfaceTable!
override awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context: context)
table.setNumberOfRows(data.count, withRowType: "MyRowController")
for (i, value) in enumerate(tableDataSource) {
if let rowController = table.rowControllerAtIndex(i) as? MyRowController {
rowController.info = value
}
}
}
}
Context Menu是AppleWatch的独有概念,它由ForceTouch呼出,可以在代码里调整它的数量和功能,有点像安卓里的上下文菜单。
func addMenuItemWithImage(image: UIImage, title: String, action: Selector) // all parameters must be non-nil
func addMenuItemWithImageNamed(imageName: String, title: String, action: Selector)
func addMenuItemWithItemIcon(itemIcon: WKMenuItemIcon, title: String, action: Selector)
func clearAllMenuItems()
使用 presentTextInputControllerWithSuggestions 方法实现输入(语音转文本)。
func presentTextInputControllerWithSuggestions(suggestions: [AnyObject]?, allowedInputMode inputMode: WKTextInputMode, completion: ([AnyObject]!) -> Void)
Watch App 从运行机制上更像是 iOS 应用的一个 Widget,本质上跟 iPhone 锁屏界面的“今天”(Today)没有区别,它们的开发思路和运行模式也很接近,Today 和 Watch APP 都属于 iOS 中 Extension 开发。
这就意味着,WatchOS的App跟iOS的App做交互很麻烦,查了一下,开发者可以使用下面几种方式实现:
App的通信需要我们自己开发。有下面几种方式:
Extension和iPhone
The Darwin Notify Center has no notion of per-user sessions, all notifications are system-wide.
WatchKit Extension中向iPhone App发送请求:
class func openParentApplication(userInfo: [NSObject : AnyObject], reply: (([NSObject : AnyObject]!, NSError!) -> Void)?) -> Bool
在iPhone App的AppDelegate中实现如下方法响应Watch App的请求:
- (void)application:(UIApplication * nonnull)application handleWatchKitExtensionRequest:(NSDictionary * nullable)userInfo reply:(void (^ nonnull)(NSDictionary * nullable replyInfo))reply;
此外,我们还可以通过openURL的方式由WatchKit Extension向iOS App发起请求。
WatchKit Extension是运行在手机上的,资源如果展示在手表上要经过蓝牙传输,所以一般需要把资源文件放在Watch App的target里。
因为代码并不直接操控Watch上的View,所以,手表上的touch事件无法捕捉,动画也只有帧动画。
以上只适用于WatchOS 1.0,WatchOS 2.0会有一个巨大的改变:Apple开放了多个硬件的权限,Apple Watch可以连接Wifi,开发者可以调用声音视频,使用它上面的传感器。
With watchOS 2, many apps are native apps, which means they run entirely on your Apple Watch. So they load more quickly and have even greater capabilities.
Apple Watch apps have more possibilities with watchOS 2. Apps can now take advantage of features like the Taptic Engine , Digital Crown, accelerometer, heart rate sensor, speaker, and microphone.
微信可以查看简单的消息和浏览朋友圈,有一个很有趣的功能,它可以在手表上向好友打招呼,好友的iPhone上会有一个定制的通知。
可以看新闻列表和内容,不过实际操作起来并不爽快,不如直接看手机。
定时提醒用药有点抓住了痛点,其他功能并没什么用,只会提示打开iOS App查看文章。
现在的好应用还是太少了,这不得不感谢糟糕的API。
Apple Watch发布的时候说的很好听,但是实际开发中的限制太多,根据我对API的分析,它为开发者开放的东西太少了,动画基本不可用,视频音乐不支持,界面也不怎么灵活,手表当中一些炫酷的功能也没有API,就好像传感器和屏幕仅仅是粘在了一起,目前用处不大。虽然我们有竞品早一步进入了市场,基于Apple的限制,也没法做出很出色的产品,这也是开头我所说的落后一丢丢的由来。Watch OS 2.0的发布将会是一个跨越,它会带来更加灵活强大的功能,开发者在新的平台上能开发出有想象力的应用。
http://www.zhihu.com/question/29446492
https://developer.apple.com/watch/human-interface-guidelines/
http://onevcat.com/2014/11/watch-kit/