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
相关推荐
使用WatchConnectivity抽象的WWDC 2015上最令人期待的公告之一就是公开了一个SDK,以使第三方开发人员有机会在新发布的Apple Watch上放置真实的软件。 在WWDC 2015之前,开发人员可以在手表上放置UI,而应用程序的...
这是一个NativeScript插件,使用Apple WatchConnectivity将数据传递和接收数据到配套的WatchOS应用程序。 先决条件/要求 在使用此插件之前,请确保您已关注NativeScript博客文章,该文章和 。 安装NativeScript 7 ...
Communicating with WatchConnectivity Chapter 9. Creating Complications with ClockKit Chapter 10. Extending Complications with Time Travel Chapter 11. Getting Personal with Sensor Data and HealthKit ...
沟通者 ComplicationInfo 例子要求安装SPM 椰子足作者执照 介绍由于Apple在WatchConnectivity上的工作,因此可以在watchOS和iOS应用程序之间发送消息和数据,但是有很多委托回调可以使用,一些API调用非常相似,并且...
A demo app showing the usage of WatchConnectivity framework. Requirements GentleTouch requires an iPhone with iOS 9, and a WATCH with watchOS 2. Getting Started Clone this repo in your local ...
#WappyBird# 使用Apple Watch飞翔飞扬的... 显示如何在WatchConnectivity框架中使用sendMessage。 使Apple Watch成为游戏控制器 ## License ##此代码是根据MIT许可证的条款和条件分发的。 ##谢谢##真棒小鸟克隆