实时活动团队十问十答

借助实时活动,你的 App 可以直接在锁定屏幕上提供一目了然的最新信息,例如天气更新动态、飞机出发时间或者再过多长时间晚餐才能送达。更重要的是,得益于 iPhone 14 Pro 和 iPhone 14 Pro Max 上的灵动岛等生动的功能,实时活动还能带来很多乐趣。

Apple 布道师、设计师和工程师在 Ask Apple 活动上齐聚一堂,回答了有关实时活动和灵动岛的问题。以下是这些对话中的一些要点,包括有关实时信息大小和样式、何时关闭实时活动,以及小组件和实时活动为何有时有所不同的指导说明。

如何在不使用 Apple 推送通知服务 (APNs) 的情况下更新实时活动?

你的 App 可以使用既有后台运行时功能 (如“定位服务”) 在你认为合适的情况下提供实时活动更新。对于不太频繁的实时活动更新,你还可以使用 BGProcessingTask 和后台推送来提供更新。请记住,系统不会立即处理这些后台任务。你可以在以下资源中了解更多信息:

Displaying live data with Live Activities

关于何时关闭实时活动,默认设置为 4 小时,这个时间对我的用例来说太长了。在实时活动结束后便关闭的相关准则有哪些?

在结束实时活动时,你可以提供 ActivityUIDismissalPolicy,告知系统何时关闭你的 UI。或者,你可以选择立即关闭实时活动,或者过去特定的一段时间后再关闭实时活动。

有人关闭了实时活动时,我的 App 如何检测到这一情况?

你的 App 应该使用 activityStateUpdates 异步序列来观察每个实时活动的状态变化。

当强制退出 App 时,关联的实时活动会关闭吗?

实时活动的生命周期与主机 App 的进程无关,因此当强制退出 App 时,实时活动将继续运行。小组件扩展的生命周期也是独立的。调用小组件扩展的不同实例来呈现同一实时活动的视图是完全有可能的,因此切勿将任何状态储存在小组件扩展本地。

实时活动和小组件有何不同?

实时活动和小组件都可以随时提供一目了然的信息。实时活动非常适合显示与用户启动的持续性任务有关的情境信息。送餐、体能训练和航班出发时间都是很好的例子。小组件可以提供一目了然且始终相关的信息。待办事项列表、本周的天气预报或者用户在 Apple Watch 上的圆环闭合进度都是很好的例子。

虽然实时活动和小组件都依赖于 WidgetKit 来打造 UI 布局,但是它们的结构略有不同。实时活动是以编程方式更新的单个视图,而小组件则由按时间线排列的预构建视图组成。

是否应该让实时活动尝试更改灵动岛的背景颜色?

当不提供背景颜色或图像时,灵动岛可以带来更令人身临其境的体验 — 可以将它纯粹当作前景视图元素的区域。《Human Interface Guidelines》中提供了更多设计指导。

Human Interface Guidelines: Live Activities

实时活动是否支持交互式按钮?

锁定屏幕和灵动岛上的实时活动不支持交互式按钮或其他控件。在实时活动中添加按钮可能会导致用户误认为他们可以与这个视图交互。因此,应该避免在 UI 中显示类似于按钮的任何内容。

你的 App 才是提供最佳用户体验的地方,因此实时活动上的任何交互都会为用户打开你的 App。实时活动的锁定屏幕画面效果和展开画面效果可能包含你 App 的多个链接,这样你就可以根据实时活动的情境提供不同的目的位置。

实时活动是支持灵动岛的唯一方式吗?

你的 App 可以实现其他系统服务 (如 CallKit 和“播放中”),它们可以在灵动岛中显示相应系统 UI。但是,如果你的 App 想要在灵动岛中提供自身 UI,那么实时活动是唯一的方式。

是否可以向灵动岛中添加动画效果?

虽然实时活动视图中并不支持任意动画,但是你的 App 可以更改实时活动内容的状态过渡。在以下文章的“Animate content updates”(为内容更新添加动画效果) 部分中,了解更多信息。

Displaying live data with Live Activities

在哪里可以找到有关实时活动的更多文档?

ActivityKit 文档提供了有关实现实时活动的大量信息,包括如何使用 APNs 更新和结束实时活动。此外,《Human Interface Guidelines》还针对各种画面效果提供了设计指导和推荐的大小。你还可以在 WWDC22 的 Food Truck 示例项目中获得一些灵感。

Human Interface Guidelines: Live Activities

Displaying live data with Live Activities

Starting and updating Live Activities with ActivityKit push notifications

ActivityKit

WidgetKit