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:36)os_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
- What’s new in SiriKit and Shortcuts — 总览 iOS 14 中 Siri 与 Shortcuts 的紧凑界面,以及 SiriKit intents / Shortcuts 动作的组织方式。
- Empower your intents — 讲解 in-app intent handling、Intents extension 性能,以及如何改进 SiriKit 动作体验。
- Design high quality Siri media interactions — 以媒体播放为例说明如何设计、测试和调试高质量 Siri 语音交互。
- Expand your SiriKit Media Intents to more platforms — 说明 SiriKit Media Intents 在 HomePod、Apple TV 等平台上的接入和结果处理。
- Feature your actions in the Shortcuts app — 说明如何让 App 动作出现在 Shortcuts App、自动化建议和系统推荐入口中。
评论
GitHub Issues · utterances