You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:06:00