WatchOS1

在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 *)userInforeply:(void (^)(NSDictionary *replyInfo))reply

WatchOS2

WatchOS 2 提供了Watch Connectivity Framework来进行 经过配对的Watch和iPhone的数据交换,该框架可以后台传输和前台传输。
而WatchConnectivity Framework提供了一个WCSession对象,我们要通过WCSession可以进行消息传输。

启动服务

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

    WCSession* session = [WCSession defaultSession];session.delegate = self;[session activateSession];

发送消息

WCSession* session = [WCSession defaultSession];
[session sendMessage:@{@"b":@"goodBye"} replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {} errorHandler:^(NSError * _Nonnull error) {}];

这里需要注意,即使replyHandler和errorHandler不使用,也不可以设置为nil,否则会造成发送消息不会被接收到,一开始randomize的Objc代码就有这个问题,所以我提交了一次修改,修正了这个问题

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

接受消息

接受消息使用代理的方式,所以我们首先要在手机和手表的Controller中,遵守如下Delegate

WCSessionDelegate

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

- (void) session:(nonnull WCSession *)session didReceiveMessage:(nonnull NSDictionary<NSString *,id> *)message replyHandler:(nonnull void (^)(NSDictionary<NSString *,id> * __nonnull))replyHandler{//message即是对方发送的内容
}

需要注意的是,在手机侧,这个代码似乎不是在主线程被调用,所以如果在方法中更新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);});}

结语

这个通讯方法很简单,使用起来更佳好用,如果涉及多页面通讯,我们可以使用单例来集中管理信息传递,
但是值得注意的是,这个方法的传送速度也不快,这主要是受手表硬件限制,毕竟蓝牙速度不快,还要考虑电池续航

文/Realank(简书作者)
原文链接:http://www.jianshu.com/p/ca5348253c84

Apple Watch(手表)与iPhone(iOS App)通信原理相关推荐

  1. 【转】iphone - ios app maximum memory budget

    [转]iphone - ios app maximum memory budget https://stackoverflow.com/questions/5887248/ios-app-maximu ...

  2. iphone ios 消息通信机制NSNotificationCenter

    ObjectC NSNotificationCenter是专门供程序中不同类间的消息通信而设置的,使用起来极为方便, 设置通知,就是说要在什么地方(哪个类)接受通知,一般在初始化中做. [[NSNot ...

  3. ReactNative与iOS通信原理解析-通信篇

    文章首发个人博客: ReactNative与iOS通信原理解析-通信篇 导语:其实原本是想编写一篇  react-native (下文简称 rn) 在  iOS 中如何实现  jsbridge 的文章 ...

  4. iOS App被Apple拒绝的原因

    1.程序有重大bug,程序不能启动,或者有crash. 2.绕过苹果的付费渠道,我们之前游戏里的用兑换码兑换金币. 3.游戏里有实物奖励的话,一定要说清楚,奖励由本公司负责,和苹果没有关系. 4.用到 ...

  5. iOS App集成Apple Pay 编程指南(中国版)

    文章将描述如何在iOS App中开发支持中国用户的Apple Pay,包括前后端的一些处理逻辑如支付信息解密. 关于Apple Pay的一些基本认识和相应API,具体可以参照Apple Pay官方文档 ...

  6. ios 输入话题_其实,iPhone原装APP很好用 篇一:iOS输入法17个小技巧,开启你iPhone原装键盘输入新篇章...

    其实,iPhone原装APP很好用 篇一:iOS输入法17个小技巧,开启你iPhone原装键盘输入新篇章 2017-12-13 15:45:15 600点赞 2104收藏 316评论 一.其实ios原 ...

  7. 【历史上的今天】7 月 10 日:iOS App Store 问世;台积电创始人出生;第一台被“越狱”的 iPhone

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2023 年 7 月 10 日,在 1856 年的今天,交流电的发明者尼古拉·特斯拉(Nikola Tesla)出 ...

  8. iPhone开发教程之iOS APP体验设计 - 醒醒吧 ))))) - majszt - 和讯博客

    iPhone开发教程之iOS APP体验设计 iPhone开发    |   更新时间:2012-10-15   |   点击:131    |   来源:本站 iOS APP体验设计不像互联网的体验 ...

  9. Appium搭建MacOS环境下的iOS App自动化测试环境(Windows搭个MacOS虚拟机就行,亦无须iPhone)

    前言 经过上篇文章<Windows上Appium自动化测试Android应用>的介绍,我们已经学习App自动化测试的基本知识,接下来我们来学习如何对iOS进行基于Appium的自动化测试. ...

最新文章

  1. 结合业务场景案例实践分析,倾囊相授美团BERT的探索经验
  2. mini2440的时钟
  3. 作为前阿里人,来扒一扒中台皇帝的外衣!
  4. android 启动service报错,Android小经验
  5. Eltwise_layer简介
  6. oracle监听器无法启动,提示“错误1067:进程意外终止”
  7. Windows 常用消息大全系统消息、通告消息、用户消息
  8. 【渝粤教育】国家开放大学2019年春季 0177-22T电机学(二) 参考试题
  9. 磁盘不见了只剩一个c盘_电脑硬盘分区突然见了就剩个C盘到磁盘管理看也只有C盘...
  10. cad工具箱详细讲解_AutoCAD学院派工具箱(XCAD)使用教程(图文解说)
  11. 山东理工ACM【1147】求绝对值最大值
  12. Magento常用功能插件
  13. 骑行318、 2016.7.15
  14. android麦克风被禁用怎么办,为什么微信麦克风被禁用?如何开启?
  15. java 实现手机号码(String)校验----两种方法
  16. Chrome游览器下载
  17. Mac Androidstudio点击打开跳一下就消失
  18. scala 环境搭建 变量 值 数据类型 元组 表达式块 语句 函数 柯里化 集合 面向对象 隐式转换
  19. python3:urllib/urllib2
  20. JDK、JRE、JVM三者分别表示什么?有何区别?

热门文章

  1. 华为鸿蒙拍照,华为首部鸿蒙手机P50来了!顶级拍照再升级,麒麟芯片或绝唱……...
  2. 腮腺炎,淋巴肿大,翳风穴疼,脸麻
  3. Python命令行搭建文件下载服务器
  4. 2022-2027年中国发泡螺旋式消音管材行业运行态势及未来发展趋势预测报告
  5. 解决连接腾讯云Ubuntu服务器,使用Xshell和WinSCP无法直接用root用户登陆
  6. Linux内存管理之MMU的过程
  7. 感情沟通出了问题要怎么解决_感情出现问题了,应该怎么办?
  8. 看完你就懂了,企业上云为什么大势所趋...
  9. Recovery 简介
  10. java计算机毕业设计血库系统源码+系统+lw+数据库+调试运行