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. Java 模拟队列(一般队列、双端队列、优先级队列)

    队列: 先进先出,处理类似排队的问题,先排的.先处理,后排的等前面的处理完了,再处理 对于插入和移除操作的时间复杂度都为O(1).从后面插入,从前面移除 双端队列: 即在队列两端都能够insert和r ...

  2. Nginx 进程间通信

    Linux下的IPC非常多,nginx的进程都是有亲缘关系的进程,对于他们的通信我们选择TCP socket进行通信.   TCP socket 用来做进程通信的优点有,   1.socket是文件描 ...

  3. Unity3D ITween!

    percentage +=0.001f; iTween.PutOnPath(gameObject,path,percentage); //You can cause the object to ori ...

  4. 每天进步一点点——Linux磁盘管理LVM与RAID

    转载请注明出处:http://blog.csdn.net/cywosp/article/details/38965799 1. 传统磁盘管理问题 当分区大小不够用时无法扩展其大小,仅仅能通过加入硬盘. ...

  5. Java反射机制小例子

    package com.wjy.main; import java.io.Console; import java.lang.reflect.Constructor; import java.lang ...

  6. Linux 命令学习之dpkg命令详解

    dpkg是一个Debian的一个命令行工具,它可以用来安装.删除.构建和管理Debian的软件包. 下面是它的一些命令解释: 1)安装软件 命令行:dpkg -i <.deb file name ...

  7. pygame系列_箭刺Elephant游戏

    这个游戏原名为:Chimp,我们可以到: http://www.pygame.org/docs/tut/chimp/ChimpLineByLine.html 获取到源码和详细的源码讲解 下面是我对游戏 ...

  8. windows phone (26) ApplicationBar应用程序栏

    原文:windows phone (26) ApplicationBar应用程序栏 在应用程序中,如果需要几个按钮或者菜单来执行一些普通的命令,就应该考虑使用ApplicationBar,因为silv ...

  9. Three.js 3D打印数据模型文件(.STL)载入中

    3DPrint是现在和未来10年度科技产品的主流之中.广泛的. 对于电子商务类3D打印网站.一个主要功能就是商品3D呈现的方式,那是,3D数据可视化技术. HTML5(WebGL)它可以用于构建3D查 ...

  10. Hdu 5073 Galaxy 精度问题

    思路: 其实求解很简单直接说解法,移动K个后 上下的角动量最小,能肯定是相连的(n-k)个,至于为什么 你自己好好想想(easy): 对于一些等质量的质点中心在 所在位置和除以点的个数 average ...