![]()
87%的iPhone用户每月至少用一次Siri,但真正让它操作第三方应用的不到4%。
差距在哪?Siri能打开App,却读不懂App里的数据。你说"给张三发消息",它只会愣住——因为张三是你上周才加的新联系人,Siri压根不知道这人存在。
开发者Fernando Rojo花了两个月,把这个死结解开了。他的社交提醒应用Howbee现在能听懂"帮我查一下李四的状态",哪怕App完全没打开。
技术方案不复杂,但组合起来足够刁钻:Expo模块+App Groups+Swift Intent,三条管道接力把JavaScript里的联系人数据,塞进Siri能碰到的沙盒外区域。
第一步:给原生代码开条暗道
Expo(一个React Native开发框架)的哲学是"尽量别碰原生代码"。但Siri Intent必须用Swift写,这是死规定。
Rojo的解法是在项目里 scaffold 一个本地Expo模块,起名howbee-intents。这个模块只做一件事:当用户在JS层添加或修改联系人时,把数据写进一个叫UserDefaults的共享存储。
「Your JS code never runs when Siri is doing its thing」,Rojo在博客里写得很直白。Siri执行Intent时,React Native那套JavaScript引擎根本没启动,Swift代码是孤军奋战。
![]()
所以模块设计成单向同步:JS负责更新,Swift负责读取,两边通过App Groups(苹果提供的跨应用数据共享机制)碰头。
第二步:让Siri学会"查字典"
Intent的定义文件里有个关键字段叫INObject,用来描述Siri能识别的实体类型。Rojo给Howbee定义了两类:Contact(联系人)和Reminder(提醒)。
难点在动态解析。用户随时可能新增联系人,Siri不能靠预置列表硬编码。Rojo的做法是在Intent的resolve阶段,从共享UserDefaults里拉取最新联系人列表,实时匹配用户语音输入。
匹配上了,Siri直接返回结果;没匹配上,走deep link把用户送进App手动选择。
这套流程测下来有个反直觉的点:Siri的语音识别容错率比想象中高,但语义理解极其死板。你说"看看王五怎么样了",和"查一下王五的状态",在Intent里是两个完全不同的触发词,必须分别配置。
第三步:绕过苹果的三道安检
App Groups配置错一个证书,整段代码直接报废。Rojo踩过的坑包括:开发环境和生产环境的Group ID混用、Entitlements文件没被Xcode正确签名、以及最隐蔽的——Expo的Continuous Native Generation会在每次预构建时覆盖手动修改的iOS工程文件。
![]()
他的 workaround 是写了一个config plugin,在预构建阶段自动注入Intent定义和Entitlements配置。这样团队其他成员拉代码后,expo prebuild一键搞定,不用手动翻Xcode的图形界面。
「The native module's job is simple: read and write to a shared UserDefaults suite. That's it.」Rojo反复强调这个设计原则。模块越薄,崩溃面越小。实际运行两个月,Howbee的Siri Intent崩溃率低于0.3%。
为什么这事值得折腾
苹果2023年推的App Intents框架,本意是让开发者低成本接入Siri。但现实是,纯JavaScript技术栈的团队被挡在门外——官方文档全是Swift示例,React Native社区的高质量方案屈指可数。
Rojo的开源实现填补了这块空白。他的代码结构被拆成三块:Expo模块负责数据桥接、Intent Extension负责Siri交互、主App负责业务逻辑。三层之间通过URL Scheme和共享存储通信,没有循环依赖。
一个细节值得玩味:Siri返回结果时,Rojo刻意避开了语音播报,改用卡片展示。测试数据显示,用户看到视觉反馈后的任务完成率,比纯语音高22%。
「Commands as simple as 'call my mum', or reminders as complex as 'remind me to call my dad as soon as I get home' always result in an action」,Rojo在文章开头引用了这个苹果官方例子,然后话锋一转:但你的App想做到同样的事,得先学会在Swift和JavaScript之间传纸条。
Howbee的Beta版本现在开放测试。Rojo在文末留了招募链接,但没说具体有多少人已经跑通这套方案——如果你手头正好有个Expo项目想接Siri,你会愿意当第几个吃螃蟹的?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.