必威体育Betway必威体育官网
当前位置:首页 > IT技术

WatchOS 实现iPhone与Apple Watch通信(数据传输)

时间:2019-08-20 12:13:16来源:IT技术作者:seo实验室小编阅读:85次「手机版」
 

iphone watch

前言(没有Demo)

hihi,勇敢的小伙伴儿们大家好,最近身体不适···就不多说废话了,今天带大家了解的是APPleWatch和iPhone之间通信的两种方法,第一种是Watch OS1的App Groups,第二种是watch os2中提供的Watch Connectivity Framework中的WCsession对象。

正文

WatchOS 1

在watchOS1中,我们使用AppGroup和AppDelegate在手机和手表之间传递数据,这跟App Extension的原理是一样的。

App Groups

概念

App Group是一个App与其扩展均可以访问的本地文件系统的一块区域。由于Watch App与iOS App是在不同的沙盒环境下运行,正常情况下他们彼此无法分享数据,因此,我们需要创建一个App Group,使它们拥有一个共享的文件区域。

实现

1.开启App Groups

项目的target里分别打开项目本身和Watch App的App Groups,点击加号,添加一个App Group,输入一个唯一的标识符。我们之后会在 Watch App 和 iOS App 中通过该标识符访问同一个 App Group。

Extension的App Groups:

iOS App的App Groups:

2. 编码

App Groups只能异步同步数据,当手表读取数据的时候,只能读之前手机App保存的数据,相反也是如此。当手机App有新的数据保存时,不能及时的通知手表更新数据,只能是手表下次去主动获取数据。

App Delegate

使用App Group方式, 可以异步的共享数据,下面讲述怎么通过app delegate方式来同步的共享数据

此同步方式的原理是,手表App的Interfacecontroller调用如下方法:

+ (BOOL)openparentApplication:(NSDictionary *)userInfo reply:  
(void(^)(NSDictionary *replyInfo, NSERROR *error)) reply;  

调用此方法后,手机App的AppDelegate会响应, 响应函数: - application:handleWatchKitExtensionrequest:reply:

- (void)application:(UIApplication *)application  
handleWatchKitExtensionRequest:(NSDictionary *)userInfo  
              reply:(void (^)(NSDictionary *replyInfo))reply  

WatchOS2

WatchOS 2 提供了Watch Connectivity Framework来进行 经过配对的Watch和iPhone的数据交换,该框架可以后台传输和前台传输。

而WatchConnectivity Framework提供了一个WCSession对象,我们要通过WCSession可以进行消息传输。

启动服务

使用WCSession发送和接受消息前,需要先在手机和手表的Controller中分别启动Session,并且尽可能的早:

//判断WCSession是否被支持
    if ([WCSession isSupported]) {
        //启动WCSession
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }

发送消息

这里有一个需要注意的地方:Watch调用该方法可以唤醒iPhone会在iOS后台启动App,但是iPhone上不会唤醒Watch在后台启App。

[session sendmessage:@{@"data":@[@"1",@"2",@"3"]} replyhandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
            NSLog(@"ReplyMessage:%@",replyMessage);
        } errorHandler:^(NSError * _Nonnull error) {
            NSLog(@"Error:%@",error);
        }];

这里需要注意,即使replyHandler和errorHandler不使用,也不可以设置为nil,否则会造成发送消息不会被接收到。

[session sendMessage:@{@"watch":@"watch test"} replyHandler:nil errorHandler:nil];//禁止这样调用

接收消息

接收消息使用代理的方式,所以我们首先要在手机和手表的Controller中,遵守WCSessionDelegate。

Watch和iPhone都需要遵守几个必须遵守的协议

//必须实现的代理方法
- (void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(NSError *)error {
    NSLog(@"%s",__func__);
}

iPhone上还要遵守的协议:

- (void)sessionDidBecomeInactive:(nonnull WCSession *)session {
    NSLog(@"%s",__func__);
}

- (void)sessionDidDeactivate:(nonnull WCSession *)session {
    NSLog(@"%s",__func__);
}

然后,创建如下方法,接收消息:

//接收iphone发送的数据
- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message replyHandler:(void (^)(NSDictionary<NSString *,id> * _Nonnull))replyHandler{
    NSLog(@"%s",__func__);
    //将接收到的数据用来请求数据
    NSArray *array = [message objectForKey:@"data"];
    NSLog(@"ReceiveMessage:%@",array);
}

需要注意的是,在手机侧,这个代码似乎不是在主线程被调用,所以如果在方法中更新UI控件,比如修改UILabel的内容,需要使用GCD在主线程中修改:

- (void) session:(nonnull WCSession *)session didReceiveMessage:(nonnull NSDictionary<NSString *,id> *)message replyHandler:(nonnull void (^)(NSDictionary<NSString *,id> * __nonnull))replyHandler{
    dispatch_async(dispatch_get_main_queue(), ^{
        self.messageLabel.text = message[@"b"];
        NSLog(@"%@",message);
    });
}

结语

这个通讯方法很简单,使用起来更佳好用,如果涉及多页面通讯,我们可以使用单例来集中管理信息传递,

但是值得注意的是,这个方法的传送速度也不快,这主要是受手表硬件限制,毕竟蓝牙速度不快,还要考虑电池续航。

参考博客地址:

Apple Watch(手表)与iPhone(iOS App)通信原理

!Apple Watch与iPhone数据通信———— Watch Connectivity

原 Apple Watch开发和数据传输(三)

感谢各位前辈的分享!

颜华在这个地方理解的也不是很透彻,而且最近身体不舒服,有点懒,不想去深究了。

如果有了解的小伙伴儿欢迎跟颜华分享你的理解,感激不尽!

最后重申,这里没有Demo可以分享给大家,但是如果有问题的话欢迎在下方留言或在首页添加微信联系颜华。

还要注明的一点是:

大多数知识都是很久之前写的,小伙伴儿们联系我的话我也可能有所遗忘,因为工作繁忙,有时候不能及时回复,希望能耐心地等待,谢谢大家的理解。

还有就是遇到问题如果我能解决的话,我尽量把我的思路和方法跟大家分享,所以请不要一个问题问我两遍甚至三遍,我希望能抛砖引玉而不是无意义的引导,再次感谢大家的理解。

相关阅读

对二进制流文件实现Blob下载

最近公司项目中,有对文件的导出(下载)的功能,当然普通的下载方式,比如访问一个后台文件流地址,直接生成对应的文件,下载即可,地址栏中也可

c语言实现循环队列

接口参考严蔚敏老师的数据结构 难点 开始队列为空时front = rear = 0,队列满时如果也是front = rear,则很难判断空满两个状态,因此

新浪博客账号快速收录技巧,实现百度霸屏效果!

今天给大家分享一篇如何利用SEO技术快速获取博客关键词排名的技巧!主要有三个方面: 博客SEO 第一:黏住粉丝 用户浏览我们的博客,无非

实现数据权限控制的一种方法

在企业管理系统中,常常有这样的要求: 1. 用户一般只能查看自己部门的数据 2. 可以设置用户可以查看哪些部门的数据 这种权限的控

css3实现 slideUp/slideDown效果

1. 纯css3实现<h1><mark>PURE CSS</mark> Slide Up and Slide Down</h1> <input id="toggle" type="checkbox"><label for="toggl

分享到:

栏目导航

推荐阅读

热门阅读