WWDC Quick Look 💓 By SwiftGGTeam
Decipher and deal with common Siri errors

Decipher and deal with common Siri errors

观看原视频

Highlight

这场 session 给出一套定位 Siri 与 Shortcuts 调试问题的最小流程:用 Xcode 预填 Siri 查询、分别附加 Intents 与 Intents UI 进程、检查 10 秒 completion handler 约束,并用设备日志和 os_log 串起多进程时间线。

核心内容

SiriKit 出错时,用户听到的往往只有一句 “Sorry, there was a problem with the app”。这句话对用户有用,对开发者几乎没有信息量。真正的问题可能在 Intents extension、Intents UI extension、宿主进程、completion handler、设备崩溃日志中的任何一处。

Roman 的建议从调试入口开始。不要每次都唤起 Siri、重新说一遍测试短语,再等系统把请求路由到 extension。Xcode 的 scheme editor 可以预先填写 Siri intent query,让同一个请求可重复运行。这样,开发者能把注意力放在断点、日志和执行顺序上。

第二个关键点是进程边界。Intents extension 和 Intents UI extension 是两个独立进程。只附加到 handler 进程时,UI extension 的断点不会被命中;只看一个进程的日志,也容易误判请求到底在哪一步停住。

最后,session 把常见故障收敛成三类检查:completion handler 是否在 10 秒超时前调用、是否只调用了一次、进程是否在请求中途崩溃。再配合 Devices and Simulators 的 device logs、Console.app 过滤 os_log 关键字,就能还原多个进程共同处理一次 Siri 请求的时间线。

详细内容

1. 用 Xcode 预填 Siri 查询

00:19)演讲先从自动化 Siri query 开始。Xcode 的 scheme editor 允许开发者在调试前提供 Siri intent query。这样,调试 Intents extension 时不需要每次手动触发 Siri,也不需要重复朗读同一句话。

调试前固定三件事:
- 要测试的 Siri intent query
- 要附加的 Intents extension
- 宿主进程选择 Siri 或 Shortcuts

关键点:

  • Siri intent query 是本次调试的输入,先固定输入,断点和日志才有可比性。
  • Intents extension 是处理请求的主进程,handler 相关断点应放在这里。
  • 宿主进程可以选择 Siri 或 Shortcuts App,适合比较同一个 intent 在两个入口下的行为差异。

2. 同时附加多个 extension 进程

00:33)当 Xcode 附加到 Intents extension 时,调试器只连接到这个处理进程。Intents UI extension 是另一个进程,所以 UI 断点不会自动命中。Roman 明确建议通过 Xcode debug menu 同时附加多个进程。

一次 Siri 请求可能涉及:
- Siri 或 Shortcuts 宿主进程
- Intents extension
- Intents UI extension

关键点:

  • 处理逻辑和 UI 展示不在同一个进程里运行。
  • handler 断点有效,不代表 UI extension 的断点也会有效。
  • 多进程附加能帮助定位问题发生在请求处理、结果回传还是 UI 呈现阶段。

3. 处理 “problem with the app” 的三项检查

00:57)当 Siri 报出 “Sorry there was a problem with the app” 时,session 没有让开发者先猜错误码,而是给出三个基础检查。

SiriKit 请求失败时先检查:
- completion handler 是否在 10 秒超时前调用
- completion handler 是否只调用一次
- 进程是否在请求中途崩溃

关键点:

  • Intent handling protocol method 的 completion handler 必须在 10 秒 timeout 前调用。
  • completion handler 只能调用一次;重复调用会在进程中抛出异常。
  • 如果进程在请求中途崩溃,Siri 端看到的仍然可能只是通用错误提示。

4. 用 device logs 和 os_log 还原时间线

01:27)Xcode 的 Devices and Simulators 窗口里有 “View Device Logs”。当 SiriKit 请求失败时,先检查相关进程有没有 crash。这个步骤能把“handler 没返回”和“进程已经崩溃”分开。

01:36os_log 适合补齐断点之外的信息。演讲建议在日志前加 emoji 或其他唯一关键字,再用 Console.app 过滤这个关键字,得到所有相关进程的准确事件时间线。

🍲 [Intents extension] <event>
🍲 [Intents UI extension] <event>
🍲 [Siri or Shortcuts host] <event>

关键点:

  • 唯一关键字让 Console.app 只显示本次 SiriKit 调试相关日志。
  • 日志中带上进程名或 extension 名,才能看清多个进程的协作顺序。
  • 记录 completion handler 调用点,可以直接验证是否超时、是否重复调用。

核心启发

  • 做什么:为每个 SiriKit intent 建一组固定调试 query。 为什么值得做:session 的第一步就是把 Siri 查询自动化,固定输入后才能稳定复现断点、日志和崩溃。 怎么开始:把最常见的用户说法整理成测试短语,在 Xcode scheme editor 中逐个配置运行,并记录 Siri 与 Shortcuts 两个宿主进程下的差异。

  • 做什么:把 Intents extension 和 Intents UI extension 分开做断点检查。 为什么值得做:两个 extension 是独立进程,只附加 handler 会漏掉 UI extension 的断点。 怎么开始:在处理方法和 UI 更新入口分别放断点,通过 Xcode debug menu 同时附加两个进程,确认请求从 handler 到 UI 的完整路径。

  • 做什么:给 completion handler 建立运行时保护日志。 为什么值得做:10 秒内未调用、重复调用、请求中途崩溃都会变成 Siri 端的通用错误提示。 怎么开始:在每个 intent handling protocol method 的入口、completion handler 调用前后写入同一个 os_log 关键字,并在日志里记录请求标识和调用次数。

  • 做什么:把 device logs 纳入 SiriKit QA 流程。 为什么值得做:如果 extension 在请求中途崩溃,单看 Siri UI 或断点状态很容易误判。 怎么开始:每次复现 “problem with the app” 后打开 Devices and Simulators,先用 “View Device Logs” 查找 Intents extension 与 Intents UI extension 的 crash,再回到 Console.app 看 os_log 时间线。

关联 Session

评论

GitHub Issues · utterances