WatchOS App架构与更新 (WatchOS 2)
前言
WatchOS2出现后,改变了很多东西:
- 其中最大的改变也是最充满想象力的改变是将WatchKit Extension直接从iPhone移植到了AppleWatch上,所以这就给了AppleWatch原生App开发的基础。
- 同时iOS APP与Watch App沟通也有一个Aplle推出的WatchConnectivityframework,其中提供了一个类WCSession作为两者沟通桥梁,既可以传输String,Dictionary,Array等,还可以共享文件。
- 而且WatchOS2提供了NSUrlSession拉取网络数据,这表示WatchAPP可以独立访问网络,加之其可以连接WIFI的硬件,其实Watch对iPhone的依赖性减弱了很多
- WatchOS2中不能使用iCloud,只能发还数据给iPhone,iOS再使用iCloud
WatchOS 2的架构
从上面的图中,可以很明显地看出,苹果把原来运行在 iPhone 手机上的 WatchKit Extension 移到 Apple Watch 中了。这将直接带来如下改变:原来只存放一些资源和 Storyboard 的 Watch App,现在程序的业务逻辑部分(也就是代码执行部分)也被放到 Watch App 中。这样的话,程序给用户的体验会更好,Watch App 的运行可以完全独立于 iPhone 了。值得注意的是,Apple Watch 2 中还支持 WiFi,所以 Apple Watch 可以通过 WiFi,直接获取一些网络数据等。并且 Apple Watch 无法处理的一些业务,可以通过 Connectivity 框架,请求 iPhone 进行处理,并将结果返回给 Apple Watch。
WatchOS 2的生命周期
用户对AppleWatch的操作控制了你的App的启动和生命周期。用户可以通过Home界面,Glance界面和表盘的Complication与通知Notification启动你的APP。每一个这样的操作都会启动你的WatchApp 和WatchAKit Extension。自此开始WatchAPP和WatchKit Extension开始传递信息和工作,直到用户停止与你WatchAPP的交互,这时候iOS会挂起WatchKit Extension。
下图是WatchApp Launching的过程
以及一个InterfaceController的生命周期
在ExtensionDelegate中会有WatchAPP的状态监听
WatchAPP的状态变化如下图
Watch Connectivity
你可以通过WatchConnectivityframework
来实现watch与配对iPhone上的文件和数据的来回传输。如果这两个apps是在前台上运行,则通信是实时的,否则通信会被转移到后台,直至接收数据的一方启动进入前台的时候才转移回来。
在这个新框架的主要成员是WCSession
,它负责处理了两个设备之间的所有通信。你不需要自己去创建这个类的实例对象,只需要使用defaultSession
单例对象就可以了。
要启动和运行WCSession,你需要指定一个对象去遵从WCSessionDelegate
,分配给WCSession的委托属性并调用activateSession()
。如果你打算频繁的使用WatchConnectivity的话,我强烈建议你尽可能在apps的早期生命周期完成这个设置。
这里贴出WCSession的一些代码和解释:(只支持iOS9及更新版本,在ContainerApp和Extension中使用一致)
@interface WCSession : NSObject
硬件是否支持:+ (BOOL)isSupported;
单例对象:+ (WCSession *)defaultSession;
拥有的Delegate:@property (nonatomic, weak, nullable) id <WCSessionDelegate> delegate;
(在这里需要)
delegate中使用较多的有:(接收信息后的一些处理)
- (void)session:(WCSession * ) session didReceiveMessage:(NSDictionary<NSString * , id> *)message;
- (void)session:(WCSession * )session didReceiveMessage:(NSDictionary<NSString * , id> * )message replyHandler:(void(^)(NSDictionary<NSString * , id> *replyMessage))replyHandler;
激活对象:- (void)activateSession;
(在APP生命周期中激活越早越好)
发送信息:
- (void)sendMessage:(NSDictionary<NSString *, id> *)message replyHandler:(nullable void (^)(NSDictionary<NSString *, id> *replyMessage))replyHandler errorHandler:(nullable void (^)(NSError *error))errorHandler;
- (void)sendMessageData:(NSData *)data replyHandler:(nullable void (^)(NSData *replyMessageData))replyHandler errorHandler:(nullable void (^)(NSError *error))errorHandler;
一般的使用过程:
if ([WCSession isSupported]) { WCSession *session = [WCSession defaultSession]; session.delegate = self; [session activateSession]; } //接下来开始send或者receive
动画(Animation)
WatchKit还可以用之前那样原始方式通过轮询处理好的图片组去运行动画,不过WKInterfaceController现在通过animateWithDuration(_:animations:)提供了更接近于iOS的基础动画。只需要持续时间和block,就可以在设定的持续时间里执行block里面的动画。例如:
animateWithDuration(1){()->Voidin
self.label.setHorizontalAlignment(.Left)
self.label.setAlpha(0)
}
你可以通过更改以下WKInterfaceObject属性来设置动画:
- 透明度
- 宽高
- 垂直和水平位置
- 背景颜色
- 布局组中的插入
访问更多硬件(MoreAccessToTheHardWare)
watchOS2提供了很多硬件设备和传感器,包括电子表冠DigitalCrown,振动引擎TapticEngine,心率传感器heartratesensor,加速计accelerometer以及麦克风microphone等。
新接口对象(NewInterfaceObjects)
苹果在这个版本的WatchKit里推出了一个全新的接口对象:WKInterfacePicker,它是个通过电子表冠来进行交互的滚动列表。在WKInterfacePicker中的物品(item)可以是文本、图像、或是图文混合。当用户选择了里面的物品,WatchKit调用WKInterfacePicker中的方法来传递选择了的索引。
WKInterfacePicker可以通过三种不同风格来展示:
- List:把物品垂直排列显示的列表。
- Stacked:将要展示的物品转为一叠卡片通过滚动电子表冠来一张张显示。
- ImageSequence:从图像序列中抽出单个图像展示。
说到接口控制器,WKInterfaceController现在提供了让你直接弹出alerts和actionsheets的方法。
调用presentAlertControllerWithTitle(_:message:preferredStyle:actions:)在当前的接口控制器弹出一个alert或是actionsheet。根据你设定的preferredStyle参数来显示出不同的样式。其中的actions参数是包含WKAlertAction实例的数组,通过用户点击相应的button来执行它自身提供的block。
自定义Widgets
自定义数字附件是围绕家族概念构建的,每个家族提供一个或多个模板,你可以把你的数字附件子类化后,再通过这些模板实现。
有五种直接实现的数字附件:
- Modular:这家族有small,large两个分类,并且他们都能通过模块watch界面上看到。
- Circular:只有small分类,在简约watch界面上看到。
-
Utilitarian:和Modular一样有small,large两款在实用watch界面上看到.
如果你没有AppleWatch或是对watch界面类型不熟悉可以看指南了解,里面也提到过怎么实现Custom Complications(自定义数字附件)。也可以从watchOS 2 Transition Guide的Providing Custom Complications部分查看更多关于编译Custom Complications的细节。
网友评论