
Phenaki API 價格:探索最新技術與市場趨勢
在iOS12中,蘋果進一步擴展了Siri的功能,推出了Siri Shortcuts。Siri Shortcuts允許用戶通過自定義短語觸發預設的操作,提升了用戶的便利性和效率。雖然SiriKit和Siri Shortcuts都旨在提高用戶與應用的交互體驗,但它們在實現和使用上存在明顯區別。
Siri Shortcuts適用于那些需要快速執行的簡單任務,如播放特定的音樂曲目或下單購買咖啡。用戶可以通過設置一個簡單的短語來觸發這些操作,而不需要逐個打開應用并進行操作。與SiriKit相比,Siri Shortcuts更注重個性化和快捷性。
在實際應用開發中,SiriKit可以用于實現各種復雜的操作,例如通過語音命令發送消息。以下是一個使用SiriKit開發消息發送功能的示例。
首先,打開Xcode并創建一個名為MySiriKitDemo的新項目。此項目將用于展示如何使用SiriKit實現消息發送功能。在項目創建完成后,您可以通過Siri發送消息給好友。
接下來,您需要在項目中添加一個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的數據時,您需要實現INSendMessageIntentHandling協議中的三個主要方法:Resolve、Confirm和Handle。通過這些方法,您可以解析Siri的請求、確認用戶權限并執行消息發送操作。
在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)
}
}
}