Apple Watch 1.0 开发介绍 1.3 简介 WatchKit App 架构
WatchKit app和WatchKit extension一起实现了app的界面。当用户在Apple Watch中操作时,WatchKit app从storyboards中选择合适的场景。比如,如果用户查看glance,它就会选择glance场景。在选择场景时,WatchKit通知对应的iPhone启动WatchKit extension来创建管理场景的对象。当常见完全配置好之后,它会显示在Apple Watch上。这种在WatchKit app和WatchKit extension中传递数据的操作完全是在幕后操作的。
下图显示了WatchKit app和WatchKit extension间的通讯。

管理场景:界面控制器
每个场景是由一个界面控制器对象来管理的, 它是WKInterfaceController类的实例。由于一次只在屏幕上显示一个界面,app展现新界面时会根据用户操作切换界面控制器。App可以模态界面。切换的类型也决定了界面如何展示。
注意:Glance和自定义通知界面使用特殊的界面控制器,它们和其他界面不同。
WatchKit App生命周期
用户的操作启动了app也决定了它的生命周期。用户从主屏启动app,查看glance或者查看通知界面。每个交互都会启动WatchKit app和对应的WatchKit extension。Watch app和WatchKit会一直传递信息指导用户停止操作app,这个时候iOS挂起estension知道下次用户操作。
在启动时,WatchKit为当前操作加载合适的场景。如果用户查看app的glance,WatchKit从storyboard中加载glance场景。如果用户直接启动app,WatchKit加载app的初始化场景。加载场景后,WatchKit通知WatchKit extension创建对应的界面控制器用来准备要展示的场景。下图展示了这个过程。

使用界面控制器的init和awakeWithContext:方法来加载需要的数据,设置对象的值,以及界面展示的准备工作。不要使用willActivate来初始化界面。willActivate方法只在将要显示的很短时间内调用,所以只能用这个方法做微笑的改变。比如,用这个方法来开始动画,或者开始只有界面显示时才执行的操作。
界面在屏幕上时,用户界面的操作会又界面控制器的自定义方法处理。当用户操作表格,按钮,开关等控件时,WatchKit会调用你的方法来响应。使用这些方法来更新界面以及执行相关的人物。如果要在其他时间执行任务,可以使用NSTimer来实现。
注意:Glance界面不支持事件方法。点击glance界面会启动app。
在用户操作Apple Watch时WatchKit extension会一直运行。Apple Watch的操作一般比较简短,所有界面控制器应该轻量并且不要执行长时间的任务。当用户退出app或者停止Apple Watch操作,iOS会停止界面控制器并且挂起WatchKit extension。如下图

App不同状态执行的不同任务
在app声明周期的不同状态,iOS会调用WKInterfaceController对象的方法来让它处理。下面的表格列出了基本上要实现的方法,以及他们是做什么的。
| 方法 | 执行的任务 |
| init | 第一个初始化的机会 |
| awakeWithContexxt: | 使用任何可用的数据配置界面控制器。使用它来加载数据,更新标签,图片,表格以及其他storyboard中的对象。context数据是配置新控制器时指定的。例如,在一个多层的界面中创建一个新界面时,会指定下一个界面要显示的context数据。建议提供context对象但是不是必须的。 |
| willActive | 界面马上就要显示给用户了。这个方法中做一个界面小的改变。例如,用这个方法根据新数据改变标签内容。界面的初始化工作还是要在init和awakeWithContext:方法中做 |
| didDeactivate | 使用这个方法来清理界面以及让界面进入静止状态。例如,使用这个方法来停止计时器以及停止动画。不能在这个方法中给界面对象设置值。从这个时候到willActivate调用之前,所有的试图改变界面值的方法都被无视了。 |
在模拟器上调试状态的代码
在测试中,可以锁定和解锁模拟器来确认activation喝deactivation代码是否按预期的工作。当使用Hardware>Lock命令来锁定模拟器,WatchKit会调用当前界面的didDeactivate方法。解锁模拟器的时候,WatchKit会调用willActivate。
和已有iOS app共享数据
如果iOS app和WatchKit extension依赖同样的数据,使用共享的app group来存储数据。App group是线程安全的。由于WatchKit extension和iOS app在不同的沙盒环境中,因此他们不能直接共享文件以及通讯。App group让两个进程可以共享文件和数据。
在iOS app和WatchKit extension工程的Capabilities tab中设置一个共享的app group。为每个target添加一个entitilements文件,向文件中添加一个com.apple.security.application-groups元素。所有的target需要选择同一个app group。
在运行时,通过读写共享的文件夹来共享数据。使用NSFileManager的containerURLForSecurityApplicationGroupIdentifier:方法来获取文件夹根地址。使用这个URL来枚举文件夹内容或者创建新的文件。
也可以用group id创建一个NSUserDefaults对象来共享数据。使用initWithSuiteName:方法创建的NSUserDefaults对象可以访问共享数据。iOS app和WatchKit extension都可以读写数据。
直接和iOS app通讯
app可以使用openParentAllication:reply:方法来向iOS app发送请求和接收响应。WatchKit extension不支持后台运行模式。他们只在用户操作Apple Watch时运行。iOS app没有那么多限制,他们可以被配置为在后台运行来为WatchKit extension获取数据。有些活动可能需要一些时间才能完成,比如获取用户的位置,应该由iOS app来完成然后把数据传给WatchKit extension。
当调用openParentApplication:reply:方法时,iOS在后台启动或唤醒app然后调用app delegate的application:handleWatchKitEctensionRequest:reply:方法。App delegate通过提供的信息执行操作然后把结果返回给WatchKit extension。
Apple Watch 1.0 开发介绍 1.3 简介 WatchKit App 架构的更多相关文章
- Apple Watch 1.0 开发介绍 1.2 简介 配置Xcode工程
WatchKit app需要一个现有的iOS app.在iOS app工程中,添加一个新的WatchKit app target,它包含了WatchKit app和WatchKit extension ...
- Apple Watch 1.0 开发介绍 1.4 简介 使用iOS技术
WatchKit extension可以使用iOS app同样的技术,但是由于他是extension,使用有些技术的时候会有限制,有些不推荐使用.下面是一些介绍以及什么时候使用什么技术: 有些需要权限 ...
- Apple Watch 1.0 开发介绍 1.1 简介 开发苹果手表
使用Apple Watch,用户可以使用一种不显眼的方式查看信息.不用把iPhone从口袋里拿出来,就可以通过看一下手表快速获得重要信息. 作为Apple Watch的第三方app开发者,应该通过使用 ...
- Apple Watch 1.0 开发介绍 2.1 WatchKit Apps UI要点
实现app的开始是定义storyboard场景.每个场景定义了app的一部分界面.可以为不同的尺寸自定义场景. 组装storyboard界面 WatchKit app和iOS app的布局模式不同.组 ...
- 关于Apple Watch,听听开发了两个月Watch App的工程师怎么说
今年1月份有幸应苹果邀请,秘密参与苹果 Watch App 的真机现场调试.4月份,Apple Watch 会正式上市.在这之前,也算是亲自抢先体验了 Apple Watch,以及开发了一下 Watc ...
- android 蓝牙4.0 开发介绍
最近一直在研究一个蓝牙功能 由于本人是菜鸟 学起来比较忙 一直搞了好久才弄懂 , 网上对蓝牙4.0也就是几个个dome 抄来抄去,全是英文注解 , 对英语不好的朋友来说 真是硬伤 , 一些没必要的描 ...
- 从0开发3D引擎(补充):介绍领域驱动设计
我们使用领域驱动设计(英文缩写为DDD)的方法来设计引擎,在引擎开发的过程中,领域模型会不断地演化. 本文介绍本系列使用的领域驱动设计思想的相关概念和知识点,给出了相关的资料. 上一篇博文 从0开发3 ...
- 从0开发3D引擎(二):准备预备知识
大家好,本文介绍了开发3D引擎需要的预备知识,给出了相关的资源. 上一篇博文 从0开发3D引擎(一):开篇 了解Web 3D Web 3D的历史 目前Web 3D是基于WebGL这个Web端3D AP ...
- 从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)
前面几章主要是概念性的东西为主,向初学者们介绍项目开始前的一些知识与内容,从本章开始将会进入实操阶段,希望跟着本系统学习的朋友认真按说明做好每一步操作(对于代码最好是直接照着文档内容在你的IDE中打一 ...
随机推荐
- Hdu 3410 【单调队列】.cpp
题意: 给出一个数组,问你对于第i个数,从最后一个比它大的数到它之间比它小的数中最大的那个数的下标,以及它右边到第一个比它大的数中比它小的数中最大的那一个数的下标<下标从1开始>. eg: ...
- 《WordPress插件开发手冊》文件夹
翻译前言:国内没有关于WordPress插件开发比較具体而且系统的资料 前言 第一章:准备一个本地开发环境 介绍 在你的电脑上安装一个站点server 下载并配置一个本地的WordPress 创建一个 ...
- 每天一个JavaScript实例-html5拖拽
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- SRM 219 Div II Level One: WaiterTipping,小心约分
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12609&rd=15503 这题目看上去so easy, ...
- Jquery利用ajax调用asp.net webservice的各种数据类型(总结篇)
原文:Jquery利用ajax调用asp.net webservice的各种数据类型(总结篇) 老话说的好:好记心不如烂笔头! 本着这原则,我把最近工作中遇到的jquery利用ajax调用web服务的 ...
- ORA-16525: the Data Guard broker is not yet available
DGMGRL> disable configuration;ORA-16525: the Data Guard broker is not yet available Configuration ...
- SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF
原文:SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF 本来用 Writer 写一篇关于一列多行合并的博客来的,结果快写完了时候,在一个插入代码时候,崩了,重新打开,居然 ...
- LeetCode——Valid Sudoku
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- twitter 监测登陆活动
http://vicenteaguileradiaz.com/download/tinfoleak/tinfoleak-1.2.tar.gz
- 仿CSDN Blog返回页面顶部功能
只修改了2个地方: 1,返回的速度-->改成了慢慢回去.(原来是一闪而返回) 2,返回顶部图标出现的时机-->改成了只要不在顶部就显示出来.(原来是向下滚动500px后才显示) 注意:JS ...