在最近的西雅图Xcoders 聚会上, Omni Group 的软件工程师 Curt Clifton 介绍了如何进行苹果手表应用的开发。在这次介绍中谈及了手表应用的概念模型,手机和手表之间的数据通信以及应用开发中会遇到一些的挑战。
概念模型
Clifton 提到,在开发过程中需要考虑的第一件事就是:在 WatchKit 1.0 中,代码是运行在一个与 iPhone 手机应用绑定的扩展中的。
手表本身不会运行任何非苹果开发的代码,不过它可以保存图片资源和经过编译的故事板(Storyboard)。此外,也可以动态地生成图片并将其输送至苹果手表,在苹果手表中为这些图片保留了 20MB 的缓存空间,不过根据 Clifton 的经验,这种方式速度很慢并且可靠性不高。
WatchKit 框架目前还相当小,主要由手表上的视图代理类组成。另外,这些类主要提供专用的 setter 方法,没有 getter 方法。
同步选项
由于 iOS 扩展与其宿主应用运行在不同的进程中,两者之间的数据同步就非常关键。因此,Clifton 回顾了目前可用的几种不同的同步机制。
-
NSFileCoordinator: this has been unfortunately ruled out for app↔extension coordination by an Apple technical note
-
NSFileCoordinator :很不幸,在一篇苹果技术说明中,这中方案已经被排除,不再作为应用扩展协作的方式。
-
Groups entitlement and user defaults: pretty easy to setup and use, but it will not notify about changes.
-
共享的 CoreData/SQLite数据库:据 Clifton 介绍,是相当不错的一种机制。
-
种子文件和回调:Clifton 在其示例应用中使用并且更加详细描述的一种解决方案。
- iPhone 宿主应用向共享应用容器中写入一个种子文件,其中承载着某种格式的负载,如 JSON 格式。
- 手表扩展读取数据种子文件,然后在其准备向父应用返回某个用户操作时,会调用 openParentApplication:reply: 方法,将处于后台的宿主应用唤醒。父应用接收到一个回复块,在其准备就绪后,将调用这个回复块。
- 宿主应用可以更新种子文件中的数据然后运行回复块,将新的数据传递给扩展。
- 手表扩展不再需要读取种子文件,它只需要通过回复块就可以在内存中更新其接收到的数据。
在演示的下一部分,Clifton 走查了他的示例应用源代码并向观众演示如何在 Xcode 中进行调试,调试过程类似于任何一个 iOS 8 应用扩展的调试过程。
挑战
这次讨论的最后一个部分是关于开发者将会面临的挑战。
- 如我们之前提到的,WatchKit 只提供 setter 方法,因此第一个挑战就是向未处于活动状态的控制发送命令。这可能会导致数据不一致,可以通过让每个类跟踪其控制状态是活动还是不活动来解决这个问题。在示例应用中,是通过一系列 _updateDisplay* 方法实现的。
- 如果在 Xcode 文件拷贝构建步骤能够拷贝框架,可以在宿主应用和手表扩展之间使用共享的框架。
- 不支持自动布局,可以用从左至右,从上到下填充的组替换;可以用组内加组的方式构建较为复杂的 UI,不过这是一个和自动布局完全不同的模型。
- 最后,现在还不知道手表的通知接口的具体情况,而且如何处理来自于手表的通知也尚不清楚。
可以在 GitHub 上找到 Clifton 的示例应用。
查看英文原文: Developing an Apple Watch App
评论