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 架构的更多相关文章

  1. Apple Watch 1.0 开发介绍 1.2 简介 配置Xcode工程

    WatchKit app需要一个现有的iOS app.在iOS app工程中,添加一个新的WatchKit app target,它包含了WatchKit app和WatchKit extension ...

  2. Apple Watch 1.0 开发介绍 1.4 简介 使用iOS技术

    WatchKit extension可以使用iOS app同样的技术,但是由于他是extension,使用有些技术的时候会有限制,有些不推荐使用.下面是一些介绍以及什么时候使用什么技术: 有些需要权限 ...

  3. Apple Watch 1.0 开发介绍 1.1 简介 开发苹果手表

    使用Apple Watch,用户可以使用一种不显眼的方式查看信息.不用把iPhone从口袋里拿出来,就可以通过看一下手表快速获得重要信息. 作为Apple Watch的第三方app开发者,应该通过使用 ...

  4. Apple Watch 1.0 开发介绍 2.1 WatchKit Apps UI要点

    实现app的开始是定义storyboard场景.每个场景定义了app的一部分界面.可以为不同的尺寸自定义场景. 组装storyboard界面 WatchKit app和iOS app的布局模式不同.组 ...

  5. 关于Apple Watch,听听开发了两个月Watch App的工程师怎么说

    今年1月份有幸应苹果邀请,秘密参与苹果 Watch App 的真机现场调试.4月份,Apple Watch 会正式上市.在这之前,也算是亲自抢先体验了 Apple Watch,以及开发了一下 Watc ...

  6. android 蓝牙4.0 开发介绍

    最近一直在研究一个蓝牙功能 由于本人是菜鸟  学起来比较忙 一直搞了好久才弄懂 , 网上对蓝牙4.0也就是几个个dome 抄来抄去,全是英文注解 , 对英语不好的朋友来说 真是硬伤 , 一些没必要的描 ...

  7. 从0开发3D引擎(补充):介绍领域驱动设计

    我们使用领域驱动设计(英文缩写为DDD)的方法来设计引擎,在引擎开发的过程中,领域模型会不断地演化. 本文介绍本系列使用的领域驱动设计思想的相关概念和知识点,给出了相关的资料. 上一篇博文 从0开发3 ...

  8. 从0开发3D引擎(二):准备预备知识

    大家好,本文介绍了开发3D引擎需要的预备知识,给出了相关的资源. 上一篇博文 从0开发3D引擎(一):开篇 了解Web 3D Web 3D的历史 目前Web 3D是基于WebGL这个Web端3D AP ...

  9. 从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)

    前面几章主要是概念性的东西为主,向初学者们介绍项目开始前的一些知识与内容,从本章开始将会进入实操阶段,希望跟着本系统学习的朋友认真按说明做好每一步操作(对于代码最好是直接照着文档内容在你的IDE中打一 ...

随机推荐

  1. hbase基本概念和hbase shell经常使用命令使用方法

    HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实现,它利用H ...

  2. 一步一步学android之事件篇——单选按钮监听事件

    在平常使用软件的时候,我们经常会碰见一些选择题,例如选择性别的时候,在男和女之间选,前面说过这个情况要用RadioGroup组件,那么点击了之后我们该怎么获取到选择的那个值呢,这就是今天要说的OnCh ...

  3. 【剑指offer】复制的复杂链条

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26154691 题目描写叙述: 输入一个复杂链表(每一个节点中有节点值,以及两个指针,一个指 ...

  4. MapReduce 异常 LongWritable cannot be cast to Text

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

  5. Home · chineking/cola Wiki

    Home · chineking/cola Wiki Home Cola Cola是一个分布式的爬虫框架,用户只需编写几个特定的函数,而无需关注分布式运行的细节.任务会自动分配到多台机器上,整个过程对 ...

  6. mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry &#39;xxx&#39; for key &#39;PRIMARY&#39;

    mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysql ...

  7. 存读Blob Oracle

  8. Windows phone 8 学习笔记(8) 定位地图导航

    原文:Windows phone 8 学习笔记(8) 定位地图导航 Windows phone 8 已经不使用自家的bing地图,新地图控件可以指定制图模式.视图等.bing地图的定位误差比较大,在模 ...

  9. Class ThreadPoolExecutor

    Class ThreadPoolExecutor java.lang.Object java.util.concurrent.AbstractExecutorService java.util.con ...

  10. Sqlite 扩展功能 GET_PHONEBOOK_INDEX

    在联系人数据库设计中遇到了这个函数,晚上找了半天没找到答案. GET_PHONEBOOK_INDEX This function will produce a normalized upper cas ...