iPhone与iWatch连接、控制、数据传递(Swift)
最近在做一个项目,涉及到iPhone设备和手表传输数据、控制彼此界面跳转,在网上找了很多资料,发现国内的网站这方面介绍的不多,而国外的网站写的也不是很全,所以在这写这篇博客,给大家参考一下,望大神指点一二。
iPhone和iWatch配对这个不需要多说,百度搜索答案一大堆,这个是前提。
iPhone与iWatch交互的代码有两种情况,取决于iWatch的系统。iWatch OS1与OS2、3的方法不同,在OS1的系统中,iWatch发送数据的代码如下
let userInfo:[String:String] = ["key":"value"]
WKInterfaceController.openParentApplication(userInfo) { (replyInfo, error) -> Void in
}
这个函数是发送消息,同时也是接收消息,接收到iPhone的回复是replyInfo。在iPhone端的AppDelegate中,接收消息的代码:
func application(application: UIApplication, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)!) {
}
接收到的消息是userInfo,回复给iWatch的数据是reply。
以上的代码仅适用于watchOS1,之后的系统就没有这个API了,对于OS2或OS3,使用的框架是WatchConnectivity,在这里,我将直接提供我写的类,并给出介绍和使用方法,大家可以直接复制代码,在我注释的地方写自己的功能便可。
以下是iPhone端的代码:
import UIKit
import WatchConnectivity class IwatchSessionUtil: NSObject, WCSessionDelegate {
//静态单例
static let shareManager = IwatchSessionUtil() //初始化
private override init()
{
super.init()
} // 连接机制
private let session:WCSession? = WCSession.isSupported() ? WCSession.default() : nil // 激活会话对象
func startSession(){
session?.delegate = self
session?.activate()
} // 检测到watch端app
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
print("AppleWatch匹配完成")
} // 通信完成会话对象开始闲置
func sessionDidBecomeInactive(_ session: WCSession) {
} // 通信完成会话对象释放
func sessionDidDeactivate(_ session: WCSession) {
} // watch侧发送数据过来,iPhone接收到数据并回复数据过去
// message: watch侧发送过来的信息
// replyHandler: iPhone回复过去的信息
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
// 在这里,我们接收到watch发送过来的数据,可以用代理、代码块或者通知中心传值到ViewController,做出一系列操作。
// 注!!:watch侧发送过来信息,iPhone回复直接在这个函数里回复replyHandler([String : Any])(replyHandler(数据)),这样watch侧发送数据的函数对应的reply才能接收到数据,别跟sendMessage这个函数混淆了。如果用sendMessage回复,那watch侧接收到信息就是didReceiveMessage的函数。
} // iPhone向watch发送数据
// key: 数据的key值
// value: 数据内容
func sendMessageToWatch(key:String,value:Any) {
session?.sendMessage([key : value], replyHandler: { (dict:Dictionary) in
// 这里是发送数据后的操作,比如写个alert提示发送成功
// replyHandler是watch侧didReceiveMessage函数接收到信息后reply回复过来的内容,这里可以编辑自己需要的功能
}, errorHandler: { (Error) in
// 发送失败,一般是蓝牙没开,或手机开了飞行模式
})
}
}
调用方法:1、首先在iPhone的AppDelegate的didFinishLaunchingWithOptions函数中添加代码IwatchSessionUtil.shareManager.startSession(),确保WCSession能匹配到watch侧的App
2、发送消息:调用方法IwatchSessionUtil.shareManager.sendMessageToWatch(key: , value: )即可,发送后接收到watch侧的回复后的操作,直接在类sendMessage函数中编辑就行
3、watch侧sendMessage发送信息给iPhone,iPhone侧didReceiveMessage接收到信息,一系列操作上面已经注释写到。
iPhone端的介绍完毕,下面写watch端的代码,其实跟iPhone的没什么区别,这里只是为了把这部分内容写完全。
import WatchKit
import WatchConnectivity class WatchSessionUtil: NSObject,WCSessionDelegate {
// 静态单例
static let sharedManager = WatchSessionUtil() // 初始化
private override init()
{
super.init()
} // 连接机制
private let session:WCSession? = WCSession.isSupported() ? WCSession.default() : nil // 激活机制
func startSession(){
session?.delegate=self
session?.activate()
} // 检测到iPhone的父应用
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
}
// 通信完成会话对象开始闲置
func sessionDidBecomeInactive(_ session: WCSession) {
} // 通信完成会话对象释放
func sessionDidDeactivate(_ session: WCSession) {
}
// 接收到iPhone端发送过来的信息
// message: iPhone端发送过来的信息
// replyHandler: watch端回复给iPhone的内容
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
// 这里也可以通过通知中心发送通知给InterfaceController,进行页面操作,至于用什么方法大家随意。注意事项iPhone的代码里提到了,一样的性质,这里就不写了。
} // 向iPhone侧发送信息
func sendMessage(key:String, value:Any){
session?.sendMessage([key : value], replyHandler: { (reply: [String : Any]) in
// 信息发送之后,收到iPhone端回复的操作
}, errorHandler: { (Error) in
// 发送失败
})
}
}
watch的类添加在Extension的文件夹中,调用方法:
1、ExtensionDelegate文件的applicationDidFinishLaunching函数里写上WatchSessionUtil.sharedManager.startSession()
2、发送消息:调用方法IwatchSessionUtil.shareManager.sendMessageToWatch(key: , value: )即可,发送后接收到iPhone侧的回复后的操作,直接在类sendMessage函数中编辑就行
3、iPhone侧sendMessage发送信息给watch,watch侧didReceiveMessage接收到信息,一系列操作上面已经注释写到。
内容就这么多,已经很全了,这里给出的是Swift代码,OC的代码我给个网址大家参照一下:http://blog.csdn.net/shenjie12345678/article/details/61913968
iPhone与iWatch连接、控制、数据传递(Swift)的更多相关文章
- [Swift实际操作]八、实用进阶-(8)使用performSegue在故事板页面之间进行数据传递
本文将演示故事板页面之间的数据传递.首先在一个空白项目中,打开项目自带的故事板文件(Main.storyboard).故事板中已经拥有了一个视图控制器,点击选择该视图控制器.然后依此点击[Editor ...
- JSP Servlet SQL 三者之间数据传递
前言: 最近一直在做WEB开发,现总结一下这一段时间的体会和感触. 切记,web开发重点在于前台数据交互,页面美化而不要太沉溺于底层数据. 浏览器时代来到,向我们召唤出更炫.更简洁.更方便.更大气的网 ...
- Dubbo协议与连接控制
协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告 (+) dubbo:// (+) (#) Dubbo缺省协议采用单一长连接和NIO异步通讯,适 ...
- 3.2 PCI设备的数据传递
PCI设备的数据传递使用地址译码方式,当一个存储器读写总线事务到达PCI总线时,在这条总线上的所有PCI设备将进行地址译码,如果当前总线事务使用的地址在某个PCI设备的BAR空间中时,该PCI设备将使 ...
- (Android数据传递)Intent消息传递机制 “Intent”“数据传递”
Intent类的继承关系: 需要注意的是,该类实现了Parcelable(用于数据传递)和Cloneable接口. Intent是一种(系统级别的)消息传递机制,可以在应用程序内使用,也可以在应用 ...
- JSP、servlet、SQL三者之间的数据传递
JSP.servlet.SQL三者之间的数据传递 博客分类: web开发 JSPservletSQL数据库连接池web开发 前言: 最近一直在做WEB开发,现总结一下这一段时间的体会和感触. 切记, ...
- 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递
通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...
- MVC数据传递
一.数据传递 1.ViewData[]: 用法:action中:ViewData["key"]="aaa";,V层接收ViewData["key&qu ...
- MVC数据传递和多表单
1.数据传递(1)session和TempData 全局变量,可以将值从一个动作传递到另一个动作,也可以从控制层传递到视图层. TempData取一遍值后自动销毁. session使用: //控制器中 ...
随机推荐
- 用phpcms如何将静态页面制作成企业网站,头部加尾部
首先,先要准备好这个静态网页的源文件,如图 bs里面是一些css和js的文件,img则是放图片的,文件中的index是网页的首页 运行一下,看看 是这样的 然后打开phpcms文件,上篇博客中有提到, ...
- EM and GMM(Code)
In EM and GMM(Theory), I have introduced the theory of em algorithm for gmm. Now lets practice it in ...
- HashSet、LinkedHashSet、TreeSet使用区别
HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放: LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代: Tree ...
- asp.net core mvc剖析:mvc执行过程(一)
前面介绍了路由的过程,我们再来看下MvcRouteHandler的代码: public Task RouteAsync(RouteContext context) { ...... //根据路由信息查 ...
- 利用hexo+github+nodejs搭建自我博客的一天
放一张比较喜欢的背景图镇楼,伪文艺一波.因为刚刚抱着四个快递从公司大门走到宿舍,快递都比我高,坐电梯的时候电梯里面的灯一闪一闪,电梯还摇晃,上演了一波鬼吹灯,惊魂未定... 说正题:我喜欢的博客应该是 ...
- Zigbee折腾之旅:(一)CC2530最小系统
最近在倒腾Zigbee,准备参加物联网全国大赛,学校有给我们发Zigbee开发板,但是对于喜欢折腾的我来说,用开发板还是不过瘾,起码也得知道怎么去画一块板子.于是乎,在百度一番后就有了下面这篇文章. ...
- 深入探讨 CSS 特性检测 @supports 与 Modernizr
什么是 CSS 特性检测?我们知道,前端技术日新月异的今天,各种新技术新属性层出不穷.在 CSS 层面亦不例外. 一些新属性能极大提升用户体验以及减少工程师的工作量,并且在当下的前端氛围下: 很多实验 ...
- .net 爬虫技术
关于爬虫 从搜索引擎开始,爬虫应该就出现了,爬的对象当然也就是网页URL,在很长一段时间内,爬虫所做的事情就是分析URL.下载WebServer返回的HTML.分析HTML内容.构建HTTP请求的模拟 ...
- 第三方库AFNetworking 3.1.0的简单使用
AFNetworking是一个 在iOS开发中 使用非常多网络开源库.它是一个轻量级的网络请求API类库. 适用于iOS以及Mac OS X.它构建于在(Apple iOS开发文档) NSURLCon ...
- Android性能测试工具Emmagee
下面介绍一个简单实用的Android性能软件 ~~欢迎加入测试群574875837一起讨论研究 一.Emmagee 简介 Emmagee主要用于监控单个App的CPU,内存,流量,启动耗时,电量,电流 ...