Apple Watch开发-初探

系统环境

Mac OS 10.15.6
Xcode 12.4

创建watchOS App

在已有iOS项目中,新建Target,选择Watch App for iOS App

可以选择用Storyboard构建UI,WatchKit App Delegate管理生命周期,也可以选择用SwiftUI构建UI,SwiftUI App管理生命周期。本文选择前者。

完成创建后可以看到,除了我们创建的WatchKit App,还自动创建了一个WatchKit App Extension,目录结构如下

WatchKit App Extension中,默认勾选了Supports Running Without iOS App Installation,即支持脱离iOS App单独运行。(苹果强烈建议)

如果需要依赖iOS App,去掉勾选状态,那么运行Watch App时,会自动打开对应模拟器并将iOS App安装到模拟器中。

启用Complication(默认启用了)

在我们创建Watch App时,Xcode已经默认为我们包含了Complication,如果没有,则需要自己手动启用。

步骤如下:
1、创建ComplicationController并遵循CLKComplicationDataSource协议。

import Foundation
import ClockKit

class ComplicationController: NSObject, CLKComplicationDataSource {

    func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) {
        // TODO: Finish implementing this required method.
    }
}

2、在Extension的Assets目录中为静态占位符图像创建一个组。Assets.xcassets > Add Assets > watchOS > Watch Complication Placeholder

3、最后,在Extension > General > Complications Configuration中设置Data Source ClassComplication Group

Watch App 生命周期

代理对象通过实现WKExtensionDelegate的代理方法来响应App的生命周期事件。

WatchKit通过实例化分配给WatchKit ExtensionInfo.plist文件中的WKExtensionDelegateClassName键的类来自动创建您的委托对象。默认情况下,此类被命名为ExtensionDelegate。然后,系统将委托对象分配给WKExtension单例的delegate属性。

Watch App 的状态及其影响

状态 描述
没有运行 watchOS应用程序未运行。用户尚未启动watchOS应用程序,或者系统已挂起然后清除了该应用程序。
不活跃 watchOS应用程序在前台运行,但未从控件或手势接收操作;但是,它可能正在执行其他代码。新启动的应用程序通常在过渡到活动状态时仅短暂停留在此状态。过渡到此状态的活动应用程序应使其自身安静并准备过渡到后台。
活跃的 watchOS应用程序在前台运行,并接收来自控件和手势的动作。这是屏幕上运行的应用程序的正常模式。
后台 系统为watchOS应用程序提供了少量的后台执行时间。在运行后台会话,执行后台任务以及挂起应用程序之前,系统会为应用程序提供后台执行时间。
由于系统可以清除挂起的应用程序而不会发出警告,因此请使用扩展代理的applicationDidEnterBackground()方法来保存重新创建应用程序当前状态所需的任何数据。如果需要,可以通过调用ProcessInfo类的performExpiringActivity(withReason:using:)方法来请求额外的后台执行时间。
暂停 该应用程序在内存中,但未执行代码。系统会挂起处于后台且没有任何待完成任务的应用程序。系统可以随时清除已暂停的应用程序,以便为其他应用程序腾出空间。该系统以静默方式清除已暂停的应用程序。挂起的应用程序不会唤醒,并且在系统清除它们之前不会收到任何通知。
系统尝试将常用的应用程序保留在内存中,以使其尽快恢复。具体而言,系统保留最近执行的应用程序,Dock中的所有应用程序以及当前活动表盘上具有复杂功能的所有应用程序。如果内存限制迫使系统清除这些应用程序之一,则一旦有更多内存可用,系统就会重新启动该应用程序。

Watch App架构

Watch App 是由 Watch App 和 WatchKit Extension 两个 bundle组成的,且 Watch App 包含了 Storyboard 和一些资源文件,Watch Extension包含了 Watch App的代码和另外的一些资源文件。另外,还可以通过WatchConnectivity框架在 iOS和 WatchOS之间进行通信。

Watch App的生命周期变化

此图说明了 Watch App从启动开始的状态变化,以及WKExtensionDelegate中对应的状态变化的协议方法,当然这与 iOS中AppDelegate的协议方法是类似的。
A: applicationDidFinishLaunching方法被调用。
B: applicationDidBecomeActiveapplicationWillResignActive方法被调用。
C: applicationWillEnterForegroundapplicationDidEnterBackground方法被调用。

WKInterfaceController的生命周期变化

WatchKit中的WKInterfaceControllerWatch App的主控制器,类似iOS中的UIViewController,声明周期也比较类似。但要理解它们本质上的区别,willActivatedidDeactivate只是在激活和失活时触发,与页面显示其实本质上本无关系。

awakeWithContext:类似UIViewController中的viewDidLoad,可在此加载页面数据或初始化页面配置。

willActivate:在准备展示界面时,系统会调用此方法(不保证界面在屏幕上或即将出现在屏幕上),不要在此方法中做执行界面的出事设置,可以做一些页面更新的事情。

didDeactivate:系统会在清理WKInterfaceController的过程中调用此方法,可以在此方法停用计时器或保存App状态信息。

didAppear:当WKInterfaceController显示时,系统会调用此方法,可以在此方法配置动画或其他与界面有关的任务。

willdisappear:系统会在WKInterfaceController即将从屏幕中移除时调用此方法,可以在此方法停止动画或执行其他与界面有关的任务。

用Storyboard构建watchOS应用界面

watchOS应用程序的用户界面使用了简化的,基于堆栈的布局模型。Xcode自动将元素分为水平和垂直堆栈,您可以通过修改元素的属性来微调布局。

在Storyboard中添加控件,Xcode会垂直堆叠它们,每个控件单独一行。

三个按钮垂直堆叠

您也可以使用WKInterfaceGroup创建水平或垂直堆栈,必要时,可以使用“嵌套组”来创建更复杂的布局。

包含水平按钮堆叠的Group

使用属性自定义布局

您可以使用“属性”检查器微调界面元素的大小和布局。所有接口元素都具有以下属性:

Horizontal
配置项目在其容器提供的空间内的水平位置。

Vertical
配置项目在其容器提供的空间内的垂直位置。

Width & Height
确定系统如何计算对象的宽高。此属性具有三个可能的值:
Size to Fit Content:根据对象的内容设置宽高。
Relative to Container:将宽高设置为容器宽高的百分比。
Fixed:设置指定宽高(以pt为单位)。

Groups还提供了其他选项来管理其内容:

Layout
指定Group中项目的布局方向。可以是HorizontalVerticalOverlap

Insets
设置GroupInsets来设置Group与其子元素之间的间隔(以pt为单位)。可以“自定义”其上、下、左、右边缘指定不同的值。

Spacing
设置组中子元素之间的间距(以pt为单位)。默认间距为2pt。

页面跳转方式

WatchKit支持三种样式在watchOS中的场景之间导航。

分页导航Paged navigation
一个分页的界面包含两个或多个独立的界面控制器,在任何给定时间显示一个。默认情况下,用户向左或向右滑动可在场景之间导航。屏幕底部的页面控件显示用户在页面中的当前位置。要切换到垂直分页,请在“属性”检查器中设置接口控制器的“页面方向”属性。

推出导航 Push navigation
推接口从单个根接口控制器开始。当前界面上的控件将新场景推送到屏幕上。同样,您可以弹出回到先前的控制器。推导航对于显示层次结构信息特别有用。例如,当用户从列表中选择一个项目时,您可以推送该项目的详细视图。

模态弹出 Modal Presentations
使用模式演示来中断用户的工作流,以请求输入或显示其他信息。模态表示本身可以由一个屏幕或包含多个屏幕的页面布局组成。

WatchKit还支持几个标准接口,用于收集输入或显示特定类型的信息。要显示这些接口,请使用下面列出的方法:

弹窗警告 Alert and action sheets
使用该方法可显示警报并使用标准界面请求用户输入。presentAlert(withTitle:message:preferredStyle:actions:)

文字输入 Text input
使用该方法接收来自用户的文本输入。此方法为控制器提供了相关的输入选项,其中可能包括预定义的短语,听写和涂抹。presentTextInputController(withSuggestions:allowedInputMode:completion:)

视频和音频播放 Video and audio playback
使用该方法播放音频和视频。presentMediaPlayerController(with:options:completion:)

录音 Audio recording
使用此方法可以显示标准的音频录制界面。presentAudioRecorderController(withOutputURL:preset:options:completion:)

PassKit通行证 PassKit passes
使用该方法显示用于将通行证添加到用户的Apple Watch的界面。presentAddPassesController(withPasses:completion:)

标准界面具有内置按钮,因此用户可以随时将其关闭。许多接口还具有dismiss方法,您可以使用该方法以编程方式关闭接口。界面处于活动状态时,您的应用无法直接控制与该界面的交互。将操作或完成处理程序用于与接口本身相关的任务。

参考资料

watchOS官方文档

WatchOS开发教程之一: Watch App架构及生命周期

WatchOS开发教程之二: 布局适配和系统Icon设计尺寸

WatchOS开发教程之三: 导航方式和控件详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容