经常会碰到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 1879 Tempus et mobilius Time and motion (模拟+群)

    题目特别长,大意为球的传递. 三个轨道,一个库.各自是分钟单位的轨道.5min单位的轨道.一小时单位的轨道.还有就是n容量的库. 每过一分钟,一个小球从库里面出来,库符合先进先出,进入分钟轨道.假设分 ...

  2. BZOJ 3112 Zjoi2013 防守战线 单纯形

    题目大意: 单纯形*2.. . #include <cmath> #include <cstdio> #include <cstring> #include < ...

  3. 【Unity 3D】学习笔记三十七:物理引擎——碰撞与休眠

    碰撞与休眠 上一篇笔记说过,当给予游戏对象刚体这个组件以后,那么这个组件将存在碰撞的可能性.一旦刚体開始运动,那么系统方法便会监视刚体的碰撞状态.一般刚体的碰撞分为三种:进入碰撞,碰撞中,和碰撞结束. ...

  4. UVA 11237 - Halloween treats(鸽笼原理)

    11237 - Halloween treats option=com_onlinejudge&Itemid=8&page=show_problem&category=516& ...

  5. WPF案例 (四) 模拟Windows7桌面任务栏

    原文:WPF案例 (四) 模拟Windows7桌面任务栏 这个程序模彷了Windows7的桌面任务栏,当在桌面上双击某个快捷方式时,将打开一个新的子界面,并且在任务栏里创建一个链接到此界面的任务栏图标 ...

  6. Python倒计时器(转)

    # Countdown using Tkinter from Tkinter import * import time import tkMessageBox class App: def __ini ...

  7. Qt调用word 例子

    Qt调用word 例子 Getting Microsoft Word Object to SaveAs #include <QtGui> #include <QAxObject> ...

  8. Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十三)

    今天我们实验libvirt提供的快照功能,快照可以用于系统恢复,防止安装了某些软件或中病毒等情况导致系统损毁的情况. 一.快照类型 1)        磁盘快照 内部的:快照驻留在原来的镜像文件内部 ...

  9. android app崩溃日志收集以及上传

    源代码获取请到github:https://github.com/DrJia/AndroidLogCollector 已经做成sdk的形式,源代码已公开,源代码看不懂的请自行google. 假设想定制 ...

  10. 如何检测被锁住的Oracle存储过程及处理办法汇总(转)

    1.查看是哪一个存储过程被锁住查V$DB_OBJECT_CACHE视图select * from V$DB_OBJECT_CACHE where owner='过程的所属用户' AND LOCKS!= ...