WatchConnectivity是watchOS2里iPhone与AppleWatch通信的基础框架,作为开发AppleWatch应用的必学内容,我在学习后进行了小小的归纳总结。
WatchConnectivity的原理是iPhone伴侣应用和AppleWatch上运行的WatchKit Extension之间通过WCSession会话进行通信。
当前Controller若需要响应WatchConnectivity的消息需要遵循WCSessionDelegate协议。
初始化时需要激活会话代理(iPhone应用和WatchKitExtension里都要激活),代码如下:
if WCSession.isSupported() {
let session=WCSession.defaultSession()
session.delegate=self
session.activateSession()
}
为了了解iPhone应用与Watch应用的会话状态,我们可以通过一些属性去判断,注意这些操作只能在iPhone应用里进行。
AppleWatch是否与iPhone配对,可以通过session.paired属性的布尔值进行判断
即使已配对,watchapp也可能未安装成功,通过session.watchAppInstalled属性的布尔值可以得知此状态。另外,watchapp安装成功就会在手表上建立相应app的目录,因此session.watchAppInstalled==false效果等同于watchDirectoryURL != nil。
watchDirectoryURL一般只在需要额外的初始化处理的情况下,比如app重装恢复队列内容、设定初始设置时等情况下会用到。
若watchapp支持complication表盘组件,那么session.complicationEnabled值为true。
WatchConnectivity框架的通信方式有两种模式,一种是后台传输,另一种是交互式消息。
后台传输模式是最常用的通信模式,面向内容与用户交互,主要用于传输非即时的内容,体现在内容可由操作系统智能传输(操作系统允许发送方可退出,选择传输时机,支持接收者下次启动时发送),并将内容以队列方式发送。
后台传输一般分三种类型:
1. Application context
发送方代码示例
do {
let context=//最新内容,初始化context
try WCSession.defaultSession().updateApplicationContext(context)
}catch {
//
}
接收方需响应以下代理方法,
func session(session:WCSession,didReceiveApplicationContext:applicationContext:[String:AnyObject]){
}
ApplicationContext传输数据常见于传输单个字典类型数据的情况,非常适合仅需要信息子集的AppleWatch应用。
2. Userinfo transfer
Userinfo方式与ApplicationContext相比能够传输更复杂的数据。
发送方示例代码:
let userInfo=//待传输的内容
let userInfoTransfer=WCSession.defaultSession().transferUserInfo(userInfo)
userInfoTransfer传输器封装了待传数据,并且你可以通过代码控制来取消传输。
未传输的内容可以这样获取
let transfer=WCSession.defaultSession().outstandingUserInfoTransfer(userInfo)
接收方通过以下回调方法进行处理:
func session(session:WCSession,didReceiveUserInfo userInfo:[String:AnyObject]) {
//处理接收的userInfo
}
Userinfo transfer适合内存内容的传输,并且支持访问队列里的未传输内容。
3. File transfer
File transfer面向文件,API使用上和Userinfo transfer很像,支持队列,支持未完成内容的访问,需要附加元数据信息。
发送方示例代码如下:
let url=//文件地址
let metadata=//字典形式元数据
let fileTransfer=WCSession.defaultSession().transferFile(url,metadata:metadata)
接收方代码如下:
func session(session:WCSession,didReceiveFile file:WCSessionFile) {
//处理接收的File
}
交互式消息能够为iPhone和AppleWatch间提供实时的通讯功能。
使用前提:1.设备间能够无线联通;2.应用之间能够联通,这意味着AppleWatch端的程序必须前台运行,即session的reachable值为true。
与后台传输模式的一个值得注意的区别是:若iOS应用未启动,AppleWatch上运行的WatchKit扩展能够启动iOS应用!
交互式消息方式可以传输两种数据类型的消息:
1.字典
func sendMessage(message:,replyHandler:,errorHandler:)
2.数据
支持可序列化的自定义数据
func sendMessageData(data:,replyHandler:,errorHandler:)
值得注意的是,replyHandler是optional可选类型,但目前版本里(Xcode7beta2)若使用nil作为参数,系统将无法确认而认为发送消息失败。
在以下方法里进行接收时的回调处理
func session(session:WCSession,didReceiveMessage message:[String:AnyObject],replyHandler:([String:AnyObject]) -> Void){
//消息处理并返回
}