经常会碰到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. Servlet:通过初始参数实现权限访问某个文件、页面

    目录结构 src 目录下com.xieyuan包MyServlet.java文件(Servlet文件) package com.xieyuan; import java.awt.Color; impo ...

  2. 网页favicon.ico图标设置(转)

    随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,这个图标是:,也就是我们常说的favicon.ico. 由于这篇文章主要讨论favico ...

  3. 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(1)

    原文: http://www.raywenderlich.com/64623/make-narrated-book-using-avspeechsynthesizer-ios-7 随着 PageVie ...

  4. MapReduce 异常 LongWritable cannot be cast to Text

    有一个txt文件,内容格公式是这样的: 深圳订做T恤 5729944 深圳厂家t恤批发 5729945 深圳定做文化衫 5729944 文化衫厂家 5729944 订做文化衫 5729944 深圳t恤 ...

  5. Redis key 设计技巧

    1: 把表名转换为key前缀 如, tag: 2: 第2段放置用于区分区key的字段--对应mysql中的主键的列名,如userid 3: 第3段放置主键值,如2,3,4...., a , b ,c ...

  6. 为了找到自己的路——leo锦书62

    <Leo锦书(文章1编辑)>百度已经降落阅读,今后将继续更新.免费下载:http://t.cn/RvawZEx 柯克•卡梅隆是谁呢?在中国听过这名字的人预计不多.但看下封面我们马下就会说: ...

  7. php中遍历数组的方法

    参考网址:http://www.jb51.net/article/29949.htm 这三种方法中效率最高的是使用foreach语句遍历数组.从PHP4开始就引入了foreach结构,是PHP中专门为 ...

  8. 用JavaScript实现网页动态水印

    1.基本原理 页面加载后,通过javascript创建页面元素div,并在div元素中创建文本节点,展示水印内容 设置div元素样式,将其zIndex设置一个较高的值,并设置透明度,实现浮在页面的水印 ...

  9. Drupal 7 电子邮件的发送设置 SMTP, Mail System, Mime Mail

    尽管Drupal自带发送email功能,可是非常多server须要SMTP验证.这个时候就须要安装 SMTP 模块. 激活 SMTP 模块 进入配置 admin/config/system/smtp ...

  10. DataTable筛选器

    //datatable筛选器,函数包装模板:传入源table,目标table,db名,多表查询table,列条件数组,where筛选列,selsect筛选列 public DataTable Filt ...