经常会碰到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

  1. 在Xcode中打开工程的capabilities选项卡。
  2. 打开App Groups功能。这样会向选中的target上添加了授权文件。

注意:Watch app target 和WatchKit extension target都需要打开同样的app group。

访问容器目录

  1. 使用NSFileManager的containerURLForSecurityApplicationGroupIdentifier:方法来获取目录的url。
  2. 使用获得的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 数据通讯的更多相关文章

  1. 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)

    我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...

  2. 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)

    今天没有延续上一篇讲的内容,穿插一段小插曲,WebSocket 实时数据通讯同步的问题,今天我们并不是很纯粹地讲 WebSocket 相关知识,我们通过 WebGL 3D 拓扑图来呈现一个有趣的 De ...

  3. 通过 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)

    我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...

  4. AppleWatch___学习笔记(三)iPhone和Apple Watch上的数据同步

    WatchKit App类似于之前iOS 8上新推出的App Extension(应用扩展),比如Today Extension(今天扩展)和Share Extension(分享扩展).只要你对iOS ...

  5. [转]WINDOW进程间数据通讯以及共享内存

    1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同 ...

  6. Android Wear开发 - 数据通讯 - 第零节 : 打包Wear应用(手机和手表应用如何连接)

    之所以将打包这一特殊的内容作为数据通讯的第零节,是因为如果没有通过配置打包的一些信息,则没有办法将手机端应用和手表端应用连接起来,则无法继续进行接下来的数据通讯的开发. 以下依然只针对Eclipse平 ...

  7. Node.js学习之TCP/IP数据通讯

    Node.js学习之TCP/IP数据通讯 1.使用net模块实现基于TCP的数据通讯 提供了一个net模块,专用于实现TCP服务器与TCP客户端之间的通信 1.1创建TCP服务器 在Node.js利用 ...

  8. WinCE数据通讯之Web Service分包传输篇

    前面写过<WinCE数据通讯之Web Service篇>那篇对于数据量不是很大的情况下单包传输是可以了,但是对于大数据量的情况下WinCE终端的内存往往会在解包或者接受数据时产生内存溢出. ...

  9. WinCE数据通讯之SqlCE数据同步篇

    上一篇总结了WinCE通过WebService进行数据通讯的交互方式,今天整理个SqlCE数据同步方式的内容.先说下软件环境:终端平台使用WinCE5.0+SqlCE2.0,服务器使用Windows ...

随机推荐

  1. poj - 1170 - Shopping Offers(减少国家dp)

    意甲冠军:b(0 <= b <= 5)商品的种类,每个人都有一个标签c(1 <= c <= 999),有需要购买若干k(1 <= k <=5),有一个单价p(1 & ...

  2. c++中volatile详解

    1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.这是 BS 在 "The ...

  3. 10、ERP设计之系统基础管理(BS)- 平台化设计

    ShareERP 2013-09-03 ERP业务平台化是每个软件提供商必须要进行的趋势,传统定制化路线已死,不能走定制化的老路了.以往最大问的题是不能累积和沉淀技术及提升项目业务管理能力,其次是管理 ...

  4. F5 root密码恢复

    使用串口线缆链接F5的串口和PC相连接,调节串口的波特率为12000,重启F5 后在启动菜单上和linux 单用户模式一样操作即可.

  5. mongodb常用操作语句

    mongodb常用操作语句 A:创建数据表 db.createCollection(name, {capped: <Boolean>, autoIndexId: <Boolean&g ...

  6. 局部权重线性回归(Locally weighted linear regression)

    在线性回归中,因为对參数个数选择的问题是在问题求解之前已经确定好的,因此參数的个数不能非常好的确定,假设參数个数过少可能拟合度不好,产生欠拟合(underfitting)问题,或者參数过多,使得函数过 ...

  7. linux网络编程学习笔记之三 -----多进程并发服务端

    首先是fork()函数.移步APUE 8.3.  比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...

  8. Libgdx: 将Texturepacker打包的PNG图片还原成一张一张的单个的

    你是否发现用Texturepacker在打包压缩资源文件之后. 把原稿文件弄丢了,可是又要添加新的小png的时候,却无从下手了,本文就是博主在遇到这个问题后百度了非常多方法,可惜仅仅有plist格式的 ...

  9. css实现自适应屏幕高度

    body,html{ margin:0px; height:100%; }

  10. lightoj1030(期望dp)

    有n个格子,初始的时候pos=1,然后丢骰子,然后新的pos为pos+骰子的点数,走到新的pos,可以捡走该pos上的黄金. 特殊的是,如果新的pos超过了n,那么是不会走的,要重新丢骰子. 所以要分 ...