WatchConnectivity是watchOS2里iPhone与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应用里进行。
1.检查是否配对
AppleWatch是否与iPhone配对,可以通过session.paired属性的布尔值进行判断
2.检查watchapp是否已安装
即使已配对,watchapp也可能未安装成功,通过session.watchAppInstalled属性的布尔值可以得知此状态。另外,watchapp安装成功就会在手表上建立相应app的目录,因此session.watchAppInstalled==false效果等同于watchDirectoryURL != nil。
watchDirectoryURL一般只在需要额外的初始化处理的情况下,比如app重装恢复队列内容、设定初始设置时等情况下会用到。
3.检查是否开启表盘组件功能
若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应用。这过程不会即刻发送,但会在对应的app唤醒的时候发送。
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:)
用于数据即时传输到对应app的方法。调用这个方法发送的数据会进入一个队列,按照进入队列的先后顺序来发送出去。如果是从watch向iOSapp发送数据并且该iOSapp没在运行的话,那么接收数据的iOSapp将会在后台被唤醒。如果你从iOSapp发送数据而watchapp没有运行的情况下,errorHandler就会被调用。接收数据的app会通过WCSession的委托方法session(_:didReceiveMessageData:replyHandler:)方法来接收。
在以下方法里进行接收时的回调处理
func session(session:WCSession,didReceiveMessage message:[String:AnyObject],replyHandler:([String:AnyObject]) -> Void){//消息处理并返回}
感谢:http://www.th7.cn/Program/IOS/201507/500660.shtml
https://github.com/kristinathai/WatchOS2WatchConnectivityDemos