最近在做一个项目,涉及到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)的更多相关文章

  1. [Swift实际操作]八、实用进阶-(8)使用performSegue在故事板页面之间进行数据传递

    本文将演示故事板页面之间的数据传递.首先在一个空白项目中,打开项目自带的故事板文件(Main.storyboard).故事板中已经拥有了一个视图控制器,点击选择该视图控制器.然后依此点击[Editor ...

  2. JSP Servlet SQL 三者之间数据传递

    前言: 最近一直在做WEB开发,现总结一下这一段时间的体会和感触. 切记,web开发重点在于前台数据交互,页面美化而不要太沉溺于底层数据. 浏览器时代来到,向我们召唤出更炫.更简洁.更方便.更大气的网 ...

  3. Dubbo协议与连接控制

    协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告 (+) dubbo:// (+) (#) Dubbo缺省协议采用单一长连接和NIO异步通讯,适 ...

  4. 3.2 PCI设备的数据传递

    PCI设备的数据传递使用地址译码方式,当一个存储器读写总线事务到达PCI总线时,在这条总线上的所有PCI设备将进行地址译码,如果当前总线事务使用的地址在某个PCI设备的BAR空间中时,该PCI设备将使 ...

  5. (Android数据传递)Intent消息传递机制 “Intent”“数据传递”

    Intent类的继承关系:   需要注意的是,该类实现了Parcelable(用于数据传递)和Cloneable接口. Intent是一种(系统级别的)消息传递机制,可以在应用程序内使用,也可以在应用 ...

  6. JSP、servlet、SQL三者之间的数据传递

    JSP.servlet.SQL三者之间的数据传递 博客分类: web开发 JSPservletSQL数据库连接池web开发  前言: 最近一直在做WEB开发,现总结一下这一段时间的体会和感触. 切记, ...

  7. 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递

    通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...

  8. MVC数据传递

    一.数据传递 1.ViewData[]: 用法:action中:ViewData["key"]="aaa";,V层接收ViewData["key&qu ...

  9. MVC数据传递和多表单

    1.数据传递(1)session和TempData 全局变量,可以将值从一个动作传递到另一个动作,也可以从控制层传递到视图层. TempData取一遍值后自动销毁. session使用: //控制器中 ...

随机推荐

  1. 学习ui-router

    ui-router的学习 在单页面应用中要把各个分散的视图给组织起来是通过路由机制来实现的.Angular原始的路由机制靠ngRoute提供,通过hash和history来实现的,可以检测浏览器是否支 ...

  2. Ext Js详解指南

    什么是Ext JS 走进Ext的世界 Ext JS是一款富客户端开发框架它基于javascript.HTML和CSS开发而成,无需安装任何插件即可在常用浏览器中创建出绚丽的页面效果. 个人总结Ext ...

  3. java测试之文件操作

    package filestream; import java.io.File; public class FileTester { public static void main(String [] ...

  4. Mybatis实战之TypeHandler高级进阶

    上篇文章分享了在项目实战中自定义Mybatis的TypeHandler来处理枚举类型.文章结尾也指出了美中不足之处,那就是每次都需要指定我们自定义的枚举TypeHandler. 随着项目枚举类型的增多 ...

  5. java学习书籍推荐

    1. Java 语言基础 谈到Java 语言基础学习的书籍,大家肯定会推荐Bruce Eckel 的<Thinking in Java >.它是一本写的相当深刻的技术书籍,Java 语言基 ...

  6. 更新几篇之前写在公众号上的文章:线性可分时SVM理论推导;关联分析做捆绑销售和推荐;分词、去停用词和画词云

    适合阅读人群:有一定的数学基础. 这几篇文章是16年写的,之前发布在个人公众号上,公众号现已弃用.回过头来再看这几篇文章,发现写的过于稚嫩,思考也不全面,这说明我又进步了,但还是作为学习笔记记在这里了 ...

  7. UCOSII时间任务块

    转:http://blog.csdn.net/wchp314/article/details/5416476 uCOS-II的任务控制块 标签:  uCOS-II  2009-12-01 14:45 ...

  8. 2017-2-21 C#基础 if条件语句,作用域

    今天学了if 条件语句和作用域.作用域可以用一句话来概括:儿子可以用爹的所有东西,爹不可以用儿子的任何东西.If条件语句我用几个练习题来解释. 1."请输入年份:" 判断是否是闰年 ...

  9. ubuntu14.04 + OpenCV2.4.9 配置方法

    1.  安装openCV 所需依赖库或软件: sudo apt-get install build-essential cmake libgtk2.0-dev pkg-config python-de ...

  10. ABP Zero源码

    测试运行地址:http://ghy.demo.aspnetzero.com 账号:admin  密码:123456 需要源码,请加QQ:858-048-581 1.先编译成功,Nuget下载ABP的依 ...