WatchKit-Programming-Guide-Apple-Watch开发指南官方翻译及总结

本文是Apple Watch开发指南的官方翻译与总结,介绍了Watch App和WatchKit Extension的构成,以及在watchOS 1和watchOS 2上的区别。强调了Watch app与WatchKit extension协同工作的方式,提到了通知、界面设计、交互处理和资源管理等方面的关键知识点。
摘要由CSDN通过智能技术生成

鉴于CSDN的Markdown很多bug,大家请看这里: WatchKit-Programming-Guide-Apple-Watch开发指南官方翻译及总结

Overview

### Developing for Apple Watch Apple Watch可以让用户以一种很私密,不招摇的样式查看信息(官方文档是这样的哈,但是我想大多数人不会不招摇的查看Apple Watch上的信息��).用户可以在不拿出手机的情况下,通过查看Apple Watch快速的获取重要的信息. Apple Watch Home screen:
![](http://7xpl1c.com1.z0.glb.clouddn.com/AppleWatchHumanInterfaceGuidelineswatch_hero_2x.png?imageMogr2/thumbnail/!100p)

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:
![Target structure in watchOS 1](http://7xpl1c.com1.z0.glb.clouddn.com/AppleWatchHumanInterfaceGuidelinestarget_structure_2x.png?imageMogr2/thumbnail/!100p)

上图描述的是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.
![Target structure in watchOS 1](http://7xpl1c.com1.z0.glb.clouddn.com/WatchKitProgrammingGuideedit_scheme_menu_2x.png?imageMogr2/thumbnail/!100p)
  1. 复制存在Watch app scheme,给这个schem一个合适的名字.比如”Glance - My Watch app”,来这个scheme是用来运行和debugglance的.
  2. 选择scheme editor左侧列表的run.
  3. 在info列,选择和是的可执行scheme.
![Target structure in watchOS 1](http://7xpl1c.com1.z0.glb.clouddn.com/WatchKitProgrammingGuideduplicate_scheme_2x.png?imageMogr2/thumbnail/!100p)
  1. 关闭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:
![Target structure in watchOS 1](http://7xpl1c.com1.z0.glb.clouddn.com/WatchKitProgrammingGuidePushNotificationPayload.apns_2x.png?imageMogr2/thumbnail/!100p)

大多数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文件.

### Watch App Architecture 您的Watch app和WatchKit extension协调工作来显示app界面.在Apple Watch app上的交互会在合适的设备上加载您的WatchKit extension.然后Watch app和WatchKit extension会一同运行界面直到用户停止交互.至于这两部分如何协调工作取决于在watchOS 2还是watchOS 1上运行.下面插图说明了两个版本上Watch app和WatchKit extension是如何工作的.
![Communication between a Watch app and WatchKit extension](http://7xpl1c.com1.z0.glb.clouddn.com/WatchKitProgrammingGuide275E78CC-778A-46B4-A883-B8380B3FE38B.jpg)
#### 界面控制器 每一个scene都被一个WKInterfaceController类型的界面控制器管理.和iOS的viewController类似,它们展示和管理在界面显示的内容和对用户的交互作出反应.但是不同的是,界面控制器不是真正的管理界面而是被WatchKit管理.Watch apps一般包括多个interface controller.每一个界面都显示不同的内容.屏幕上只能显示一个interface controllers.更多信息请看这里: [Interface Navigation](#anchor_InterfaceNavigation) >> 注意: Glance和自定义的通知界面是独立于您的app的interface controller的.详细信息请参考: [Glance Essentials](#anchor_GlanceEssentials)和[Notification Essentials](#anchor_NotificationEssentials). #### Watch App的生命周期 用户交互决定着app的启动和生命周期.可以通过Home screen,glance,自定义UI界面的通知启动您的app,这些方式都能加载您的Watch app并且和WatchKit extension进行通信.Watch app和WatchKit来回的交互信息直到用户停止交互.此时iOS会挂起extension,直到用户的下一次交互.在启动时WatchKit自动的加载适当的storyboard.如果用户浏览的是glance,WatchKit会加载storyboard中的glance场景.如果用户直接启动的是app,watchKit会加载您的app.在场景加载完以后,watchKit会请求WatchKit extension来创建和界面控制器通信的对象.下图是这一系列的步骤,更多信息请看: [UI Essentials](#anchor_UIEssentials).
![Launching a Watch app](http://7xpl1c.com1.z0.glb.clouddn.com/WatchKitProgrammingGuidelaunch_cycle_2x.png?imageMogr2/thumbnail/!50p)

使用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.

![The life cycle of an interface controller](http://7xpl1c.com1.z0.glb.clouddn.com/WatchKitProgrammingGuidewatch_app_lifecycle_simple_2x.png?imageMogr2/thumbnail/!50p)

当用户重启与之配对的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值