鉴于CSDN的Markdown很多bug,大家请看这里: WatchKit-Programming-Guide-Apple-Watch开发指南官方翻译及总结
Overview
### Developing for Apple Watch Apple Watch可以让用户以一种很私密,不招摇的样式查看信息(官方文档是这样的哈,但是我想大多数人不会不招摇的查看Apple Watch上的信息��).用户可以在不拿出手机的情况下,通过查看Apple Watch快速的获取重要的信息. Apple Watch Home screen:Apple Watch app由两个独立的部分组成:Watch App和WatchKit Extension.Watch App包含app中所有界面的storyboard和资源文件,WatchKit Extension包括管理这些界面和如何响应用户的交互的代码.这两部分虽然一直都是iOS app的一部分.但是其在WatchOS 1 和WatchOS 2上的配置和安装是不一样的.在WatchOS 2上这两部分都被安装和运行在Watch上.但是在WatchOS 1,app运行在Watch上,WatchKit extension运行在用户的手机上.
在watchOS 1和watchOS 2上使用的技术大部分是一致的.但是每个平台还存在不同的差异.更多信息请参考: watchOS 2 Transition Guide
Watch app和WatchKit extension一起作用来展示app的内容.除了Watch app的界面外,还可以提供一些专门的界面(optional)来展示数据.当然这些界面也是Apple Watch设计的一部分,它们可以更快速的给用户传递重要的信息.
#### The Watch App 当用户从home screen点进来加载的的是Watch app.可以支持一个或多个screen.使用Watch app可以展示能够在Apple Watch上显示的所以内容(一般是iOS app内容的一个小子集).Watch app和WatchKit extension协同工作:Watch app相当于脸:包含所有界面的storyboard和资源文件:WatchKit extension相当于大脑:包含管理内容,如何响应用户的交互和更新界面的代码. 关于如何开发一个Watch App请看这里: [UI Essentials](#anchor_UIEssentials) #### The Glance Interface Glance(optional)是一个只显示您app中最重要信息的界面.顾名思义,glance就给用户快速浏览内容用的.glance不能滚动,整个界面必须是一个单一的screen.glance中的信息是只读的,所以不能包含按钮,switch或者其他可交互的控制.点击glance界面可以跳到您的Watch app.Glance虽然不能单独运行,但是它的安装和您的Watch app安装是分开的.同样glance的storyboard也在Watch app中,其代码配置在WatchKit extension中. 关于如何创建一个glance请看这里: [Glance Essentials](#anchor_GlanceEssentials). #### Custom Interfaces for Local and Remote Notifications Apple Watch和其配对的手机一起工作显示本地或者远程的通知.首先苹果会用最简单的界面–short look–来显示进来的通知,如果用户的动作表面他想进一步了解该信息的话,取而代之的是long look界面,此界面会显示该通知的更多内容.您可以自定义long look的界面,为其添加自定义的图形或者对其数据进行排版.在iOS 8中,Apple Watch对actionable通知进行了动态支持.actionable通知可以为您的通知界面添加相关的动作按钮.比如对于一个约会要求的通知可能包含接受和拒绝选项.当您的iOS app注册了actionable通知后,Apple Watch会自动的为其添加合适的选项.您需要做的就是在WatchKit extension中处理用户的选择. #### Complications Complications(组件)是显示在表面的用于传达重要信息的小元素.当用户查看时间的时候,组件总是显示的.大多数表面支持至少2到3种组件.用户可以自定义要显示哪些组件.关于组件的更多信息和如何实现请看这里: [watchOS 2 Transition Guide](https://developer.apple.com/library/watchos/documentation/General/Conceptual/AppleWatch2TransitionGuide/index.html#//apple_ref/doc/uid/TP40015234) #### Designing Your User Interface Apple Watch本身是比较个性化的,所以需要对其进行特殊的设计.您的界面需要展示重要的信息,能快速导航和交互.这样的界面就意味着您不能单纯的复制iOS app,而是要和其进行互补.关于如何设计Apple Watch的界面请看这里: [Apple Watch Human Interface Guidelines(Watch人机交互指南)官方文档翻译](http://coderlady.com/2015/12/24/Apple%20Watch%20Human%20Interface%20Guidelines/) ### Configuring Your Xcode Project Watch app需要一个存在的iOS app.在您的iOS app配置中需要添加一个新的Watch app target:包括Watch app和WatchKit extension.在AppStore中,这两部分都由您的iOS app管理.Xcode提供的Watch app target包含创建Watch app的所有东西. >> 注意: WatchKit需要iOS8.2以上的SDK. #### 在现有的iOS项目添加Watch App 创建Watch App必须要有iOS项目.Watch app部署在一个单独的target上,会和您的iOS app一起built和打包.在现有iOS app上添加一个Watch app步骤: 1. 用Xcode打开iOS工程. 2. 选择 File > New > Target,选择Apple Watch部分. 3. 选择WatchKit App点击next. 4. 如果您打算实现glance或者自定义通知界面,选择相应的选项.对于通知界面,即使您不打算马上实现也建议您勾选Notification Scene选项.因为该选项会为您的项目添加一个额外的debug界面,否则以后您就只能手动添加了. 5. 点击finish.Xcode会为您的Watch app和WatchKit extension添加需要的文件到iOS项目中. bundle IDs会自动基于您iOS项目的 bundle ID进行配置,这三个的bundle ID必须一致,如果您更改了iOS项目的bundle ID,相应的必须对Watch app和WatchKit extension的bundle ID进行修改. #### App Target结构 添加一个Watch app target会创建两个新的可执行文件并且会更新您项目的依赖.iOS项目bulid的时候会创建三个可执行文件(the iOS app, WatchKit extension, and Watch app)并且会把它们一起打包. Target structure in watchOS 1:上图描述的是iOS app和WatchKit可执行文件的结构.Watch app会打包进您的WatchKit extension,而WatchKit extension又会打包进iOS app中.当用户在手机上安装iOS app的时候,如果有和手机配对的Apple Watch,系统会提示用户安装Watch app.如果用户同意安装,iOS会自动的对其安装.
#### Build, Run, and Debug阶段Xcode还会为Watch app的bulid和debug单独的创建一个build scheme. 当创建Watch app target的时候,Xcode会自动的配置一个build scheme来运行和debug您的Watch app.使用这个scheme可以让您的项目在iOS模拟器或真机上运行.对于包含glance和自定义通知界面的app,您必须配置额外的build schemes来对这些界面进行测试.使用glance scheme在模拟器上来debug您的glance界面,或者使用notification scheme来测试动态和静态的通知界面. 配置自定义为glances和notifications创建build schemes: 1. 选中存在的Watch app scheme. 2. 在scheme菜单中选择Edit Scheme.
- 复制存在Watch app scheme,给这个schem一个合适的名字.比如”Glance - My Watch app”,来这个scheme是用来运行和debugglance的.
- 选择scheme editor左侧列表的run.
- 在info列,选择和是的可执行scheme.
- 关闭scheme编辑器来保持修改.
当您为您的通知界面创建一个build scheme的时候,在测试的时候指定一个JSON文件来作为通知的payload.更多信息请看这里:Specify a Notification Payload for Testing
#### 测试指定通知的负载 当在模拟器上debug自定义的通知界面是时候,可以为要加载的数据指定一个用来测试的JSON文件.使用scheme编辑器来指定您想要运行的通知界面的payload.这个payload本身是一个后缀名为.apns的文件. >> 当创建Watch app target的时候如果您勾选了Notification Scene选项,Xcode会自动提供用于测试的 PushNotificationPayload.apns文件(这个文件在WatchKit extension的Supporting Files里面).您也可以稍后自己创建. PushNotificationPayload.apns文件包含您需要模拟的远程通知的大多数key.如果需要您也可以添加更多的key.下图就是JSON文件的格式: A simulated remote notification payload:
大多数JSON数据以字典的形式打包并且在运行时提交给您的代码.因为模拟器不能访问iOS app的注册actions.所以您要使用payload文件来指定您界面的action button.WatchKit的模拟器Actions key包含一个字典数组,每一个字典代表一个加到您界面上的action button.每一个字典包含以下几种key:
* title(required): action button的title.
* identifier(required): value是一个传给界面控制器application:handleActionWithIdentifier:forLocalNotification:completionHandler: 或者 application:handleActionWithIdentifier:forRemoteNotification:completionHandler: 方法的string.
* destructive(optional): value是0或1.1代表这个按钮是一个破坏性动作(和action sheet的红色按钮类似).
用合适的JSON payload配置好build scheme来测试您的通知界面.当您选择一个执行的通知界面的时候,Xcode会为您选择的payload文件添加一个menu.您可用为不同通知的payload创建不同的build scheme,或者在测试之前为一个存在的build scheme更新不同的payload文件.
使用interface controller的init和awakeWithContext: 方法来加载需要的数据,把这些值赋给您的界面元素为界面的显示做准备.不要使用 willActivate来初始化您的interface controller.这个方法是用来在界面将要出现在屏幕上时做最后一刻的改变.在watchOS 2, WatchKit会调用didAppear方法来让您知道界面是否真正的显示在屏幕上.当界面显示在屏幕上的时候,您界面控制器的自定义方法来处理用户的操作.
注意: glance界面不支持交互.tap glance界面只能加载您的app.
只有当用户和Apple Watch上的app进行交互时WatchKit extension才会一直运行.在Apple Watch上的交互必须精简.所以界面控制器必须轻量级,所以不要运行长时间跑的任务.当用户离开了或者停止和app交互的时候,iOS会deactivates当前的界面控制器,最终挂起您的extension.
当用户重启与之配对的iPhone的时候,在第一次锁屏之前,一些Watch app可能不能使用(在watchOS 1上这些app甚至不会运行).watchOS 2在没锁屏之前能够运行,但是不能和iPhone进行通信.
#### 在模拟器上测试 测试的时候,您可以通过锁屏和解锁模拟器来测试您的代码在activation和deactivation状态是不是正确的运行.当您在Hardware > Lock,锁定模拟器是时候,WatchKit会调用当前界面控制器的didDeactivate方法.当解锁模拟器的时候,WatchKit会调用didDeactivate方法. #### 和iOS app共享数据 在watchOS 1,iOS app和WatchKit extension使用app group来存储共同的数据文件.app group是线程安全的.一般的,每一个进程在其单独的沙盒环境中运行,但是app group可以让两个进程共用一个目录,并且能共享文件和user defaults. >> 注意: 在watchOS 2,iOS app and WatchKit extension通过Watch Connectivity framework 进行通信.WatchKit extension可能仍然使用app group来和与之通信的Watch app来共享媒体文件.关于watchOS 2上进程之间的通信请看这里: [watchOS 2 Transition Guide](https://developer.apple.com/library/watchos/documentation/General/Conceptual/AppleWatch2TransitionGuide/index.html#//apple_ref/doc/uid/TP40015234). #### 和iOS app进行通信 在watchOS 2,WatchKit extension使用Watch Connectivity framework和其父iOS app进行通信.这个framework支持在两个进程间传递文件和字典数据提供双向通信.这个framework还支持后台发送数据以便在启动的时候等待其他app. >> 注意: 在watchOS 1,使用openParentApplication:reply: 来请求和父iOS app进行通信并且不一定能接受到相应(用这个方法来给iOS app发送请求,使用NSProcessInfo的 performExpiringActivityWithReason:usingBlock: 方法来防止WatchKit extension在发送消息或收到反馈之前deactivated ).iOS app delegate必须要实现 application:handleWatchKitExtensionRequest:reply: 方法来接收信息并作出反馈.关于Watch Connectivity framework更多信息请看这里: [watchOS 2 Transition Guide](https://developer.apple.com/library/watchos/documentation/General/Conceptual/AppleWatch2TransitionGuide/index.html#//apple_ref/doc/uid/TP40015234). ### Leveraging iOS Technologies watchOS 1的WatchKit可以使用iOS app中的技术,因为它是iOS app的扩展.但一些技术可能被限制并且不推荐使用一些第三方的技术.下面是一些参考: * 该技术必须在iPhone上被允许使用: 当使用一些特殊的系统技术的时候,比如说地理位置,必须要获取用户的允许.在WatchKit extension上使用这些技术的时候会在iPhone上触发请求用户允许的弹框.Apple Watch也会显示一个弹框让用户在iPhone上查看该许可请求.关于需要获取用户许可的技术请在[App Programming Guide for iOS]中查看 “Supporting User Privacy”部分. * 不要在后台运行: Watch apps是前台运行的因为只有当用户与之交互的时候Watch apps才会运行.因此WatchKit extension不能在后台执行任务. * 不要运行耗时的任务: 当用户不和watch app交互的时候,WatchKit extension会很快的被挂起.因为Watch app的交互都很简短,所以在一个耗时任务还没完成之前,extension很可能就被完全的挂起了. 对于耗时的任务,最好的办法就是让iOS app运行.比如说定位,可以在iOS app上开始,在extension上实时更新.您的iOS app采集需要的数据然后放到app group中,然后您的extension就能访问这些数据了.关于iOS app和WatchKit extension如何通信,请看这里: [Communicating