`
啸笑天
  • 浏览: 3436480 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

WatchConnectivity

 
阅读更多

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

 

 

 

分享到:
评论
1 楼 啸笑天 2015-10-13  
http://code.tutsplus.com/tutorials/watchos-2-background-transfers-and-queues--cms-24699

相关推荐

Global site tag (gtag.js) - Google Analytics