SiriKit與Siri Shortcuts的區(qū)別

在iOS12中,蘋果進(jìn)一步擴(kuò)展了Siri的功能,推出了Siri Shortcuts。Siri Shortcuts允許用戶通過(guò)自定義短語(yǔ)觸發(fā)預(yù)設(shè)的操作,提升了用戶的便利性和效率。雖然SiriKit和Siri Shortcuts都旨在提高用戶與應(yīng)用的交互體驗(yàn),但它們?cè)趯?shí)現(xiàn)和使用上存在明顯區(qū)別。

Siri Shortcuts的應(yīng)用場(chǎng)景

Siri Shortcuts適用于那些需要快速執(zhí)行的簡(jiǎn)單任務(wù),如播放特定的音樂曲目或下單購(gòu)買咖啡。用戶可以通過(guò)設(shè)置一個(gè)簡(jiǎn)單的短語(yǔ)來(lái)觸發(fā)這些操作,而不需要逐個(gè)打開應(yīng)用并進(jìn)行操作。與SiriKit相比,Siri Shortcuts更注重個(gè)性化和快捷性。

Siri Shortcuts示例

使用SiriKit開發(fā)消息發(fā)送功能

在實(shí)際應(yīng)用開發(fā)中,SiriKit可以用于實(shí)現(xiàn)各種復(fù)雜的操作,例如通過(guò)語(yǔ)音命令發(fā)送消息。以下是一個(gè)使用SiriKit開發(fā)消息發(fā)送功能的示例。

創(chuàng)建Demo項(xiàng)目

首先,打開Xcode并創(chuàng)建一個(gè)名為MySiriKitDemo的新項(xiàng)目。此項(xiàng)目將用于展示如何使用SiriKit實(shí)現(xiàn)消息發(fā)送功能。在項(xiàng)目創(chuàng)建完成后,您可以通過(guò)Siri發(fā)送消息給好友。

創(chuàng)建Demo項(xiàng)目

添加Intent Extension

接下來(lái),您需要在項(xiàng)目中添加一個(gè)Intent Extension。通過(guò)選擇File->New->Target,選擇Intents Extension,然后命名為MySirExtension。確保勾選Include UI Extension,以便后續(xù)添加交互界面。

添加Intent Extension

項(xiàng)目配置

在項(xiàng)目中配置名稱為聊天測(cè)試的Demo以便識(shí)別。打開MySirExtension下的Info.plist文件,確保IntentsSupported下的項(xiàng)不需要修改。對(duì)于不同的功能需求,如媒體播放或健身管理,需要相應(yīng)地調(diào)整意圖類型。

項(xiàng)目配置

共享用戶信息的實(shí)現(xiàn)

為了處理Siri的數(shù)據(jù),您需要在主項(xiàng)目中創(chuàng)建一個(gè)MyAccount.swift文件,并定義用戶相關(guān)的類。MyUser類用于表示好友對(duì)象,MyAccount類用于管理用戶賬戶。確保這些類同時(shí)被添加到主項(xiàng)目和Extension中,以實(shí)現(xiàn)數(shù)據(jù)共享。

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("模擬發(fā)送消息:(message) 給 (recipients)")
        return .success
    }
}

處理Siri的數(shù)據(jù)

在處理Siri的數(shù)據(jù)時(shí),您需要實(shí)現(xiàn)INSendMessageIntentHandling協(xié)議中的三個(gè)主要方法:Resolve、Confirm和Handle。通過(guò)這些方法,您可以解析Siri的請(qǐng)求、確認(rèn)用戶權(quán)限并執(zhí)行消息發(fā)送操作。

實(shí)現(xiàn)INSendMessageIntentHandling協(xié)議

在MySendMessageIntentHandler類中實(shí)現(xiàn)以下方法:

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

問:如何在應(yīng)用中啟用Siri功能?

問:Siri Shortcuts與SiriKit有何不同?

問:如何配置SiriKit以發(fā)送消息?

問:可以通過(guò)Siri控制哪些類型的應(yīng)用功能?

問:在開發(fā)過(guò)程中如何測(cè)試Siri功能?

上一篇:

WaveNet 應(yīng)用代碼解析與實(shí)現(xiàn)

下一篇:

Phenaki API 價(jià)格:探索最新技術(shù)與市場(chǎng)趨勢(shì)
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)