Apple Watch 2.0 数据通讯
经常会碰到Watch app和WatchKit extension需要访问同一个文件。比如,使用一个自定义的字体,播放多媒体文件。有两种方法完成这个任务。
- 设计的时候,每个包放一份文件。它们分别访问自己的文件。
- 给它们添加同一个共享的App Group。这样它们可以在运行时访问同一个容器了。
WatchKit extension可以使用Watch Connectivity framework和所属的iOS app通讯。这个framework为在WatchKit Extension和iOS app之间发送文件和数据,提供了双向通道。同时还提供了在后台模式下发送数据,等到app启动时再处理。
同时,iOS自动会自动为Watch复制一份app的perferences文件。WatchKit extension可以通过NSUserDefaults读取,但是不能修改。
如果watch app需要修改它们,可以使用Watch Connectivity framework把值发送到iOS app,让app来修改。
在Watch App和WatchKit Extension运行时共享文件
运行时,可以使用共享的app group在Watch App和WatchKit extension之际嗯共享数据。app group创建了一个多进程访问的容器。通常情况下,每个进程都有自己的沙盒环境,但是app group让两个进程共享了一个公共目录。两个进程在运行时都可以读写目录中的文件。
设置共享app group
- 在Xcode中打开工程的capabilities选项卡。
- 打开App Groups功能。这样会向选中的target上添加了授权文件。
注意:Watch app target 和WatchKit extension target都需要打开同样的app group。
访问容器目录
- 使用NSFileManager的containerURLForSecurityApplicationGroupIdentifier:方法来获取目录的url。
- 使用获得的url来枚举文件夹中的内容,或创建新文件。
和iOS App通讯
Watch Connectivity framework可以支持WatchKit extension和iOS app通讯。这个framework提供了双向的通讯,并且可以在前台或后台传输数据和文件。
选择合适的通讯方式
Watch Connectivity framework提供了多种iOS app和WatchKit extension通讯的方式。每个方式都有特定的用途。大多数是在后台单向的传输数据,更新数据很便捷。前台的传输会立刻发送消息并且等待回复。下表列出了各种通讯方式的介绍。
方法 | 用途 |
updateApplicationContext:error: | 给app发送少量的状态信息。接收消息的app用来同步消息,或者更新界面。例如,Watch app需要数据来更新glance。这种方式发送的数据是脆弱的。后一次发送的数据会替换前一次的。为了省电,数据是在后台某个合适的时间发送的。发送可以在任何时候,甚至app没有运行的时候。 |
transferUserInfo: transferCurrentComplicationUserInfo: |
在后台发送一个字典信息。接收消息的进程不需要一直等待数据。数据在后台队列中传输的。使用transferCurrentComplicationUserInfo:方法从iOS app向Watch app发送complication相关的数据。这个方法给WatchKit extension发送了一个高优先级的消息,会根据需要来唤醒它处理数据以及更新complication的界面。但是complication每天有一个更新限制,如果发送了太多更新,超过了限制,当天complication就不会再接收更新了。为了省电,数据在后台某个合适的时间发送的。 |
transferFile:metadata: | 发送文件是在后台完成的。接收方如果需要保存文件,需要把文件放倒一个新的位置。session:didReceiveFile:方法运行结束后,还没有移动的文件会被删除。为了省电,数据是在后台某个合适的时间发送的。 |
sendMessage:replyHandler:errorHandler: sendMessageData:replyHandler:errorHandler: |
立刻给对应的app发送数据。如果不需要响应,可以把replyHandler参数指定为nil。对应的app必须要可用的。iOS app被认为总是可用的,Watch app调用这个方法会根据需要在后台唤醒iOS app。Watch app只有在安装了并且运行时,才认为是可用的。数据会立刻发送。这个方法需要在后台初始化连接。 |
对于大部分传输,都是使用NSDictionary对象来发送数据的。NSDictionary的键值都要支持序列化,因为数据会被序列化后通过无线传输(如果要传输不能被序列化的数据,可以把它们打包到NSDate对象中,或者写入文件)。另外,传输的数据要尽量简洁,这样可以快速传输,也更省电。
App间通讯总结
这里有一些使用Watch Connectivity通讯的总结
- 使用后台app更新Watch app数据。如果iOS app周期性的唤醒,来处理一些任务。可以使用updateApplicationContext:error:方法为Watch app准备数据。这对于更新app的glance很有用。
- 代理方法中同步移动文件。系统会在调用session:didReceiveFile:代理方法后删除传输的文件。删除文件可以节省空间,也意味着要保存文件话,需要把它们移动到新的位置。移动文件需要同步完成。否在session:didReceiveFile:方法执行完之后,文件就被删了。
- 只传输需要的数据。所有的传输都是通过无线传输的。不要发送不需要的数据。费电。
- 使用updateApplicationContext:error:发送改变的数据。这个方法用来在Watch app和iOS app间传输少量的状态信息。后一次调用会替换前一次。如果要保证每次数据都到达,使用transferUserInfo:方法。
- 友好的处理错误。当数据存储空间不足,数据异常,或者通讯出错时,在handler中查看错误,并且做出合适的处理。
- 后台传输不会立刻传输。数据会尽快传输,但是不是立刻传输。大文件或数据需要花更多时间。
管理数据
设计Watch app时,可以参考下面的数据管理方法。
- 数据替换。 WatchKit extension需要扮演管理数据的角色。WatchKit extension的数据容器目录应该和iOS的结构一样。把用户相关的数据党在Documents目录下。不重要的文件放在Caches目录下,这样存储空间不够时系统可以清理它们。
- 数据备份。Apple Watch不会自动备份WatchKit extension中的文件。如果需要备份Watch app的数据,尽量把数据发回到iOS app,然后保存。
- iCloud。CloudKit以及其他iCloud技术在Apple Watch上不可用。如果app需要iCloud数据,可以通过iOS请求,然后转发到WatchKit extension。同样,任何在WatchKit extension中做的修改,需要传给iOS app,然后保存到iCloud。
- 多媒体文件。Watch app也可以处理声音和视频文件。如果WatchKit extension从网上下载多媒体文件,需要存储到Watch app和WatchKit extension都可以访问到的app group容器中。
更多信息,请查看相关文档。
Apple Watch 2.0 数据通讯的更多相关文章
- 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)
我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...
- 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)
今天没有延续上一篇讲的内容,穿插一段小插曲,WebSocket 实时数据通讯同步的问题,今天我们并不是很纯粹地讲 WebSocket 相关知识,我们通过 WebGL 3D 拓扑图来呈现一个有趣的 De ...
- 通过 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)
我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...
- AppleWatch___学习笔记(三)iPhone和Apple Watch上的数据同步
WatchKit App类似于之前iOS 8上新推出的App Extension(应用扩展),比如Today Extension(今天扩展)和Share Extension(分享扩展).只要你对iOS ...
- [转]WINDOW进程间数据通讯以及共享内存
1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同 ...
- Android Wear开发 - 数据通讯 - 第零节 : 打包Wear应用(手机和手表应用如何连接)
之所以将打包这一特殊的内容作为数据通讯的第零节,是因为如果没有通过配置打包的一些信息,则没有办法将手机端应用和手表端应用连接起来,则无法继续进行接下来的数据通讯的开发. 以下依然只针对Eclipse平 ...
- Node.js学习之TCP/IP数据通讯
Node.js学习之TCP/IP数据通讯 1.使用net模块实现基于TCP的数据通讯 提供了一个net模块,专用于实现TCP服务器与TCP客户端之间的通信 1.1创建TCP服务器 在Node.js利用 ...
- WinCE数据通讯之Web Service分包传输篇
前面写过<WinCE数据通讯之Web Service篇>那篇对于数据量不是很大的情况下单包传输是可以了,但是对于大数据量的情况下WinCE终端的内存往往会在解包或者接受数据时产生内存溢出. ...
- WinCE数据通讯之SqlCE数据同步篇
上一篇总结了WinCE通过WebService进行数据通讯的交互方式,今天整理个SqlCE数据同步方式的内容.先说下软件环境:终端平台使用WinCE5.0+SqlCE2.0,服务器使用Windows ...
随机推荐
- Servlet:通过初始参数实现权限访问某个文件、页面
目录结构 src 目录下com.xieyuan包MyServlet.java文件(Servlet文件) package com.xieyuan; import java.awt.Color; impo ...
- 网页favicon.ico图标设置(转)
随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,这个图标是:,也就是我们常说的favicon.ico. 由于这篇文章主要讨论favico ...
- 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(1)
原文: http://www.raywenderlich.com/64623/make-narrated-book-using-avspeechsynthesizer-ios-7 随着 PageVie ...
- MapReduce 异常 LongWritable cannot be cast to Text
有一个txt文件,内容格公式是这样的: 深圳订做T恤 5729944 深圳厂家t恤批发 5729945 深圳定做文化衫 5729944 文化衫厂家 5729944 订做文化衫 5729944 深圳t恤 ...
- Redis key 设计技巧
1: 把表名转换为key前缀 如, tag: 2: 第2段放置用于区分区key的字段--对应mysql中的主键的列名,如userid 3: 第3段放置主键值,如2,3,4...., a , b ,c ...
- 为了找到自己的路——leo锦书62
<Leo锦书(文章1编辑)>百度已经降落阅读,今后将继续更新.免费下载:http://t.cn/RvawZEx 柯克•卡梅隆是谁呢?在中国听过这名字的人预计不多.但看下封面我们马下就会说: ...
- php中遍历数组的方法
参考网址:http://www.jb51.net/article/29949.htm 这三种方法中效率最高的是使用foreach语句遍历数组.从PHP4开始就引入了foreach结构,是PHP中专门为 ...
- 用JavaScript实现网页动态水印
1.基本原理 页面加载后,通过javascript创建页面元素div,并在div元素中创建文本节点,展示水印内容 设置div元素样式,将其zIndex设置一个较高的值,并设置透明度,实现浮在页面的水印 ...
- Drupal 7 电子邮件的发送设置 SMTP, Mail System, Mime Mail
尽管Drupal自带发送email功能,可是非常多server须要SMTP验证.这个时候就须要安装 SMTP 模块. 激活 SMTP 模块 进入配置 admin/config/system/smtp ...
- DataTable筛选器
//datatable筛选器,函数包装模板:传入源table,目标table,db名,多表查询table,列条件数组,where筛选列,selsect筛选列 public DataTable Filt ...