ARTICLE · 1029263
iOS 27 上,代码全绿,Siri 却不认你的 App 了
只是语音识别准了一点
苹果把 Siri 的脑子
做成了可插拔的
四件事 · 两个坑 · 五个前提条件 · 一份共学笔记
码蜂奶爸 · 采技术之蜜,酿成长之糖
📦 5 Parts + Conclusion
👉 滑动
PART 01
事实层
发了什么
PART 03
四件事
今天就能改
PART 04
两个坑
先别碰
PART ///
写在最后
奶爸悟
这篇的立场,一句话
脑子可以换,你 App 的意图定义不能换
如果你手上还有 SiriKit 的代码,先记住一件事:它在 iOS 27 下照样能编译。
Xcode 只抛个弃用警告,模拟器照跑,CI 全绿,打包上架一路绿灯。然后它在那些升了 iOS 27 的用户手机上,悄没声地就不工作了。不报错、不闪退,就是喊了没反应。
这不是我的猜测,是这次架构调整的直接结果。
先把我的位置说清楚。App Intents 这东西,我一行没写过,手上的几个老工程也一个字没改。所以这篇不是“我踩了多少坑”的实战复盘,我没那个资格。它更像一份共学笔记:我把苹果的开发者文档、WWDC 那几场 session,还有这两天冒出来的一堆分析翻了一遍,把看懂的、没看懂但觉得重要的、以及我自己差点看漏的,摊开来跟你对一遍。
先给一句结论:这次不是语音识别准了一点,是架构换了。架构一换,接在上面的东西就得重新想一遍。
01
PART
9 月 14 日,苹果到底发了什么
FACTS · 不吹,只摆事实
事实先摆出来。苹果在美西时间 9 月 14 日放出 iOS 27 正式版,北京这边收到推送是 9 月 15 日凌晨。能升级的机型从 iPhone 11 系列和 iPhone SE 第二代起步,这个范围其实不小。
但能升级,和能用上新 Siri,是两件事:
它是测试状态
新版 Siri(苹果官方叫 Siri AI)随 iOS 27 上线,但要手动进设置开启,一部分人还得排队等名额,等多久不确定。
硬件门槛在 15 Pro 起步
iPhone 15 Pro、15 Pro Max、iPhone 16 系列及以后和 iPhone Air;iPad 和 Mac 要 M1 及以上。
眼下只有英文
设备语言和 Siri 语言都得是英文。苹果说 10 月加法语、日语、韩语、葡萄牙语、西班牙语。
地区上还有缺口
中国大陆的 Apple 账号目前不在支持范围,苹果的说法是要先满足监管要求;欧盟的 iPhone、iPad 和 Apple Watch 初期也用不上。
云端功能有每日上限
调用云端模型的功能有每日频次上限,苹果说后面会出付费扩容。
一句话:能升 iOS 27 的机器很多,真正能把新 Siri 喊醒的,是几代之后的那几款。
苹果列了四条能力,我按看懂和动手分成两组
个人上下文理解,翻你的信息、邮件、照片
世界知识加联网检索,通用问题它自己去找答案
屏幕内容感知,看懂你眼前那一屏
跨应用系统级操作,直接替你把事办了
前三条是看懂,第四条是动手。分界线就在第四条:Siri 从“告诉你去哪吃”,变成了“帮你把桌子订了”。
然后是换脑子这件事。苹果确认过,这一代 Siri 的基座模型是跟谷歌合作、用 Gemini 参与训练出来的,具体商业条款没有公开。这里有个容易传歪的点得掰一下:Gemini 是在训练环节参与的,不代表你每次说话都在调谷歌的模型。苹果自己的说法是分层架构:简单的请求留在手机本地,中等和复杂的走它的私有云计算,全程经过它自己的基础设施,个人数据不保留、端侧模型里也没有 Gemini 代码。
这些是苹果和媒体的口径,我没法验证到那么底层。但有一点是清楚的:对你来说,换脑子不是一次升级,是一道新题。你的 App 得先能被看懂,才谈得上被调用。
02
PART
先说最容易被忽略的那件事
THE QUIET BREAK · 安静地失效
SiriKit 在 WWDC 2026(6 月 8 日)进入弃用期,苹果把第三方接入 Siri 的路径统一到了 App Intents。
这件事本身不新鲜,写的人也不少。但有个细节,我觉得比“要迁移了”重要得多。
弃用不等于移除。你原来的代码不动,Xcode 不会给你报错——编译器只负责语法,管不了苹果服务器那边还认不认。
可新 Siri 的意图解析,已经不认 SiriKit 了。所以你会在两个地方同时看到绿灯:CI 是绿的,用户那边是黑的。
程序员最该警惕的不是报错,是安静
报错至少告诉你哪里不对,安静是你以为它对。
所以第一件事不是“什么时候迁移”,是先去数一数:你手上还有几个 SiriKit 意图,哪些是用户真在用的。
03
PART
今天就能动手改的四件事
FOUR MOVES · 不用等
让动作接得住追问
iOS 27 的 App Intents 支持多轮追问。这话听着像个小功能,其实改的是参数设计。
用户的说法很少一次说全。他先说“记一次跳绳”,你想确认多少下,他再补一句“改成 200”。以前那种一句话没说全就失败的设计,在这里体验会很难看。参数得支持增量修正,而不是让用户从头重说一遍。
长任务要边算边回
旧模型是一发一收:perform() 跑完,返回结果,Siri 弹一张卡片。设个闹钟够用。
但只要动作超过一秒,搜东西、跑导出、等接口,用户看到的就是一片沉默。人对沉默的耐心,比我们想的短得多:看到“还在处理”会等,看到没反应会以为坏了,然后退出去点 App。
iOS 27 给了流式响应,长任务可以边算边回。任何一个可能超过一秒的动作,都值得接上。
用 View Annotations 把界面内容开放出去
这是这次最值得琢磨的新东西。它做的事是把你界面上的元素和 App Entity 对上号,用户说“把这个存一下”“第三行删掉”,Siri 得知道“这个”和“第三行”指的是谁。
苹果在 session 里说得很直白:无障碍质量和 Siri 集成,现在是同一件工程。你的界面能被读屏正确描述,那你离被 Siri 正确理解就不远了。
反过来说,如果“这个”“那个”在你的界面上一直指不明白,Siri 就会很自信地做错事,这比不做更糟。
守住三条线,别把 Siri 当唯一入口
苹果给的方向是三个词:bounded(边界明确)、observable(完成可观测)、recoverable(重试安全)。翻成我们自己的话:
边界明确
一步能干完,不依赖跳界面,参数有上下界。
完成可观测
做完有明确结果,能让 Siri 复述给用户听。
重试安全
重复调用不会记两笔账,也就是幂等。
还有一条是我自己加的:永远保留 App 内的原路径兜底。后面那五个前提条件,随时可能有一个不成立,把语音入口当唯一入口,是给自己埋雷。
一个最小例子:
import AppIntents
struct LogRopeIntent: AppIntent {
// 边界明确:不跳界面,后台就能干完
static let openAppWhenRun: Bool = false
@Parameter(title: "次数")
var count: Int
func perform() async throws -> some IntentResult & ProvidesDialog & ReturnsValue<Int> {
// 校验放在 App 内,不指望 Siri 帮你守边界
guard count > 0, count <= 10000 else { throw RopeError.outOfRange }
let total = try await RopeStore.shared.add(count: count)
// 完成可观测:回传累计值,让 Siri 有话说
return .result(value: total, dialog: "记下了,今天累计 \(total) 次。")
}
}
!踩坑提示 🕳
迁移别当成直译。Xcode 27 里提供了把 SiriKit 意图转成 App Intents 的迁移工具,能把原来的 .intentdefinition 转出 Swift 结构,但参数映射和里面的逻辑还得自己过一遍。三个错最集中:意图名一比一搬过来,Siri 解析起来很别扭;一口气注册几十个意图,助手猜错的机会变多;只在老机型上测,老机型根本跑不出屏幕感知和多轮追问。
04
PART
两个先别碰的坑
TWO TRAPS · 现在动手会白干
坑一:模型可替换这件事,别把架构押上去
WWDC 上苹果展示过第三方模型接进 Siri 的方向,思路大概是让你的模型以扩展的形式出现在 Siri 里。
但面向开发者的那条关键权限,模型委派,目前没有开放:开发者后台里找不到,官方文档里也没有对应的授权说明。
什么时候算真能用?我盯三个信号:苹果在开发者 session 或下一届 WWDC 正式官宣、App Intents 官方文档里出现对应的 entitlement、开发者后台出现这个权限项。
三个都亮之前,别急着改架构。你该做的是把自己那层做扎实,意图定义、授权边界、埋点。反正按这个设计,模型本来就是可替换的零件,等它开放了再换不迟。
一句话记法:没在官方文档里出现的权限,约等于不存在。别拿演示当接口。
坑二:别把能不能用 Siri 写成系统版本判断
这个坑最不显眼,但最容易踩。我猜很多人下意识会这么写:
// 反面教材
if #available(iOS 27, *) {
siriEnabled = true
}
iOS 27 只是最低门槛,它一点都不代表用户能用上。真正决定入口该不该出现的是五个条件:
设备型号,15 Pro 起步
设备语言和 Siri 语言都是英文
Apple 账号所在地区,中国大陆目前不在支持范围,欧盟的 iPhone、iPad 和 Apple Watch 初期也不支持
等待名单状态,开了也不一定有,要排队
联网状态和服务侧状态
五个都成立,再叠上你自己的灰度开关,才轮到显示入口。
顺便提一句:写降级逻辑的时候提前想一步。如果你的入口只挂在 Siri 上,那中国大陆和欧盟的用户打开你的 App,看到的会是什么?每个入口,都得有一个没有 Siri 也走得通的版本。
05
PART
一张可以照着勾的自查清单
CHECKLIST · 13 个问题
我把上面四件事整理成了 13 个问题,动手之前先勾一遍:
意图是单步能完成的吗
不跳界面能跑完吗
参数有上下界吗
授权是在 App 内强制的吗
失败能复述给用户听吗
重试安全吗,也就是幂等做了没
完成状态可观测吗
有埋点吗
有 App 内的兜底路径吗
短语覆盖中英文了吗
五个可用性条件都判断了吗
中国大陆和欧盟的降级逻辑写了吗
没去碰那个还没开放的模型委派权限吧
第 13 条最容易跳过,也是我唯一想加粗的一条。
///
LAST
写在最后
THOUGHTS · 一点收尾
这件事拆到最后,其实就一句话:苹果把脑子做成了可替换的零件,但零件能换,规矩不能换。你 App 里的意图定义、授权边界、可观测性,这些是你自己的资产。
我拿它对照过给孩子报班这件事。给娃报个班,老师是可以换的,不合适就换一个,孩子不会因此不认这套课。真正动不了的是教学大纲,和家长群里那套沟通的规矩。换了老师,孩子还认这套规矩,课就上得下去。
模型是谁家的,其实不重要。重要的是你的 App 在里面是谁。
所以今天该做的,不是去追那个还没开放的接口,而是把自己那套规矩写清楚:动作的边界在哪,授权在谁手里,出错了能不能重试,用户能不能在 App 里走通同一条路。
奶爸悟
换老师不难,难的是换了老师以后,娃还认不认这套规矩
既然看到这里了,如果觉得有用,随手点个赞、在看、转发三连吧。
THANKS FOR READING