ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

visionOS 2 Siri AI集成实战:从App Intents到空间计算应用开发

visionOS 2 Siri AI集成实战:从App Intents到空间计算应用开发 在混合现实MR开发领域苹果的 Vision Pro 与 visionOS 无疑是一个令人兴奋的新平台。近期随着 visionOS 2 的更新特别是其中 Siri 与 AI 能力的深度融合为开发者开辟了全新的交互与应用场景。本文旨在为开发者提供一份从零开始的实战指南详细解析如何在 visionOS 2 应用中集成并调用增强版 Siri AI 能力涵盖环境搭建、核心 API 使用、完整项目示例以及避坑指南帮助你将智能语音交互无缝融入你的空间计算应用。1. 背景与核心概念visionOS 2 与 Siri AI 的融合在 visionOS 2 之前Vision Pro 的应用交互主要依赖于手势、眼动和传统的语音指令。visionOS 2 的发布标志着苹果将其强大的设备端 AI 与 Siri 深度整合到了空间计算的操作系统层。这不仅仅是让 Siri 能“听懂”更多命令更是为其赋予了空间感知和上下文理解的能力。简单来说现在的 Siri 在 Vision Pro 上可以理解空间上下文当你说“把那个窗口移到这里”时Siri 能理解“那个”指的是你正在注视的虚拟窗口“这里”是你手势指向的物理空间位置。执行复杂多步任务结合 App Intents 框架Siri 可以串联起应用内的多个操作。例如用户可以说“Siri帮我把刚才看的那篇关于 AI 的文章摘要发到 Slack 的开发频道”Siri 需要理解“刚才看的文章”上下文、“摘要”调用 AI 处理、“发到 Slack”跨应用操作。提供主动式建议基于设备端 AI 对用户行为模式的学习Siri 可以在特定场景下提供建议。例如当你每天早晨戴上 Vision Pro 准备工作时Siri 可能会主动询问“是否要打开今日日程和代码编辑器”对于开发者而言这意味着你的 visionOS 应用可以通过App Intents和SiriKit框架将自己的核心功能暴露给系统级的 Siri AI从而创造出更自然、更强大、更“隐形”的混合现实体验。这不再是简单的语音命令而是构建一个能理解用户意图并智能完成任务的数字助手。2. 环境准备与版本说明要开始 visionOS 2 的 Siri AI 功能开发你需要准备以下环境。请注意部分功能对硬件和开发者账号有特定要求。2.1 硬件与软件要求开发机一台运行macOS Sonoma 14.5 或更高版本的 Mac建议使用 Apple Silicon 芯片以获得最佳模拟器性能。Xcode必须使用Xcode 16.0 或更高版本。这是支持 visionOS 2 SDK 和最新App Intents框架的最低要求。你可以在 Mac App Store 下载或从苹果开发者网站获取。模拟器与实体设备Vision Pro 模拟器Xcode 自带可用于大部分功能的开发和调试。在 Xcode 的Device and Simulators窗口中可以选择 visionOS 模拟器。Apple Vision Pro 实体设备强烈建议用于最终测试尤其是涉及空间音频、精确手势交互和复杂 Siri 场景理解的特性。真机测试需要将设备连接到 Mac并配置开发者模式。开发者账号一个有效的Apple Developer Program会员账号每年付费。这是真机调试、使用某些 Capabilities如 Siri和上架 App Store 所必需的。2.2 创建 visionOS 2 项目打开 Xcode选择 “Create New Project…”。在模板选择器中找到 “Application” 分类下的“visionOS”然后选择“App”模板。点击 “Next”。填写项目信息Product Name例如SiriAIDemo。Team选择你的开发者账号团队。Interface选择SwiftUI本文示例基于 SwiftUI它更适用于 visionOS 的声明式 UI 开发。Language选择Swift。确保 “Include Siri Intent Extension” 和 “Include App Intents” 复选框在后续页面中被勾选。如果创建时漏选后续可以手动添加但初始勾选更便捷。选择项目存储位置点击 “Create”。项目创建后你会看到两个主要 Target主应用 Target如SiriAIDemo和一个名为SiriAIDemoIntents的 Intent Extension Target。后者专门用于处理 Siri 和快捷指令的请求。3. 核心框架与原理拆解在 visionOS 2 中与 Siri AI 集成主要涉及两个核心框架App Intents和SiriKit。理解它们的分工是成功集成的关键。3.1 App Intents 框架这是定义应用功能供系统调用的核心。一个 “Intent”意图代表用户想要执行的一个离散操作例如“创建笔记”、“播放音乐”、“查询天气”。AppEntity代表你的应用中可以操作的对象例如Note笔记、Task任务、Device设备。它让 Siri 能理解“那个笔记”中的“那个”具体指代什么。AppIntent定义了一个可执行的操作。每个AppIntent包含参数Parameters操作所需的输入例如笔记的标题、内容。执行函数perform()包含执行该操作的实际代码逻辑。返回值操作完成后返回的结果可以是一个值、一个实体或一个结果对话框。IntentDescription通过宏如IntentDescription为 Intent 和参数提供自然语言描述帮助 Siri 更好地理解和匹配用户的语音请求。3.2 SiriKit 与 Intent ExtensionSiriKit是处理 Siri 和快捷指令交互的框架。当你创建项目时勾选了 “Include Siri Intent Extension”Xcode 会生成一个独立的 Extension Target。作用这个 Extension 作为你应用和 Siri 服务之间的桥梁。当用户通过 Siri 发起请求时系统会先唤醒这个 Extension而不是你的主应用。Extension 负责接收 Siri 传递过来的Intent调用相应的AppIntent的perform()方法执行操作并将结果返回给 Siri 呈现给用户。优势轻量、快速响应符合 Siri 交互即时性的要求。3.3 工作流程一次完整的 Siri AI 交互流程如下用户表达意图用户对 Vision Pro 说“Siri用 DemoApp 创建一个关于 AI 会议的笔记。”Siri 理解与匹配Siri 的 NLU自然语言理解引擎解析语句识别出“创建笔记”这个操作以及“AI 会议”这个参数。它在系统中查找已声明的、匹配的AppIntent。唤醒 Intent Extension系统启动你应用的Intent Extension并将解析出的 Intent 对象传递给它。执行 IntentExtension 找到对应的AppIntent实现调用其perform()方法。返回与呈现perform()方法在你的应用上下文中执行创建笔记的逻辑并返回一个结果。这个结果通过 Extension 传回给 SiriSiri 以语音或视觉形式在 Vision Pro 的沉浸空间里反馈给用户“已创建笔记‘AI 会议’。”4. 完整实战案例构建一个智能笔记应用让我们通过一个具体的例子创建一个支持通过 Siri AI 进行“创建笔记”、“查找笔记”、“朗读最新笔记”功能的 visionOS 应用。4.1 定义数据模型与实体首先在主应用的 Target 中定义一个简单的笔记模型并让其遵循AppEntity协议。// 文件路径SiriAIDemo/Models/Note.swift import Foundation import AppIntents struct Note: Identifiable, Codable, AppEntity { let id: UUID var title: String var content: String var createdAt: Date init(id: UUID UUID(), title: String, content: String, createdAt: Date Date()) { self.id id self.title title self.content content self.createdAt createdAt } // MARK: - AppEntity 协议要求 static var typeDisplayRepresentation: TypeDisplayRepresentation { TypeDisplayRepresentation(name: 笔记) } var displayRepresentation: DisplayRepresentation { DisplayRepresentation(title: \(title), subtitle: \(content.prefix(30))...) } static var defaultQuery NoteQuery() // 一个简单的内存存储 MainActor static var allNotes: [Note] [] } // 用于查询 Note 实体的查询对象 struct NoteQuery: EntityQuery { MainActor func entities(for identifiers: [Note.ID]) async throws - [Note] { Note.allNotes.filter { identifiers.contains($0.id) } } MainActor func suggestedEntities() async throws - [Note] { Note.allNotes.sorted(by: { $0.createdAt $1.createdAt }) // 返回最新的笔记 } }4.2 实现 AppIntent创建笔记接下来在 Intent Extension Target 中或者在一个主应用和 Extension 都能访问的共享框架中实现第一个AppIntent。// 文件路径SiriAIDemoIntents/Intents/CreateNoteIntent.swift import AppIntents available(iOS 17.0, visionOS 2.0, *) struct CreateNoteIntent: AppIntent { // Intent 的元数据 static var title: LocalizedStringResource “创建新笔记” IntentDescription(“快速创建一个标题和内容的笔记。”) // 参数定义 Parameter(title: “笔记标题”) var title: String Parameter(title: “笔记内容”, inputOptions: .init(multiline: true)) var content: String // 参数如何从 Siri 对话中收集 static var parameterSummary: some ParameterSummary { Summary(“创建一个标题为 \(\.$title) 的笔记”) { \.$content } } // 执行函数 MainActor func perform() async throws - some IntentResult ReturnsValueNote ShowsSnippetView { // 1. 创建笔记对象 let newNote Note(title: title, content: content) // 2. 保存到“数据库”这里用内存数组模拟 Note.allNotes.append(newNote) print(“笔记已创建: \(newNote.title)”) // 3. 返回结果 return .result( value: newNote, view: SnippetView(NoteSnippetView(note: newNote)) // 在 Siri 结果界面显示一个自定义视图片段 ) } } // 一个简单的 SwiftUI 视图用于在 Siri 结果中显示笔记片段 struct NoteSnippetView: View { let note: Note var body: some View { VStack(alignment: .leading) { Text(note.title) .font(.headline) Text(note.content) .font(.body) .lineLimit(2) Text(note.createdAt, style: .time) .font(.caption) .foregroundColor(.secondary) } .padding() } }4.3 实现更多 Intent查找与朗读为了展示 Siri AI 的上下文理解能力我们再实现一个“查找笔记”和一个“朗读最新笔记”的 Intent。// 文件路径SiriAIDemoIntents/Intents/FindNoteIntent.swift import AppIntents available(iOS 17.0, visionOS 2.0, *) struct FindNoteIntent: AppIntent { static var title: LocalizedStringResource “查找笔记” Parameter(title: “关键词”) var keyword: String static var parameterSummary: some ParameterSummary { Summary(“查找包含 \(\.$keyword) 的笔记”) } MainActor func perform() async throws - some IntentResult ReturnsValue[Note] { let filteredNotes Note.allNotes.filter { note in note.title.localizedCaseInsensitiveContains(keyword) || note.content.localizedCaseInsensitiveContains(keyword) } if filteredNotes.isEmpty { throw $keyword.notFoundError(\.$keyword) // 抛出错误Siri 会友好提示未找到 } return .result(value: filteredNotes) } } // 文件路径SiriAIDemoIntents/Intents/ReadLatestNoteIntent.swift import AppIntents import AVFoundation // 用于文本转语音 available(iOS 17.0, visionOS 2.0, *) struct ReadLatestNoteIntent: AppIntent { static var title: LocalizedStringResource “朗读最新笔记” IntentDescription(“将我最近创建的笔记内容读出来。”) MainActor func perform() async throws - some IntentResult ProvidesDialog { guard let latestNote Note.allNotes.sorted(by: { $0.createdAt $1.createdAt }).first else { throw NSError(domain: “NoNotesError”, code: 0, userInfo: [NSLocalizedDescriptionKey: “您还没有创建任何笔记。”]) } // 使用 AVSpeechSynthesizer 朗读 let synthesizer AVSpeechSynthesizer() let utterance AVSpeechUtterance(string: “\(latestNote.title)。内容如下\(latestNote.content)”) utterance.voice AVSpeechSynthesisVoice(language: “zh-CN”) synthesizer.speak(utterance) return .result(dialog: “正在为您朗读最新笔记\(latestNote.title)”) } }4.4 注册 Intent 并配置 Info.plist定义的 Intent 需要被系统知晓。在Intent Extension Target的Info.plist文件中找到NSExtension-NSExtensionAttributes-IntentsSupported数组添加我们定义的 Intent 类名。!-- 文件路径SiriAIDemoIntents/Info.plist 片段 -- keyNSExtension/key dict keyNSExtensionAttributes/key dict keyIntentsSupported/key array string$(PRODUCT_MODULE_NAME).CreateNoteIntent/string string$(PRODUCT_MODULE_NAME).FindNoteIntent/string string$(PRODUCT_MODULE_NAME).ReadLatestNoteIntent/string /array /dict keyNSExtensionPointIdentifier/key stringcom.apple.intents-service/string keyNSExtensionPrincipalClass/key string$(PRODUCT_MODULE_NAME).IntentHandler/string /dict同时在主应用的Info.plist中确保已添加Siri权限。keyNSSiriUsageDescription/key string此应用需要Siri权限来通过语音创建和管理您的笔记。/string4.5 在 visionOS 主应用中调用与测试在主应用的 SwiftUI 视图中我们可以使用AppIntents提供的perform方法来直接调用 Intent这对于应用内触发 Siri 功能非常有用。// 文件路径SiriAIDemo/Views/ContentView.swift import SwiftUI import AppIntents struct ContentView: View { State private var notes: [Note] [] State private var newNoteTitle “” State private var newNoteContent “” var body: some View { NavigationStack { List(notes) { note in VStack(alignment: .leading) { Text(note.title).font(.headline) Text(note.content).font(.body).lineLimit(2) } } .navigationTitle(“智能笔记”) .toolbar { Button(“通过Siri创建”) { requestCreateNoteViaSiri() } } .onAppear { // 初始化时加载数据示例中直接使用静态数组 notes Note.allNotes } } .padding() } private func requestCreateNoteViaSiri() { // 这种方法可以引导用户去设置里添加Siri快捷指令 // 更直接的方式是使用 requestReview(for:) 或直接调用 Intent let intent CreateNoteIntent() // 注意直接调用需要处理参数通常用于应用内预设流程 // 更常见的测试方式是使用模拟器或真机的Siri } }4.6 运行与验证在模拟器中测试在 Xcode 顶部 scheme 选择器中选择SiriAIDemoIntents的 scheme 和visionOS Simulator。运行 (CmdR)。这会将 Intent Extension 安装到模拟器。然后将 scheme 切换回主应用SiriAIDemo并运行。在模拟器中你可以通过Hardware-Siri菜单或快捷键CmdShift5激活 Siri然后说出指令“用 SiriAIDemo 创建一个关于明天会议的笔记内容是准备演示文稿。”在 Vision Pro 真机上测试用 USB-C 线连接 Vision Pro 和 Mac。在 Vision Pro 上进入设置-通用-VPN与设备管理信任你的开发者证书。在 Xcode 中选择你的真机设备运行主应用和 Intent Extension。戴上 Vision Pro直接说“嘿 Siri用 [你的应用名] …”来测试。验证结果Siri 应该会确认操作并在你的应用主界面或通过你定义的SnippetView看到新创建的笔记。你还可以测试“查找包含‘会议’的笔记”和“朗读最新笔记”等指令。5. 常见问题与排查思路在集成 visionOS Siri AI 功能时你可能会遇到以下典型问题。问题现象常见原因解决思路Siri 回应“我没找到那个应用”或“好像出错了”。1. Intent Extension 未正确安装或运行。2.Info.plist中IntentsSupported未配置或类名错误。3. Intent 类未标记为available(iOS 17.0, visionOS 2.0, *)。1. 确保已成功运行过 Intent Extension Target。2. 仔细检查Info.plist中的类名确保包含模块名前缀$(PRODUCT_MODULE_NAME).。3. 确认 Intent 类的可用性注解正确。清理构建文件夹 (CmdShiftK,CmdOptionShiftK) 后重新运行。Siri 能识别指令但参数总是错误或缺失。1.parameterSummary定义不清晰。2. 参数未正确使用Parameter包装器。3. Siri 的自然语言训练数据尚未更新。1. 使用Summary和IntentDescription宏提供更清晰的描述。2. 检查参数属性包装器语法。在perform()方法中打印参数值以调试。3. 有时需要等待一段时间或尝试用更简单、直接的短语。在模拟器中 Siri 无反应或报错。1. 模拟器未启用 Siri。2. 应用/Extension 的签名或权限问题。1. 在模拟器的设置-Siri与搜索中确保 Siri 已开启。2. 检查主应用Info.plist的NSSiriUsageDescription是否已设置。检查开发者签名是否有效。AppEntity查询 (EntityQuery) 不工作Siri 无法识别“那个笔记”。1.defaultQuery静态属性未正确实现或返回空数组。2. 实体标识符 (id) 在查询时不一致。1. 确保entities(for:)和suggestedEntities()方法正确实现并返回数据。使用MainActor确保在主线程访问数据。2. 确保实体的id是稳定且可序列化的。自定义的SnippetView不显示。1. 返回的view类型不正确或构建失败。2. SwiftUI 视图可能包含不支持的修饰符或组件。1. 确保ShowsSnippetView协议被正确遵循且view参数是SnippetView(yourView)。2. 简化SnippetView内的视图仅使用基础组件。检查控制台是否有 SwiftUI 运行时错误。真机上测试时Siri 无法调用我的应用。1. 应用未请求 Siri 权限。2. 在“快捷指令”App 中未生成对应的快捷指令。1. 首次触发 Siri 功能时系统会弹窗请求权限必须允许。2. 打开 Vision Pro 上的“快捷指令”App查看是否自动生成了与你 Intent 对应的快捷指令可以手动运行测试。6. 最佳实践与工程建议将 Siri AI 深度集成到 visionOS 应用中需要考虑用户体验、性能和可维护性。设计精准的 Intent 和参数原子性一个 Intent 应只完成一件明确的事情。避免创建“超级 Intent”。命名与描述使用IntentDescription和ParameterSummary提供完整、自然的描述。这直接关系到 Siri 的理解准确率。参数类型充分利用系统提供的参数类型String,Int,Double,Bool,Date,Person以及自定义的AppEntity。合适的类型能带来更好的输入界面如日期选择器和验证。优雅的错误处理在perform()方法中使用throw抛出错误而不是返回失败结果。Siri 会将错误信息转化为友好的语音回复。定义自定义的错误枚举实现LocalizedError协议提供errorDescription让反馈更精准。性能与响应速度Intent Extension 应保持轻量。复杂的业务逻辑或网络请求应考虑放在主应用中通过AppGroup共享数据或使用后台任务。perform()方法应尽快返回。如果需要长时间操作返回一个.inProgress的结果并在完成后调用Intent提供的回调。隐私与数据安全Siri 请求可能包含敏感信息。确保你的 Intent 处理代码不会将用户数据泄露到日志或第三方服务。遵循“数据最小化”原则只请求完成 Intent 所必需的数据权限。在Info.plist中提供清晰、诚实的权限使用说明 (NSSiriUsageDescription)。充分利用空间上下文visionOS 特有探索Window或Volume相关的实体和参数。未来Siri 可能支持如“将那个 3D 模型放到我面前的桌子上”这类高度空间化的指令。考虑如何将语音指令的结果可视化地呈现在沉浸式空间中而不仅仅是语音回复。ShowsSnippetView是一个开始未来可能会有更丰富的空间 UI 组件。测试策略单元测试为每个AppIntent的perform()方法编写单元测试模拟各种参数输入。Siri 意图测试在 Xcode 的Scheme设置中可以为 Intent Extension 配置“Siri Intent Query”测试模拟不同的语音输入。真机场景测试在 Vision Pro 上模拟真实使用场景包括嘈杂环境、连续对话和复杂指令组合。通过遵循以上实践你不仅能构建出稳定可靠的 Siri AI 集成功能还能为 Vision Pro 用户提供真正智能、自然且令人惊艳的空间交互体验。这不仅仅是添加一个语音功能而是在定义未来人机交互的新范式。
返回列表