实时活动&灵动岛&锁屏小组件 相关问题集锦

搬运自 Ask Apple-2022-12-13

关于锁屏小组件、实时活动与灵动岛的开发文档以及人机交互指南,大家可以参阅以下链接:

3 个赞

如果不用远程推送的方式,如何在灵动岛上更新内容的最合适呢?我需要展示一些基于时间的内容,但不使用Timer视图。

你的 App 可以使用现有的后台模式来更新实时活动,比如后台定位。
另外也可以使用 BGProcessingTask 来提供间歇性的更新。但请注意,这种后台任务不会立刻被系统执行。

dismissalPolicy: .after(futureDate) 看起来会立刻隐藏灵动岛视图,但锁屏视图会按预期留下来。这是已知问题么?

这是符合预期的。在一个实时活动结束的时候,灵动岛视图总是会立刻消失,锁屏界面会根据你提供的参数来决定如何继续保持显示。

Live Activities 设计问题:当只有一个 Live Activity 正在进行时,灵动岛的展示一般是左侧图标右侧文字,但我们希望提供的 Live Activity 只有一个文字信息,我可以设计一个 Live Activity,在 Compact 时只提供 Leading 或者 Trailing 的 View 吗?这时候我应该把内容放在 Leading 还是 Trailing 更符合设计规范呢?

在技术实现方面,Compact 状态必须同时提供 Leading 和 Trailing 两个 view,但你可以通过自定义视图内容的方式来实现你想要的效果。
另外从设计角度上看,要有效利用灵动岛来实现 app 的信息展示,最优方式仍是充分利用两部分空间进行呈现。但是根据 app 的特定设计需求,如果只利用其中某个部分,那么需要考虑和注意的包括:

  • Leading or Trailing:Leading 位之所以是 Leading 位,因为它符合特定语言情境下的优先阅读方向,因此建议优先利用 Leading 位来呈现信息。
  • 同时要考虑到 Compact 状态与 Minimal 及扩展状态(包括锁屏状态视图)的衔接过渡,综合考量该信息在三种状态当中的布局需求,尽可能保持在同侧,便于平滑过渡。
1 个赞

为了确保用户不会看到过期信息,用什么方式来更新实时活动/灵动岛最可靠呢?

这取决于你的数据来自哪里。你可以使用 API 从你的 App 本地更新数据,也可以使用 APNs 从服务器推送数据过来。

请问是否可以设计成:当灵动到激活的时候,锁屏界面不做 Live Activities,只制作解锁后的灵动岛功能?

不可以哦。Live Activities 同时包含锁屏视图和灵动岛,需要二者同时实现。

实时活动上可以使用自定义字体么?在 SwiftUI 预览里都可以正常运行,但当我在 App 里启动一个实时活动时,在 Console.app 里出现了 ChronoKit.RequestCompletionOperation.Error.archiveTooLarge 的错误日志。我尝试了多个不同的字体,即使是小至 ~109KB 的 TTF 文件,也总是会发生这个错误。
我在开发中论坛里发布了更多细节:Use a Custom Font in a Live Activi… | Apple Developer Forums

这个自定义字体相关的 archiveTooLarge 错误是一个已知问题。我们目前无法分享更多信息,但可以确定的是自定义字体是预期中可以支持的。

Live Activity 在 update 时传入的 alert 参数在有灵动岛的设备、没有灵动岛的设备、锁屏、解锁时分别会有怎么样的效果?什么情况下会在 Apple Watch 收到 Alert?
文档中提到 It could also use the update(using:alertConfiguration:) function to display an alert on iPhone and Apple Watch that tells a person about new Live Activity content as shown。但没有说是怎么样的 Alert。在测试时,不同版本的 beta 表现也不太一样,一直没搞懂预期结果应该是怎么样的。

只要在 update 时传入 alert 参数,就意味着你希望以显性的方式提醒用户。此时,

  • 在灵动岛上,会展开 Live Activity
  • 在没有灵动岛的设备上,会将锁屏视图从屏幕上方显示出来
  • 锁屏上会点亮屏幕并更新 Live Activity 卡片
  • Apple Watch上会出现提醒,提醒的文案来自 alert 对象里的 title 和 body

关于 alert 参数的说明,可以参考 AlertConfiguration
一般来讲我们可以以最新的 beta 版本表现为准,但如果发现有明显异常的现象欢迎通过 Feedback Assistant 来进行反馈。

请问「锁屏上会点亮屏幕并更新 Live Activity 卡片」指的是在手机在锁定黑屏或者息屏状态会亮起么?
Alert 配置的声音和通知的声音一样,在静音状态下不会播放么?

是的。锁屏上会从息屏状态亮起。声音和通知类似,而且也可以自定义声音,或者设置为静音通知哦。

可以在灵动岛上使用动画么?

无论是在锁屏还是在灵动岛上,实时活动上都不支持使用自定义动画。然而,从当前到下一个内容的转换动画是支持的,在 ActivityKit 开发文档的“Animate content updates”章节中有提到。
https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities

Live Activity 中可以显示动画吗,比如实现系统播放音乐时的 Live Activity 中的波形图这种效果。目前只能通过触发 update 更新内容来实现动画。但应用进入后台以后 update 就会中止了。

不能使用自定义动画,除了在数据更新的时候系统自动执行的转换动画,只能使用基于时间的原生控件动画,比如Text的.timer
在应用进入后台之后,需要让你的 app 使用后台运行模式,来持续在后台为 Live Activity 进行更新。如果你的 app 不支持后台模式,就需要通过 APNs 来推送更新。

当 App 被杀退的时候,相关的实时活动/灵动岛是否也会被杀退?

实时活动的生命周期不等同于宿主 App 的进程,所以当 App 被杀退时它们也还是会继续存活。

小组件和实时活动的生命周期有多大的关联?它们之间的差异是什么?

首先,它们非常不同。
小组件是预先构建的时间线。我们先获取时间线,并且根据时间的推进,展示时间线上的不同条目。当被告知要重载小组件,或者在一个时间线结束时,我们会去执行这一次重载(同时取决于当前小组件的重载预算)。
实时活动是一个单一视图。当接收到一个更新时,我们会去请求一个新的视图。我们只在收到更新时才会去获取新视图,并且不会对实时活动的重载进行预算限制(虽然也还是会对一些高优先级的推送进行预算限制)。
然而,它们又比较相似。
如果 UI 环境发生变化,我们都会为小组件和实时活动获取更新。例如,设备切换了地区、文字大小。
对于小组件和实时活动来说,扩展进程的生命周期都是一样的。

由于实时活动和小组件共享相同的 WidgetKit 设置,是否允许在 widget extension 中提前计划一个后台下载任务以及使用 onBackgroundURLSessionEvents 呢?

实时活动和小组件的运行时是不同的。实时活动不能自己提前计划一个后台下载任务或者访问网络。

实时活动支持在视图中控制功能的按钮么?例如静音通话、结束通话。

实时活动在锁屏和灵动岛上不提供这些交互按钮或控件。因此,你要避免在界面上显示类似于按钮的视图。这在人机交互指南中也有提及。
另外,可以在你的 App 中提供对应的功能。在通过 deep links 打开 App 后来执行对应操作。

自己的app可以实现类似系统音乐播放时的灵动岛吗,在app进入到后台的时候也能实时刷新播放进度和当前歌词,点击灵动岛交互也可以不进入到app交互吗?

在 Live Activities 的视图上,无论是灵动岛还是锁屏,都无法直接进行控制交互,点击后都会直接打开 app。
对于音乐类的 app,我们建议直接利用 Now Playing information center 来让系统自动适配灵动岛上的媒体播放功能。并且如果你的 app 仅支持 audio 类型的后台运行模式,是无法让 app 在后台对 Live Activity 进行更新的。

对于实时活动的锁屏视图来说,是否有首选的背景可以使用?默认情况下,它们使用像通知一样的半透明背景,但我看到所有来自 Apple 的案例(计时器,棒球篮球比分、公交打车、星巴克耐克这些实时活动的截图)都使用了实色背景——白色、黑色或者其他一种颜色。
我知道人机交互指南上提到“在锁屏上使用自定义背景颜色和透明度之前要仔细考虑”。对于是使用实色(设置为系统背景色)还是半透明,是否有指导意见呢?谢谢!

你可以使用 .activityBackgroundTint() 来设置锁屏视图的自定义背景。如果需要实色背景就直接使用一个实色,如果需要半透明,就给这个颜色设置一个透明度。
注意,如果你使用实色背景,无法保证你的界面和用户的墙纸形成最佳的对比度。强烈建议你在多种背景和墙纸下进行测试。
另外,每个 App 都是不同的,所以我们不会为每一种案例规定背景风格。

是否会有关于锁屏小组件的设计文档?我已经在第三方 app 中看到很多不一致的设计方式,我自己也时常感到困惑。例如对于矩形小组件来说,内容文本应该由顶部/左对齐,还是可以纵向/横向居中对齐?系统自带小组件的字号是多少?在圆环当中,我应该用多大的 SF Symbols?

这里提到了大家都很关心的问题:是否会为锁屏小组件提供设计文档?Good news:设计文档的编辑工作正在进行过程中。
锁屏小组件的设计文档仍在进行当中,并且对于上述这些问题都能予以答复。关于矩形小组件的文本对齐方式,是的,顶部/左对齐通常是最为推荐的方式,但有时也会取决于具体的内容本身,例如某些数据格式本身可能就需要居中对齐。

现在能看到有一些 app 会把锁屏小组件单纯作为一种快捷入口。从设计的角度,这是锁屏小组件的初衷吗?另外,如果 app 中的关键信息确实很难通过这么小的空间呈现出来,那么应该考虑仅提供入口吗,或是可以尝试进一步提炼出更适合的内容来展示?

我们不鼓励这种仅将锁屏小组件作为 app 快捷入口的设计思路。小组件的目标是让用户在一瞥之间快速获取关键的信息,而点击小组件的交互动作应该成为次要操作,而非用户获取信息的必要操作。譬如,应该让用户在锁屏上就可以获取当前的气温信息,而通过点击进入 app,可以了解到更多的详情。这里的交互动作应该是不必要的,只有当用户有进一步了解详情的诉求时才需要进行操作。

我们有一款名语励志类型的 app,我们试着在锁屏小组件里展示名语,但有些句子确实太长了。请问你们是否推荐将句子截断,让用户点击进入 app 查看完整的句子,还是更推荐将字号变得足够小到可以展示完整的句子?或者小组件里的内容能否实现局部滚屏?

你确实可以在一定范围内尝试缩小字号,不过也要记得这些文本很可能被放置在比较复杂的锁屏背景或墙纸之上。总体上讲,我们建议尽可能保持文本内容的简短易获取,而非将字号缩小到足够显示更多内容。另外,对于名语警句这类内容,建议考虑在锁屏小组件中进行适度编辑调整,例如提供简短版本,而非依赖系统自动裁切。另外,小组件中不支持任何手动或自动的局部滚屏交互。

关于如何设计一款卓越的锁屏小组件,是否可以给到一些具体的设计建议?

由于可用空间非常狭小,用户需要在一瞥之间获取到的关键信息必须尽可能呈现于主要位置。确保你的小组件在视觉外观上尽可能与系统或其他 app 的小组件保持统一,但与此同时,也仍然可以尝试结合自己产品的视觉风格。例如,Apple “新闻” app 会在小组件中使用特定的字体样式,对应着 app 内的文章标题字体;“提醒事项“小组件中,代表未完成任务的“空心圆“同样是一种标志性的视觉线索。另外在需要图标时,尽可能使用 SF Symbols。

灵动岛扩展态可以承载的媒体内容或交互操作的复杂程度是怎样的?譬如直播视频对于灵动岛的上下文来说会不会太重了?

直播视频是OK的,只要其尺寸可以良好适配灵动岛的形状且易于观看。视频内容应该与实时活动直接相关,否则应该考虑使用画中画相关功能。
而播放相关的控制按钮则无法在灵动岛上提供支持,除非是点击后直接通过 deep link 进入 app 的按钮。