Siri 应用代码的开发与实践
Siri的演变与发展历程
Siri是苹果公司的智能语音助手,首次在iOS4中亮相,但直到iOS10之前,苹果并未开放Siri的API接口。这意味着用户只能使用苹果官方提供的服务,如设定闹钟、拨打电话、设置提醒等。随着技术的进步,苹果在iOS10引入了SiriKit,开发者可以利用这一工具将自身应用的服务与Siri集成。
iOS4至iOS9:封闭的Siri
在这段时期,Siri作为苹果设备的内置语音助手,功能相对简单,主要用于基础任务的执行,如设定闹钟、拨打电话等。用户体验受到限制,因为无法通过第三方应用扩展Siri的功能。尽管如此,Siri作为一项创新技术,仍然吸引了大量用户的关注。
iOS10:SiriKit的开放
在2016年的WWDC上,苹果推出了iOS10,并首次开放了Siri的API。通过SiriKit,开发者可以将应用的功能与Siri集成,为用户提供更丰富的体验。例如,用户可以通过语音命令使用QQ音乐播放特定歌曲,或通过微信发送消息。这些命令需要指定域和意图,并传递相应的参数以执行操作。SiriKit的开放极大地扩展了应用的能力,使得Siri成为更加多功能的语音助手。
SiriKit与Siri Shortcuts的区别
在iOS12中,苹果进一步扩展了Siri的功能,推出了Siri Shortcuts。Siri Shortcuts允许用户通过自定义短语触发预设的操作,提升了用户的便利性和效率。虽然SiriKit和Siri Shortcuts都旨在提高用户与应用的交互体验,但它们在实现和使用上存在明显区别。
Siri Shortcuts的应用场景
Siri Shortcuts适用于那些需要快速执行的简单任务,如播放特定的音乐曲目或下单购买咖啡。用户可以通过设置一个简单的短语来触发这些操作,而不需要逐个打开应用并进行操作。与SiriKit相比,Siri Shortcuts更注重个性化和快捷性。
使用SiriKit开发消息发送功能
在实际应用开发中,SiriKit可以用于实现各种复杂的操作,例如通过语音命令发送消息。以下是一个使用SiriKit开发消息发送功能的示例。
创建Demo项目
首先,打开Xcode并创建一个名为MySiriKitDemo的新项目。此项目将用于展示如何使用SiriKit实现消息发送功能。在项目创建完成后,您可以通过Siri发送消息给好友。
添加Intent Extension
接下来,您需要在项目中添加一个Intent Extension。通过选择File->New->Target,选择Intents Extension,然后命名为MySirExtension。确保勾选Include UI Extension,以便后续添加交互界面。
项目配置
在项目中配置名称为聊天测试的Demo以便识别。打开MySirExtension下的Info.plist文件,确保IntentsSupported下的项不需要修改。对于不同的功能需求,如媒体播放或健身管理,需要相应地调整意图类型。
共享用户信息的实现
为了处理Siri的数据,您需要在主项目中创建一个MyAccount.swift文件,并定义用户相关的类。MyUser类用于表示好友对象,MyAccount类用于管理用户账户。确保这些类同时被添加到主项目和Extension中,以实现数据共享。
import Intents
class MyUser {
var name: String?
var handle: String?
init(name: String? = nil, handle: String? = nil) {
self.name = name
self.handle = handle
}
func toInPerson() -> INPerson {
return INPerson(handle: handle!, displayName: name, contactIdentifier: name)
}
}
class MyAccount {
private static let instance = MyAccount()
class func share() -> MyAccount {
return MyAccount.instance
}
func contact(matchingName: String) -> [MyUser] {
return [MyUser(name: matchingName, handle: NSStringFromClass(MySendMessageIntentHandler.classForCoder()))]
}
func send(message: String, to recipients: [INPerson]) -> INSendMessageIntentResponseCode {
print("模拟发送消息:(message) 给 (recipients)")
return .success
}
}
处理Siri的数据
在处理Siri的数据时,您需要实现INSendMessageIntentHandling协议中的三个主要方法:Resolve、Confirm和Handle。通过这些方法,您可以解析Siri的请求、确认用户权限并执行消息发送操作。
实现INSendMessageIntentHandling协议
在MySendMessageIntentHandler类中实现以下方法:
import UIKit
import Intents
class MySendMessageIntentHandler: NSObject, INSendMessageIntentHandling {
// MARK: - INSendMessageIntentHandling
func resolveRecipients(for intent: INSendMessageIntent, with completion: @escaping ([INSendMessageRecipientResolutionResult]) -> Void) {
if let recipients = intent.recipients {
if recipients.count == 0 {
completion([INSendMessageRecipientResolutionResult.needsValue()])
return
}
var resolutionResults = [INSendMessageRecipientResolutionResult]()
for recipient in recipients {
let matchingContacts = MyAccount.share().contact(matchingName: recipient.displayName)
switch matchingContacts.count {
case 2...Int.max:
let disambiguations = matchingContacts.map { $0.toInPerson() }
resolutionResults += [INSendMessageRecipientResolutionResult.disambiguation(with: disambiguations)]
case 1:
let recipient = matchingContacts[0].toInPerson()
resolutionResults += [INSendMessageRecipientResolutionResult.success(with: recipient)]
case 0:
resolutionResults += [INSendMessageRecipientResolutionResult.unsupported()]
default:
break
}
}
completion(resolutionResults)
} else {
completion([INSendMessageRecipientResolutionResult.needsValue()])
}
}
func resolveContent(for intent: INSendMessageIntent, with completion: @escaping (INStringResolutionResult) -> Void) {
if let text = intent.content, !text.isEmpty {
completion(INStringResolutionResult.success(with: text))
} else {
completion(INStringResolutionResult.needsValue())
}
}
func confirm(intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) {
let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent.self))
let response = INSendMessageIntentResponse(code: .ready, userActivity: userActivity)
completion(response)
}
func handle(intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) {
if let content = intent.content, let recipients = intent.recipients {
let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent.self))
let sendResult = MyAccount.share().send(message: content, to: recipients)
completion(INSendMessageIntentResponse(code: sendResult, userActivity: userActivity))
} else {
let response = INSendMessageIntentResponse(code: .failure, userActivity: nil)
completion(response)
}
}
}
FAQ
问:如何在应用中启用Siri功能?
- 答:在您的Xcode项目中,转到Signing & Capabilities部分,添加Siri功能,并在Info.plist中添加Siri权限请求描述。
问:Siri Shortcuts与SiriKit有何不同?
- 答:Siri Shortcuts允许用户自定义短语以触发特定操作,适用于简单快捷任务,而SiriKit提供更复杂的功能集成。
问:如何配置SiriKit以发送消息?
- 答:创建一个Intents Extension,定义消息发送的意图(INSendMessageIntent),并实现相关的处理协议。
问:可以通过Siri控制哪些类型的应用功能?
- 答:Siri可以控制语音通话、信息发送、媒体播放、任务管理、付款、餐馆预定、健身和打车服务等功能。
问:在开发过程中如何测试Siri功能?
- 答:开发者可以通过在设备上启用Siri,并使用Siri命令来测试集成的功能是否如预期工作。
热门API
- 1. AI文本生成
- 2. AI图片生成_文生图
- 3. AI图片生成_图生图
- 4. AI图像编辑
- 5. AI视频生成_文生视频
- 6. AI视频生成_图生视频
- 7. AI语音合成_文生语音
- 8. AI文本生成(中国)
最新文章
- Python调用免费翻译API实现Excel文件批量翻译
- 为开源项目 go-gin-api 增加 WebSocket 模块
- AI编程的风险,如何毁掉你的 API?
- 使用预约调度API的运输管理
- Claude 免费用户频繁被限流?实用应对策略推荐
- 如何获取谷歌新闻 API Key 密钥(分步指南)
- API 目录 – 什么是 API 目录?
- 用NestJS和Prisma: Authentication构建一个REST API
- DeepSeek – Anakin.ai 的 Reason 模型 API 价格是多少?
- 19个API安全最佳实践,助您实现安全
- 如何免费调用Kimi API实现项目集成
- 探索 Zomato API 的潜力