Xamarin 中 watchOS 3 的快速交互技术

本文介绍 Apple 在 watchOS 3 中添加的快速交互技术,以及如何在适用于 Apple Watch 的 Xamarin.iOS 中实现它们。

提供快速用户交互对于创建引人注目的 Apple Watch 应用和复杂功能至关重要。 Apple 添加了对手势识别器的支持,使用 Digital Crown 以及新用户通知和导航技术,这是 watchOS 3 的新增功能。 此外,还添加了对 SceneKit 和 SpriteKit 的支持,使开发人员能够轻松创建丰富、一目了然的界面,既快速又灵敏。

什么是快速交互

对于用于为 iOS 或 macOS 创建应用程序的开发人员(用户与应用交互的时间量以分钟或小时为单位),为 Apple Watch 设计成功的应用可能是一项挑战,需要采用不同的方法。

在 watchOS 中,用户通常想要抬起手腕,快速与应用交互(通常只需几秒钟),然后放下手腕,继续他们正在做的事情。

以下是 Apple Watch 上典型快速交互的几个示例:

  • 启动计时器。
  • 检查天气。
  • 标记待办事项列表中的项。

若要实现这些目标,Apple Watch 上的应用必须是:

  • 一目了然 - 这意味着,用户应能够快速查看所需的信息。
  • 可操作 - 这意味着用户应该能够做出快速、明智的决策。
  • 响应 - 这意味着用户不应等待接收所需的信息或达到所需操作。

快速交互长度

由于 Apple Watch 应用的概览性,Apple 建议快速交互的理想长度应为两秒或更短。 由于这两秒的限制,开发人员需要花费相当多的时间设计和实现 Apple Watch 应用。

新的 watchOS 3 功能和 API

Apple 向 WatchKit 添加了多个新功能和 API,以帮助开发人员向其 Apple Watch 应用添加快速交互:

  • watchOS 3 提供对新类型的用户输入的访问权限,例如:
    • 手势识别器
    • Digital Crown 旋转
  • watchOS 3 提供了显示和更新信息的新方法,例如:
    • 增强型表格导航
    • 新的用户通知框架支持
    • SpriteKit 和 SceneKit 集成

通过实现这些新功能,开发人员可以确保其 watchOS 3 应用是一目了然、可操作和响应的。

手势识别器支持

如果开发人员在 iOS 中实现了手势识别器,则应非常熟悉手势识别器在 watchOS 3 中的工作方式。 若要刷新,手势识别器是将低级别触摸事件分析为可识别的预定义手势的对象。

watchOS 3 将支持以下四个手势识别器:

  • 离散手势类型:
    • 轻扫手势 (WKSwipeGestureRecognizer)。
    • 点击手势 (WKTapGestureRecognizer)。
  • 连续手势类型:
    • 平移手势 (WKPanGestureRecognizer)。
    • 长按手势 (WKLongPressGestureRecognizer)。

若要实现其中一个新的手势识别器,只需将其拖到 Xcode 接口生成器中的视图并配置其属性。

在代码中,响应识别器的操作以处理用户触发的手势。 同样,这与在 iOS 中处理的方式相同。

离散手势状态

对于离散手势,当识别手势并分配状态(WKGestureRecognizerState)时,将调用操作:

离散手势状态

所有离散手势都以 Possible 状态开始,并转换为 FailedRecognized 状态。 使用离散手势时,开发人员通常不直接处理状态。 相反,它们依赖于仅识别手势时调用的操作。

连续手势状态

连续手势与离散手势略有不同,其中操作在识别手势时多次调用:

连续手势状态

同样,连续手势开始处于 Possible 状态,但它们会通过多个更新进行。 在这里,开发人员需要考虑识别器的状态,并在 Changed 阶段更新应用的 UI,直到手势最终 RecognizedCanceled

手势识别器用法提示

Apple 在 watchOS 3 中使用手势识别器时建议以下事项:

  • 将手势识别器添加到分组元素而不是单个控件。 由于 Apple Watch 的物理屏幕大小较小,因此组元素往往更大、更方便用户点击的目标。 此外,手势识别器可以与本机 UI 控件中已有的内置手势冲突。
  • 在监视应用的 Storyboard 中设置依赖项关系。
  • 某些手势优先于其他手势类型,例如:
    • 滚动
    • Force Touch

Digital Crown 旋转

通过在 watchOS 3 应用中实现 Digital Crown 支持,开发人员可以为用户提供更高的导航速度和精度交互。

自 watchOS 2 以来,Apple Watch 应用可以通过提供 WKPickerItems 列表和选取器样式(列表、堆积或图像序列)来使用 WKInterfacePicker 对象来访问 Digital Crown。 watchOS 随后允许用户使用 Digital Crown 从列表中选择一个项目。

使用 WKInterfacePicker时,WatchKit 会通过以下方式处理大部分工作:

  • 绘制列表和单个接口元素。
  • 处理 Digital Crown 事件。
  • 选择项目时调用操作。

除了 watchOS 3,开发人员现在可以直接访问 Digital Crown 旋转事件,这样他们就可以创建自己的 UI 元素来响应旋转值。

Digital Crown 访问由以下元素提供:

  • WKCrownSequencer - 提供每秒轮换数的访问权限。
  • WKCrownDelegate - 提供对旋转增量事件的访问权限。

每秒旋转数

使用基于物理的动画时,从 Digital Crown 访问每秒旋转数非常有用。 若要访问每秒旋转数,请使用 Watch 扩展的 WKInterfaceControllerCrownSequencer 属性。 例如:

var rotationsPerSecond = CrownSequencer.RotationsPerSecond;

旋转增量

使用 Digital Crown 中的旋转增量来计算旋转数。 使用 WKCrownDelegateCrownDidRotate 替代方法访问旋转增量。 例如:

using System;
using WatchKit;
using Foundation;

namespace MonkeyWatch.MonkeySeeExtension
{
  public class CrownDelegate : WKCrownDelegate
  {
    #region Computed Properties
    public double AccumulatedRotations { get; set;}
    #endregion

    #region Constructors
    public CrownDelegate ()
    {
    }
    #endregion

    #region Override Methods
    public override void CrownDidRotate (WKCrownSequencer crownSequencer, double rotationalDelta)
    {
      base.CrownDidRotate (crownSequencer, rotationalDelta);

      // Accumulate rotations
      AccumulatedRotations += rotationalDelta;
    }
    #endregion
  }
}

在这里,应用维护一个累加器(AccumulatedRotations),以确定旋转数。 Digital Crown 的一个完整旋转等于累积的增量 1.0,半旋转将是 0.5

Apple 让开发人员自行决定旋转次数如何与正在更新的用户界面元素的变化灵敏度相对应。

旋转增量的符号 (+/-) 指示用户正在旋转 Digital Crown 的方向:

旋转增量的符号指示用户正在旋转 Digital Crown 的方向

如果用户向上滚动,WatchKit 将返回正增量,如果向下滚动,则无论用户穿着手表的方向如何,都会返回负增量。

Digital Crown 焦点

就像任何其他界面元素一样,Digital Crown 具有焦点的概念。 可以根据用户与手表的交互方式,将此焦点从 Digital Crown 转移到其他界面元素。

例如,以下任何控件都可以抢夺 Digital Crown 的焦点:

  • 选取器
  • 滑块
  • 滚动控制器

由开发人员决定其自定义接口元素何时需要成为 Digital Crown 的焦点。 Apple 建议使用新的手势识别器在自定义 UI 元素中获取焦点。

垂直分页

用户在 watchOS 应用中导航表视图的标准方法是滚动到所需的数据片段,点击特定行以显示详细视图,在完成查看详细信息后点击后退按钮,并针对表中感兴趣的任何其他信息重复该过程:

在表和详细信息视图之间移动

除了 watchOS 3,开发人员还可以在其表视图控件上启用垂直分页。 启用此功能后,用户可以滚动以查找表视图行,然后点击该行以查看其详细信息。 但是,他们现在可以向上轻扫以选择表格中的下一行或向下选择上一行(或使用 Digital Crown),所有这些操作都无需首先返回到表格视图:

在表和详细信息视图之间移动,向上和向下轻扫以在其他行之间移动

若要启用此模式,请在 Xcode 中打开 watchOS 应用的情节提要进行编辑,选中“表视图”并选中“垂直详细信息分页”复选框:

选中“垂直详细信息分页”复选框

确保表使用 Segues 显示详细视图并保存对情节提要所做的更改,并返回到 Visual Studio for Mac 进行同步。

开发人员可以使用针对表视图使用以下代码以编程方式将垂直分页参与到特定行:

// Segue into Vertical Paging and select the first row
MenuTable.PerformSegue (0);

使用垂直分页时,开发人员需要注意 WatchKit 会自动处理控制器的预加载,因此,可以在实际显示 UI 之前调用某些控制器生命周期方法。

通知改进

通知是用户在 watchOS 上体验快速交互的主要形式,从第一代 Apple Watch 和 watchOS 1 开始就有了。

典型的通知快速交互如下所示:

  1. 收到新通知时,用户会感受到通知触觉。
  2. 他们举起手腕,查看通知的“短外观”界面。
  3. 如果他们继续保持手腕上升,watchOS 会自动转换为长外观通知界面。

用户可通过多种方式响应通知:

  • 对于明确定义的和呈现的通知,用户将不执行任何操作,只需关闭通知即可。
  • 他们还可以点击“通知”以启动 watchOS 应用。
  • 对于支持自定义操作的通知,用户可以选择其中一个自定义操作。 这些可以是:
    • 前台操作 - 这些操作启动应用以执行该操作。
    • 后台操作 - 始终路由到 watchOS 2 中的 iPhone,但可以路由到 watchOS 3 中的 watchApp。

watchOS 3 的新增功能:

  • 通知在所有平台(iOS、watchOS、tvOS 和 macOS)中使用类似的 API。
  • 可以在 Apple Watch 上安排本地通知。
  • 如果后台通知计划在 Apple Watch 上,则后台通知将路由到应用的扩展。

通知计划和传递

发生以下情况时,用户的 iPhone 通知将转发到 Apple Watch:

  • iPhone 的屏幕已关闭。
  • Apple Watch 处于佩戴状态,并已解锁。

在 watchOS 3 中,本地通知可以安排在 Apple Watch 上,并且仅交付在手表上。 开发人员可以安排相应的 iPhone 通知(如果应用需要)。

通过在 Apple Watch 和 iPhone 版本的通知中包含相同的通知标识符,它会阻止在手表上显示重复的通知。 通知的 Apple Watch 版本将优先于 iPhone 版本。

由于 watchOS 3 使用与 iOS 10 相同的 UINotification API 框架,有关详细信息,请参阅 iOS 10 用户通知框架文档。

使用 SpriteKit 和 SceneKit

除了 watchOS 3,开发人员现在可以在其应用的用户界面设计中使用 SpritKit 和 SceneKit 对象来呈现 2D 和 3D 图形。

添加了两个新的接口类以支持此功能:

  • WKInterfaceSKScene - 用于使用 SpriteKit 2D 图形。
  • WKInterfaceSCNScene - 用于使用 SceneKit 3D 图形。

若要使用这些对象,只需将它们拖到 Xcode 接口生成器的监视应用的情节提要内部的设计图面,并使用属性检查器 对其进行配置。

从此开始,使用 SpriteKit 或 SceneKit 场景的工作方式与 iOS 应用中的工作方式相同。 手表应用将通过调用其中一个 Present 方法来呈现 WKInterfaceSKScene。 对于 SceneKit,只需设置 WKInterfaceSCNScene 对象的 Scene 属性。

可操作的复杂功能

在 watchOS 2 中,Apple 为第三方应用引入了复杂功能。 在 watchOS 3 中,Apple 扩展了开发人员可以在 WatchKit 复杂功能中包含的功能。

此外,更多的内置表盘现在可以包含复杂功能,已经支持复杂功能的现有表盘现在可以包含更多复杂功能。

此外,用户还可以快速向左或向右轻扫,以转换他们在 Apple Watch 上安装的所有表盘。 使用 Apple Watch 配套 iPhone 应用程序上的新图库,用户可以添加和定制新的表盘和任何复杂功能。

由于这些新功能,Apple 建议 Apple Watch 上的每个应用也应该至少包括一个复杂功能,因此,所有本机 Apple Watch 应用现在都有复杂功能。

复杂功能为应用提供以下功能:

  • 由于它们始终显示在表盘上,因此一目了然。
  • watchOS 经常更新复杂功能。 任何在用户当前显示的表面上包含复杂功能的应用程序,每小时至少更新两次。
  • 在用户当前显示的表盘上,任何带有复杂功能的应用都会被保存在内存中,从而使应用快速启动,并提高应用的响应速度。
  • 使用复杂功能,用户可以轻松地在 watchOS 应用中启动特定功能。

概览通知

Apple Watch 上的通知提供了一种出色的可自定义方式,用于快速通知用户事件或新信息,例如传入消息或实现锻炼应用中的目标。

通过使用通知,可向用户快速显示有价值的信息。 在许多情况下,设计良好的通知可以消除用户实际启动应用的必要性。

watchOS 3 的新增功能,现在所有通知都支持:

  • SpriteKit
  • SceneKit
  • 内联视频

使用 SpriteKit 和 SceneKit 增强的 UI

通常,开发人员可能会在提及 SpriteKit 和 SceneKit 时考虑游戏 UI。 但是,SpriteKit 和 SceneKit 都可用于创建包括自定义布局、内容和动画的非游戏 UI,而仅 WatchKit 中就不可能。

例如,来自照片共享应用的用户通知可以使用 SpriteKit 提供丰富的用户体验,方法是包括发布图片的用户以及丰富用户体验的实际图像和其他自定义信息。

此外,SpriteKit 和 SceneKit 都可以与应用用户界面设计中的标准 WatchKit UI 元素混合。

简单导航

watchOS 3 提供了多种方法,开发人员可以简化其 watchOS 应用中的导航,例如新的垂直分页手势识别器支持上面显示的 Digital Crown 旋转功能。

Digital Crown 是 Apple Watch 独有的,可用于多种不同的方法来简化导航。 例如,计时器应用可以使用 Digital Crown 滚动浏览可用的计时器长度。

自定义手势可以为用户提供与手表应用互动的新颖独特方式,还可以用来简化应用导航。

Apple 建议通过查找将 watchOS 3 中添加的所有新的快速交互功能组合在一起,以呈现丰富、简单且快速使用 watchOS 应用界面的方法。

完成快速交互

设计良好的快速交互体验将使用户在完成当前交互后能够放心地放弃手腕(并与应用脱离)。

当手表应用程序与其配套的 iPhone 应用程序进行任何类型的网络连接或共享信息时,这个问题就会变得特别严重。 这往往会导致在交易进行时出现等待指示器,这在快速交互过程中是不可取的。 请参见以下示例:

监视应用执行网络连接并与其配套 iPhone 应用共享信息的关系图

  1. 用户选择要在手表上购买的项目。
  2. 点击购买按钮。
  3. 应用启动网络事务并显示加载指示器。
  4. 一段时间后,交易完成,应用显示购买信息。
  5. 用户放下手腕,脱离应用。

从用户点击购买按钮到交易完成时,他们的手腕抬起看着加载指示器。 为了解决此问题,Apple 建议开发人员应向用户提供即时反馈,而不是显示加载指示器。

使用 Apple 建议的模型,再次查看相同的快速交互:

Apple 建议的模型图

  1. 用户选择要在手表上购买的项目。
  2. 点击购买按钮。
  3. 应用启动网络交易并显示一条消息,指出购买已成功启动。
  4. 用户放下手腕,脱离应用。
  5. 当交易在一段时间后成功完成时,应用会显示一个本地通知,告知用户成功购买。

这次,只要用户点击购买按钮,就会显示一条信息,说明购买已经开始,因此他们可以放心地放下手腕,结束此时的快速互动。 稍后会通知他们在用户通知中事务的成功或失败。 这样,用户只会在进程的“活动”阶段与应用交互。

对于正在执行网络的应用,他们可以使用后台 NSURLSession 来处理与下载任务的网络通信。 这将允许在后台唤醒应用以处理下载的信息。 对于需要后台处理的应用,请使用后台任务断言来处理所需的处理。

快速交互设计提示

由于快速交互的所需长度为两秒或更少,因此开发人员应从设计过程开始时专注于应用的交互设计。 查找可以简化这些交互的区域(使用上述技术),并使用 watchOS 3 的新功能使应用快速响应。

Apple 建议以下各项:

  • 通过向前引入应用最常用的功能来专注于快速交互。
  • 使用复杂功能和用户通知来显示常见特性和功能。
  • 使用 SceneKit 和 SpriteKit 创建丰富、易于浏览的用户界面。
  • 尽可能简化应用中的导航。
  • 永远不要让用户等待,让他们放下手腕,尽快脱离应用。

总结

本文介绍了 Apple 在 watchOS 3 中添加的快速交互技术,以及如何在适用于 Apple Watch 的 Xamarin.iOS 中实现它们。