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 ...
随机推荐
- POj 1879 Tempus et mobilius Time and motion (模拟+群)
题目特别长,大意为球的传递. 三个轨道,一个库.各自是分钟单位的轨道.5min单位的轨道.一小时单位的轨道.还有就是n容量的库. 每过一分钟,一个小球从库里面出来,库符合先进先出,进入分钟轨道.假设分 ...
- BZOJ 3112 Zjoi2013 防守战线 单纯形
题目大意: 单纯形*2.. . #include <cmath> #include <cstdio> #include <cstring> #include < ...
- 【Unity 3D】学习笔记三十七:物理引擎——碰撞与休眠
碰撞与休眠 上一篇笔记说过,当给予游戏对象刚体这个组件以后,那么这个组件将存在碰撞的可能性.一旦刚体開始运动,那么系统方法便会监视刚体的碰撞状态.一般刚体的碰撞分为三种:进入碰撞,碰撞中,和碰撞结束. ...
- UVA 11237 - Halloween treats(鸽笼原理)
11237 - Halloween treats option=com_onlinejudge&Itemid=8&page=show_problem&category=516& ...
- WPF案例 (四) 模拟Windows7桌面任务栏
原文:WPF案例 (四) 模拟Windows7桌面任务栏 这个程序模彷了Windows7的桌面任务栏,当在桌面上双击某个快捷方式时,将打开一个新的子界面,并且在任务栏里创建一个链接到此界面的任务栏图标 ...
- Python倒计时器(转)
# Countdown using Tkinter from Tkinter import * import time import tkMessageBox class App: def __ini ...
- Qt调用word 例子
Qt调用word 例子 Getting Microsoft Word Object to SaveAs #include <QtGui> #include <QAxObject> ...
- Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十三)
今天我们实验libvirt提供的快照功能,快照可以用于系统恢复,防止安装了某些软件或中病毒等情况导致系统损毁的情况. 一.快照类型 1) 磁盘快照 内部的:快照驻留在原来的镜像文件内部 ...
- android app崩溃日志收集以及上传
源代码获取请到github:https://github.com/DrJia/AndroidLogCollector 已经做成sdk的形式,源代码已公开,源代码看不懂的请自行google. 假设想定制 ...
- 如何检测被锁住的Oracle存储过程及处理办法汇总(转)
1.查看是哪一个存储过程被锁住查V$DB_OBJECT_CACHE视图select * from V$DB_OBJECT_CACHE where owner='过程的所属用户' AND LOCKS!= ...