Flutter 集成 Siri 实现语音指令唤起应用的实现方法咨询
Flutter对接Siri语音指令跳转应用实现方案
该功能核心依赖iOS系统的Intents框架实现Siri指令识别,再通过自定义URL Scheme向Flutter层传递指令参数,完整实现步骤如下:
1. iOS原生侧配置
- 打开Flutter项目对应的iOS Xcode工程,进入主App的「Signing & Capabilities」配置页,点击左上角+号添加Siri能力
- 新建Intents Extension目标:依次点击Xcode菜单栏File > New > Target,搜索并选择「Intents Extension」创建,不需要交互UI的话无需勾选「Include UI Extension」
- 新建后缀为
.intentdefinition的配置文件,在文件内添加自定义意图,比如本次场景命名为ShowMenuListIntent,按需添加需要传递的参数;在意图的「Suggested phrases」栏填写触发指令,比如show me the menu list in ExampleAPP,替换ExampleAPP为你的应用实际名称 - 在主App的Info配置页的「URL Types」项添加自定义URL Scheme,比如设置为
exampleapp,用于后续扩展跳转传参 - 在Intents Extension的意图处理类中,实现指令识别后的跳转逻辑,示例代码如下:
func handle(intent: ShowMenuListIntent, completion: @escaping (ShowMenuListIntentResponse) -> Void) { guard let jumpUrl = URL(string: "exampleapp://siri?action=show_menu_list") else { completion(ShowMenuListIntentResponse(code: .failure, userActivity: nil)) return } extensionContext?.open(jumpUrl, completionHandler: { success in completion(success ? .success : .failure, userActivity: nil) }) }
- 主App启动时需要主动请求Siri授权,添加授权代码:
INPreferences.requestSiriAuthorization(),用户授权后自定义指令才能正常触发
2. Flutter侧逻辑处理
- 注册全局URL跳转监听,同时覆盖冷启动、热启动两种场景,监听到Siri跳转的URL后解析参数执行对应逻辑,示例代码如下:
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; // 全局路由key用来无context跳转 final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); Future<void> handleIncomingUrl(String url) async { Uri uri = Uri.parse(url); // 过滤Siri触发的跳转 if (uri.host == 'siri') { String action = uri.queryParameters['action'] ?? ''; switch (action) { case 'show_menu_list': // 跳转到菜单列表页,执行对应业务逻辑 navigatorKey.currentState?.pushNamed('/menu_list'); break; // 其他Siri指令的处理分支 } } } // 应用启动时读取初始打开的URL(处理冷启动场景) Future<void> checkInitUrl() async { final initialLink = await getInitialLink(); // 系统平台通道获取初始URL if (initialLink != null) { handleIncomingUrl(initialLink); } // 注册后续URL跳转监听(处理热启动场景) listenLinkStream(handleIncomingUrl); }
- 上述代码中
getInitialLink、listenLinkStream可通过Flutter官方提供的平台通道实现,也可以使用成熟的URL路由相关工具类实现。
注意事项
- Siri触发短语尽量使用口语化表述,避免生僻词,否则会降低识别成功率
- 如果指令需要传递动态参数,需要在
.intentdefinition文件对应参数的配置项中勾选「Siri can ask for value if missing」,识别不到参数时Siri会主动向用户询问 - 上架App Store时需要在隐私声明中说明Siri数据使用规则,避免审核被拒
内容的提问来源于stack exchange,提问作者Hos morty
相关产品推荐
相关产品推荐

