iWatchk开发:实现iWatch 与 iPhone 之间数据发送与接收

上一代的iwatch 与iPhone 数据交互使用的是 openParentApplication 函数,在Watch OS2 中摒弃了这种方法,引入了WCSesison 来进行iwatch 与iPhone的数据发送与接收。


iWatch 端该如何像iphone 发送数据

在InterfaceController 头文件中, 引入 WatchConnectivity/WatchConnectivity.h, 添加 WCSessionDelegate代理:

#import <WatchKit/WatchKit.h>
#import <Foundation/Foundation.h>
#import <WatchConnectivity/WatchConnectivity.h>

@interface InterfaceController : WKInterfaceController<WCSessionDelegate>

在 willActivate 中加入如下代码:

    if([WCSession isSupported]){
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }

这是建立一个WCSession的基本方法。

使用WCSession中的sendMessage发送数据,代码如下:

- (IBAction)countBtn {

    WCSession *session = [WCSession defaultSession];

    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"张三",@"Name", nil];

    [session sendMessage:dic replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
        NSLog(@"replay: %@", replyMessage);

    } errorHandler:^(NSError * _Nonnull error) {
        NSLog(@"Error: %@", error);
    }];
}

这边定义了一个 NSDictionary 的字典作为数据对象,来发送给iPhone。

由于在头文件中添加了WCSessionDelegate 的代理,所以必须要实现其中的API 函数,其中的didReceiveMessage 就是用于接收iPhone发来的数据:

- (void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(nullable NSError *)error __IOS_AVAILABLE(9.3) __WATCHOS_AVAILABLE(2.2){

}

- (void)sessionDidBecomeInactive:(WCSession *)session __IOS_AVAILABLE(9.3) __WATCHOS_UNAVAILABLE{

}

- (void)sessionDidDeactivate:(WCSession *)session __IOS_AVAILABLE(9.3) __WATCHOS_UNAVAILABLE{

}

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void(^)(NSDictionary<NSString *, id> *replyMessage))replyHandler{
    NSString *name = [message objectForKey:@"Name"];
    [_nameLable setText:name];
}

这样,我们就完成了WatchKit的拓展。


iOS端处理接收与发送

同样,在我们的iPhone 端也需要导入 WatchConnectivity/WatchConnectivity.h, 以及添WCSessionDelegate。

1.在ViewController.h 中导入WatchConnectivity.h,添加WCSessionDelegate。

2.在ViewController.m 中的viewDidLoad 里加入:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    if([WCSession isSupported]){
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }
}

3.调用sendMessage 来发送数据给iwatch.

- (IBAction)sendData:(id)sender {
    NSString *text = _textField.text;
    NSLog(@"++++%@++++", text);

    WCSession *session = [WCSession defaultSession];

    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"李四",@"Name", nil];

    [session sendMessage:dic replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
        NSLog(@"replay: %@", replyMessage);

    } errorHandler:^(NSError * _Nonnull error) {
        NSLog(@"Error: %@", error);
    }];
}

4.同样跟iWatch一致,需要实现相同的代理方法来接收数据,如果你需要在收到数据后更新UI,请切换到主线程去执行,不然会报如下错误:

正确的做法如下:

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void(^)(NSDictionary<NSString *, id> *replyMessage))replyHandler{

    dispatch_async(dispatch_get_main_queue(), ^{
        //回调或者说是通知主线程刷新,
        [_textField setText:[message objectForKey:@"Name"]];
    });

    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"李四1111",@"Name", nil];

    replyHandler(dic);
}

总结

通过WCSession, 我们就可以让 iWatch 与 iPhone 进行简单的数据通信,还不赶紧跟上 watch 开发的脚步,来尝试做出一些有意思的小玩意。



好了。祝大家生活愉快。多多收获友谊和爱情。如果想获取更多的讯息,请扫描下方二维码关注我的微信公众号:

时间: 2024-08-14 07:14:54

iWatchk开发:实现iWatch 与 iPhone 之间数据发送与接收的相关文章

L2CAP数据发送和接收

ACL 链路在 Bluetooth 中非常重要,一些重要的应用如 A2DP, 基于 RFCOMM 的应用.BNEP等都要建立 ACL 链路,发送/接收ACL 包.跟大家一起来分析 ACL 包发送/接收流程,以及涉及到的重要 command/event. (一) ACL包发送 以下的图是各种应用层使用 L2CAP 的 API:L2CA_DataWrite 发送数据流的过程,此API继续往下走,我仅分析了正常数据流的走向(临时没有考虑别的情况). watermark/2/text/aHR0cDovL

ASP.NET POST XML JSON数据,发送与接收

接收端通过Request.InputStream读取:byte[] byts = new byte[Request.InputStream.Length];Request.InputStream.Read(byts,0,byts.Length);string req = System.Text.Encoding.Default.GetString(byts);req = Server.UrlDecode(req); 对于完整的XML数据,可以:xmlDoc = new XmlDocument()

iOS开发中视图控制器ViewControllers之间的数据传递

iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storyboard中传递数据. 首先新建一个空工程,并添加一个根视图控制器类,如下图所示: # 在函数didFinishLunchingWithOption中添加几行代码,完成后如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 - (BOOL)application:(UIApplication

通过SSIS的“查找”组件进行不同数据源之间数据的合并操作

原文:通过SSIS的"查找"组件进行不同数据源之间数据的合并操作 为了协助开发还原生产环境中的某些bug,需要将将生产环境的某些特定表数据导入到测试环境做测试,之前一直都是暴力地truncate测试环境的表,然后用SSIS将生产环境对应的整张表数据导入测试环境,简便快捷后来开发提出来,保留测试环境已有的数据,只同步差异的数据(根据主键),于是就尝试使用SSIS中的“查找”组件进行不同服务器之间的“存在则更新,不存在则插入”数据合并操作,实际操作的时候只执行插入操作,达到同步数据的目的.

?HealthKit开发快速入门教程之HealthKit数据的操作

HealthKit开发快速入门教程之HealthKit数据的操作 数据的表示 在HealthKit中,数据是最核心的元素.通过分析数据,人们可以看到相关的健康信息.例如,通过统计步数数据,人们可以知道一天走的步数.本章将主要讲解HealthKit数据构成的方式,以及如何规范的表达一个数据. 2.1  数据的操作 在HealthKit中,数据都是与单位和值组成的,如图2.1所示.此图为一个睡眠分析的截图.在此图中59m就代表了一个数据.其中m为单位,59为基于单位的数值.本节将讲解数据的创建.判断

如何设置并将你的iWatch和iPhone配对

如何设置并将你的iWatch和iPhone配对 一旦你买到一个iWatch,打回家并拆封,下面教你如何设置. iWatch是这样一个装置,它被设计出来和你的iPhone一起使用.它可以说是一个iPhone配件,它们的关系非常亲密.这也是为什么设置iWatch感觉在很大程度上都像在你的电脑上安装一个外围设备或者软件包一样的原因.但是,这里,你是在为你的iPhone"安装一个配件".一旦配对完成后,它就也可以安装你需要的所有apps啦. 过程非常的简单,但是有点浪费时间.准备好至少花费20

PCB MVC启动顺序与各层之间数据传递对象关系

准备着手基于MVC模式写一套Web端流程指示查看,先着手开发WebAPI打通数据接口,后续可扩展手机端 这里将MVC基本关系整理如下: 一.MVC启动顺序 二.MVC各层之间数据传递对象关系 原文地址:https://www.cnblogs.com/pcbren/p/9337766.html

Python测试开发-创建模态框及保存数据

Python测试开发-创建模态框及保存数据 原创: fin  测试开发社区  前天 什么是模态框? 模态框是指的在覆盖在父窗体上的子窗体.可用来做交互,我们经常会看到模态框用来登录.确定等等,到底是怎么实现这种弹出效果,bootstrap已经为我们提供了相应的组件. 1.界面原型 点击添加,弹出模态框, 然后输入 用户:tester, 消息:你好.如下图1所示: ▲图1 再点击保存,那么数据库就存入了以上输入的数据,查看界面的用户列表会显示tester,如下图2所示: ▲图2 2.开发过程 接下

JavaWeb开发中form、ajax提交数据Model转化

JavaWeb开发中form.ajax提交数据Model转化 问题 最近学习MongoDB数据库,作为java开发的我,当然需要做个小的web程序来测试一番了.在html中我采取ajax提交方式,因为我要模拟各种类型的数据,基础数据类型.数组.对象等.然而,最终发现了个不同的地方:Form和ajax提交数据,在HttpServletRequest中尽然参数名有所不同. 数据类型 form ajax 基础数据 para=value para=value 数组 para[]={"aaa",