sirikit
SiriKit 編程指南
SiriKit 介紹 Introduction to SiriKit
重要:本文檔初步包含SiriKit API與SiriKit技術(shù)開發(fā)的信息。這些信息可能會(huì)有變更,根據(jù)這個(gè)文檔實(shí)現(xiàn)的軟件應(yīng)該被測試在最后的操作系統(tǒng)中。
SiriKit 一個(gè)讓你的內(nèi)容可以通過Siri使用的新方式。它還將支持您的服務(wù)添加到地圖應(yīng)用中去。想要支持SiriKit使用Intents.framework和IntentsUI.framework實(shí)現(xiàn)一個(gè)或多個(gè)擴(kuò)展,包含在你的iOS應(yīng)用程序中。當(dāng)用戶通過Siri或地圖請求特定類型的服務(wù),系統(tǒng)將會(huì)使用你的擴(kuò)展來提供這些服務(wù)。
只有當(dāng)你的應(yīng)用程序?qū)崿F(xiàn)了下列服務(wù)類型之一,才能增加SiriKit支持:
-
語音通話 Audio or video calling:打電話、發(fā)起視頻電話、查通話記錄
-
信息 Messaging:發(fā)信息、搜索信息
-
個(gè)人之間的付款 Payments: 向某人付款、向某人收款
-
照片搜索 Searching photos :搜索照片、播放照片幻燈片
-
健身 Workouts :開始健身、暫停健身、恢復(fù)健身、結(jié)束健身、取消健身
- 打車 Ride booking:查看附近可用的車輛、訂車、查看訂單
注意:汽車廠商可能使用CarPlay意圖來允許用戶使用語音命令控制汽車。
每個(gè)類型的服務(wù)代表一個(gè)(domain)領(lǐng)域的功能,你可以支持,為每個(gè)(domain)領(lǐng)域定義一個(gè)或多個(gè)的(intents)意圖對來支持。一個(gè)(intent)意圖是一個(gè)代表用戶意圖的對象。Siri和地圖創(chuàng)建意圖對象以響應(yīng)用戶請求,填補(bǔ)任何指定的信息。例如,發(fā)送消息的意圖可能包括消息的接收者和內(nèi)容。你使用意圖對象提供一個(gè)適當(dāng)?shù)捻憫?yīng)和執(zhí)行相關(guān)的任務(wù)。關(guān)于支持的領(lǐng)域更多信息和他們的所有意圖。查看Intents Domains
意圖和意圖UI擴(kuò)展 The Intents and Intents UI Extensions
Siri和地圖通過兩個(gè)不同類型的擴(kuò)展與你的應(yīng)用程序服務(wù)交互:
- 一個(gè)意圖Intents?擴(kuò)展溝通你的app內(nèi)容,Siri和地圖,并執(zhí)行與任何支持的意圖有關(guān)的任務(wù)。
- 一個(gè)Intents UI擴(kuò)展在Siri或地圖界面中,為您的內(nèi)容提供了一個(gè)自定義的接口。這個(gè)擴(kuò)展是可選的。
你必須提供一個(gè)意圖擴(kuò)展支持 SiriKit。你的意圖擴(kuò)展負(fù)責(zé)處理意圖和用于提供信,Siri和地圖可以用來與用戶進(jìn)行通信。提供一個(gè)意圖UI( Intents UI)擴(kuò)展是可選的,通過Siri和你的的APP交互是一種可以熟悉你的用戶的方式。例如,意圖UI擴(kuò)展可以展示品牌和其他應(yīng)用程序特定的信息去強(qiáng)化APP提供響應(yīng)的一些想法。
關(guān)于classs的使用實(shí)現(xiàn)你的意圖擴(kuò)展的更多信息,參考Intents Framework Reference. 實(shí)現(xiàn)Intents UI擴(kuò)展的協(xié)議信息參考?Intents UI Framework Reference.
Siri的角色和地圖應(yīng)用
Siri 處理語言過程和語義分析,把用戶的請求的口語轉(zhuǎn)化為可操作的意圖。 Siri的和地圖應(yīng)用管理所有的用戶交互,并使用標(biāo)準(zhǔn)的系統(tǒng)界面顯示結(jié)果給用戶。你的作用主要是提供數(shù)據(jù)以顯示。如果您的應(yīng)用程序包括意圖UI擴(kuò)展,你也可以提供一個(gè)自定義界面,以補(bǔ)充默認(rèn)的系統(tǒng)界面。
打車和餐館預(yù)訂主要由地圖應(yīng)用程序處理,但用戶也可以使用Siri打車。你的意圖擴(kuò)展要以相同的方式處理來源于地圖和Siri的請求。如果您自定義用戶界面,你的意圖UI擴(kuò)展可以自行配置不同風(fēng)格,具體取決于該請求是否來自Siri或地圖。
創(chuàng)建意圖擴(kuò)展 Intents Extension
Siri和地圖通過你的意圖的擴(kuò)展與應(yīng)用程序交互。意圖的入口是?INExtension對象,其唯一的工作就是直接的從Siri到能夠響應(yīng)用戶請求的對象。實(shí)現(xiàn)意圖擴(kuò)展時(shí),有三種類型的對象,你經(jīng)常使用:
-
意圖對象 intent object :由用戶意圖定義的意圖對象并且包含siri從用戶那收集來的數(shù)據(jù)
-
處理對象 handler object:處理對象是一個(gè)自定義用來解決,確認(rèn),處理一個(gè)意圖的對象。
-
響應(yīng)對象 response object :響應(yīng)對象是一個(gè)包含響應(yīng)給意圖數(shù)據(jù)的對象
當(dāng)你的擴(kuò)展來處理意圖, Siri向INExtension對象請求處理對象。處理對象可以是你想要的任意類型,但是必須實(shí)現(xiàn)處理給定意圖的方法,每個(gè)意圖有一個(gè)必須采用的附加協(xié)議,協(xié)議的方法分為三組:解決方法,確認(rèn)方法,和處理方法,你實(shí)現(xiàn)你需要的方法并提供關(guān)于你如何處理意圖的信息給Siri
圖2 - 1 說明了在你的擴(kuò)展中 Siri和處理對象之間高級別流。在此示例中,當(dāng)用戶想要預(yù)訂一程車輛預(yù)訂服務(wù),Siri將創(chuàng)建一個(gè)意圖對象與車輛參數(shù)并將其發(fā)送給處理程序。處理程序解析意圖對象中的數(shù)據(jù)值,來滿足車輛需求。當(dāng)所有車輛參數(shù)被解決,Siri要求處理程序確認(rèn)計(jì)劃如何處理車輛請求,執(zhí)行任何最終驗(yàn)證。在確認(rèn)階段,處理程序提供了一個(gè)關(guān)于車輛的響應(yīng)對象詳細(xì)信息,Siri可能顯示給用戶。如果用戶接受車輛請求,Siri要求車輛請求處理意圖的處理對象。處理程序響應(yīng)并返回一個(gè)帶有預(yù)訂車輛細(xì)節(jié)的響應(yīng)。
在確認(rèn)階段,該處理程序響應(yīng)對象提供乘車,Siri 可能會(huì)向用戶顯示的詳細(xì)信息。如果用戶接受騎,Siri 詢問騎請求處理程序來處理的意圖。該處理程序響應(yīng)通過預(yù)訂乘坐并返回響應(yīng)一個(gè)預(yù)訂乘車的細(xì)節(jié)。
圖2 - 1 處理一個(gè)車輛請求意圖
有關(guān)如何創(chuàng)建擴(kuò)展的一些信息, 查閱?App Extension Programming Guide.
配置你的 Xcode工程 Configuring Your Xcode Project
支持SiriKit,為你的iOS應(yīng)用程序添加一個(gè)意圖擴(kuò)展。
添加一個(gè)意圖擴(kuò)展到你的APP
Xcode 提供的意圖擴(kuò)展模板包括?INExtension?子類供您自定義。你使用該類創(chuàng)建需處理意圖的處理程序?qū)ο蟆iri 使用您的擴(kuò)展的Info.plist?文件來發(fā)現(xiàn)它支持的意圖。Xcode 提供了Info.plist?文件包含了大多數(shù)配置,但您必須修改它來指定您的擴(kuò)展處理哪些意圖的部分。
指定您的應(yīng)用程序支持的意圖︰
實(shí)現(xiàn)您的擴(kuò)展的行為涉及以下任務(wù) ︰
- 為你支持的每個(gè)意圖定義處理類,你可以為每個(gè)意圖定義處理類,或者定義為多個(gè)意圖定義一個(gè)處理類,使用的協(xié)議讓任何對象轉(zhuǎn)化為意圖處理對象變得更加容易
- 添加自定義的源文件,為了任何支持的意圖需要執(zhí)行的任務(wù)。您的擴(kuò)展必須能夠執(zhí)行任何與意圖關(guān)聯(lián)的任務(wù)。例如,車輛預(yù)訂服務(wù)的處理程序必須能夠預(yù)訂車輛和獲取有關(guān)使用該預(yù)定服務(wù)的信息。無論什么源文件添加到擴(kuò)展項(xiàng)目,你需要保證這一點(diǎn);請參閱Structuring Your App’s Services。
- 更新 Xcode 提供的默認(rèn) INExtension 類。修改?handlerForIntent?方法︰ Xcode提供的?INExtension?子類創(chuàng)建并返回您的自定義處理程序?qū)ο蟮姆椒?。有關(guān)如何實(shí)現(xiàn)此方法的信息,請參閱?INIntentHandlerProviding Protocol Reference?。
- 定義您的應(yīng)用程序使用的任何自定義的詞匯。以特定方式使用應(yīng)用程序的單詞或短語可以定義一個(gè)自定義的詞匯文件來幫助 Siri 明白該自定義的用法。有關(guān)如何使用您的應(yīng)用程序的自定義詞匯提供 給Siri 信息,請查閱 Specifying Custom Vocabulary 章節(jié)
可用的意圖和關(guān)聯(lián)的類與協(xié)議的列表,請參閱 Intents Domains。
在iOS應(yīng)用程序中請求Siri授權(quán)
在你的意圖擴(kuò)展可以使用之前,和任何特定于用戶的詞匯注冊之前,你的 iOS 應(yīng)用程序必須請求使用 Siri 的授權(quán)。若要請求授權(quán),請執(zhí)行以下操作 ︰
- 在您的應(yīng)用程序的?Info.plist?文件中包含?NSSiriUsageDescription?鍵。此鍵的值是一個(gè)字符串,描述您的應(yīng)用程序處理意圖向 Siri 發(fā)送什么數(shù)據(jù)。例如,一個(gè)健身應(yīng)用程序可能會(huì)將值設(shè)置為字符串"健身信息將被發(fā)送到 Siri。"
- 程序中調(diào)用?requestSiriAuthorization?︰?在您的應(yīng)用程序執(zhí)行期間合適的時(shí)機(jī)調(diào)用??INPreferences?的類方法requestSiriAuthorization
你的 iOS 應(yīng)用程序第一次調(diào)用?requestSiriAuthorization? 時(shí)候︰ 方法,系統(tǒng)會(huì)顯示一個(gè)Alert提示框,提示用戶授權(quán)您的應(yīng)用程序。Alert提示框包括在您的應(yīng)用程序的?Info.plist?文件的?NSSiriUsageDescription?所提供的使用說明字符串。用戶可以批準(zhǔn)或拒絕您的應(yīng)用程序的授權(quán)請求,并可以在后來iOS系統(tǒng)設(shè)置中更改您的應(yīng)用程序的授權(quán)狀態(tài)。系統(tǒng)會(huì)記住您的應(yīng)用程序的授權(quán)狀態(tài)以便后續(xù)對 requestSiriAuthorization 的調(diào)用時(shí)不會(huì)再次提示用戶。
構(gòu)建應(yīng)用程序的服務(wù)
您的意圖擴(kuò)展代理您的應(yīng)用程序行為,應(yīng)該能夠執(zhí)行與您的應(yīng)用程序相同的服務(wù)。因?yàn)槟愕?iOS 應(yīng)用程序和意圖擴(kuò)展會(huì)執(zhí)行許多相同的任務(wù),考慮以下方面 ︰
- 使用一個(gè)私人的共享的框架(.framework)來存儲(chǔ)您的核心服務(wù)的代碼。鏈接(.framework)到到您的 iOS 應(yīng)用程序與您的意圖擴(kuò)展。共享的框架可以使這兩個(gè)可執(zhí)行文件最小化,并確保兩者都使用相同的代碼與您的服務(wù)進(jìn)行交互。
- 使用一個(gè)共享的容器來存儲(chǔ)共同資源。如果您的服務(wù)使用圖像或數(shù)據(jù)文件并放在App bundle中,將這些資源放入共享的容器內(nèi)。啟用共享的容器支持每一個(gè)target
測試你的意圖擴(kuò)展
若要測試您的意圖擴(kuò)展,必須在設(shè)備上運(yùn)行它。Xcode提供直接運(yùn)行工程到設(shè)備上的供調(diào)試 在設(shè)備上運(yùn)行和調(diào)試你的意圖擴(kuò)展首次安裝擴(kuò)展時(shí),Siri可能不會(huì)立刻認(rèn)出你的應(yīng)用擴(kuò)展。你可能需要等待幾分鐘才能發(fā)出任何相關(guān)命令。同樣的,當(dāng)更新你的信息。plist文件,您可能需要等待幾分鐘,Siri才會(huì)認(rèn)識(shí)到變化。
在應(yīng)用程序中使用意圖框架 Intents.Framework
你的iOS應(yīng)用程序使用意圖框架來執(zhí)行特定的任務(wù):
- 使用INVocabulary類注冊用戶特定的詞匯表術(shù)語。為了app特定的用戶注冊用戶特定的詞匯術(shù)語,否則可能會(huì)被誤解Siri;請不要注冊常見或很容易理解的術(shù)語。有關(guān)注冊詞匯的信息,請參閱 Specifying Custom Vocabulary 章節(jié)
- 使用INPreferences類獲取Siri語言與本地化內(nèi)容。使用這些信息格式化你的應(yīng)用和擴(kuò)展的任何內(nèi)容。有關(guān)更多信息,請參見?INPreferences Class Reference。
- 創(chuàng)建?INInteraction?對象,當(dāng)你想要donate系統(tǒng)的相互作用,創(chuàng)建 INInteraction 對象。donate的相互作用,可以提供用戶正在做什么的上下文? 。系統(tǒng)和其他應(yīng)用程序可以使用這些信息來改善搜索結(jié)果,提供更好的用戶體驗(yàn)。更多的信息,請參閱?INInteraction Class Reference。
Siri 國際化
用戶可以為了Siri配置不同的語言。在 iOS應(yīng)用程序中,系統(tǒng)使用特定的設(shè)備的語言設(shè)置檢索本地化的內(nèi)容。在您的意圖擴(kuò)展中,系統(tǒng)檢索使用 Siri 語言的本地化的內(nèi)容。如果您的應(yīng)用程序與您的擴(kuò)展共享本地化的內(nèi)容,您必須使用 Siri 語言共享內(nèi)容,您的應(yīng)用程序可以通過INPreferences類的?siriLanguageCode?方法檢索。 Siri語言的更多信息,請參閱INPreferences Class Reference解析和處理意圖 Resolving and Handling Intents
在您的意圖擴(kuò)展中,處理程序?qū)ο蟮闹匾ぷ骶褪?、解?#xff0c; 確認(rèn),并處理Siri發(fā)送的意圖對象。每個(gè)意圖對象有一個(gè)相關(guān)聯(lián)的協(xié)議,為處理意圖專門設(shè)計(jì)的。例如,INRequestRideIntent?對象的處理程序采用?INRequestRideIntentHandling?協(xié)議。
每個(gè)協(xié)議的方法分為三組:
- 為解析意圖參數(shù)的零個(gè)或更多的方法
- Siri 提供的建議響應(yīng)的確認(rèn)方法
執(zhí)行任務(wù)的處理方法
當(dāng)實(shí)現(xiàn)一個(gè)處理程序,您總是必須實(shí)現(xiàn)處理意圖的方法。所有其他方法都是可選,但建議,解析和確認(rèn)方法是在你試圖處理它之前的機(jī)會(huì)來驗(yàn)證一個(gè)意圖的內(nèi)容。您還可以使用這些方法來標(biāo)識(shí)或創(chuàng)建您需要處理的意圖的內(nèi)部數(shù)據(jù)對象。
意圖和相應(yīng)的意圖處理協(xié)議的列表,參閱Intents Domains。解析意圖的參數(shù)
在意圖的決議階段,Siri 會(huì)詢問您的處理程序來解析關(guān)鍵參數(shù),確認(rèn)您要使用的值。因?yàn)閬碜杂脩舻臄?shù)據(jù)是口語,有可能會(huì)丟失或不明確的信息。決議階段是你來驗(yàn)證提供的數(shù)據(jù)的機(jī)會(huì),并讓 Siri 知道是否你需要澄清或更多的信息。建議您執(zhí)行所有決議方法為給定的處理程序的協(xié)議。雖然你不可能使用的所有參數(shù),每個(gè)方法告訴 Siri 是否您在您自己的數(shù)據(jù)結(jié)構(gòu)中確定一個(gè)適當(dāng)?shù)闹怠?/span>您將組織決議結(jié)果反饋到SiriKit后使用決議后結(jié)果對象,結(jié)果對象是INIntentResolutionResult類的實(shí)例。您可能需要去解析不同的子類的每個(gè)參數(shù)的類型。例如,當(dāng)解析格式化一個(gè)INPerson對象, 你會(huì)返回?INPersonResolutionResult?類的一個(gè)實(shí)例。實(shí)例化你的子類使用對應(yīng)于您決議的結(jié)果的對應(yīng)方法。表 3-1 列出了可能的結(jié)果和解釋什么時(shí)候使用哪一個(gè)。
| 你成功的匹配到了值 | 指定該決議,當(dāng)你成功地驗(yàn)證了參數(shù)和相應(yīng)的值可以用來處理的意圖時(shí)。這個(gè)結(jié)果是最可取的,因?yàn)樗恍枰M(jìn)一步的用戶交互, 你應(yīng)該采取措施來解析參數(shù)成功。 例如,您可以利用用戶模式或最喜歡的識(shí)別可能值參數(shù)。 |
| 一個(gè)值并不是必需的 | 指定該決議時(shí)不需要參數(shù)的值來處理意圖。通常,返回這個(gè)結(jié)果只有當(dāng)一個(gè)參數(shù)使用的一些時(shí)間和當(dāng)前沒有相關(guān)。 例如,當(dāng)意圖包含為一個(gè)開放的健身目標(biāo)時(shí)您可能會(huì)返回這個(gè)結(jié)果,通常沒有目標(biāo)。 |
| 值需要消歧 | 指定該決議,當(dāng)確定兩個(gè)或兩個(gè)以上可能的結(jié)果時(shí),不能選擇一個(gè)明確的結(jié)果。這個(gè)結(jié)果通常會(huì)導(dǎo)致額外的用戶交互來消除歧義參數(shù)。 例如,如果一個(gè)消息接收者被稱為“Brandon”但是用戶有兩個(gè)聯(lián)系人叫這個(gè)名字,你可以用這個(gè)結(jié)果尋求幫助,選擇正確的一個(gè)。 |
| 值需要用戶確認(rèn) | 指定這個(gè)結(jié)果時(shí), 當(dāng)你想讓Siri提示用戶確認(rèn)的指定值。Siri總是要求確認(rèn)涉及金融交易的意圖,但是你可以在這種這種情況下使用,您希望用戶確認(rèn)你提供的值。 例如,您可以請求確認(rèn)收件人的音頻電話。 |
| 值需要更多的細(xì)節(jié) | 對于一個(gè)給定的信息不完整的參數(shù)指定這個(gè)結(jié)果時(shí)。一些參數(shù)是一對象可能有多個(gè)信息。 例如,使用這個(gè)結(jié)果如果一個(gè)INPerson對象不包含足夠的細(xì)節(jié)來識(shí)別一個(gè)特定的聯(lián)系人和你不能從可用的信息作出合理的猜測。使用這個(gè)決議,要求用戶提供錯(cuò)過的的信息。 |
| 值是必需的 | 所需參數(shù)的值丟失時(shí)指定這個(gè)結(jié)果。Siri詢問您的擴(kuò)展來解析每一個(gè)參數(shù),不管用戶是否指定一個(gè)參數(shù)的值。當(dāng)您需要一個(gè)值去處理的時(shí)候使用這個(gè)決議繼續(xù)。 例如,如果用戶請求付款沒有指定數(shù)量,您可能會(huì)返回這個(gè)結(jié)果,。 |
| 值是不支持的 | 當(dāng)你的應(yīng)用程序不支持一個(gè)特定的值或值與其他參數(shù)沖突指定這個(gè)結(jié)果。您必須指定一個(gè)參數(shù)為什么無效的原因。你也可以選擇指定有效的替代值。 例如,您可能會(huì)返回這個(gè)結(jié)果當(dāng)用戶想要發(fā)送一個(gè)支付瑞士法郎,但你的應(yīng)用需要?dú)W元或美元。當(dāng)提供一個(gè)列表的替代值時(shí),只提供最可能的替代值,而不是每一個(gè)可能的值。提供太多的選擇可能會(huì)讓用戶很難選擇正確的一個(gè)。 |
當(dāng)解析參數(shù)時(shí),盡可能快的試圖達(dá)到一個(gè)成功決議。要求更多的信息會(huì)導(dǎo)致額外的用戶交互和額外的處理程序調(diào)用,它會(huì)增加延遲和可能阻撓用戶。相反,基于用戶的模式和習(xí)慣盡量選擇合理的值,并要求消歧或只在需要的時(shí)候確認(rèn)。
清單 3-1 顯示一個(gè)例子,從車輛預(yù)約app到驗(yàn)證還車地點(diǎn)。如果一個(gè)還車地點(diǎn)是存在的,該方法將返回一個(gè)成功的結(jié)果;否則,該方法返回一個(gè)結(jié)果表明返回值是必須的
清單3-1 解析意圖所需的參數(shù)
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //Objective-c - (void)resolveDropOffLocationForRequestRide:(INRequestRideIntent *)requestRideIntent ????????????withCompletion:(void (^)(INPlacemarkResolutionResult *resolutionResult))completion { ????CLPlacemark* location = requestRideIntent.dropOffLocation; ????INPlacemarkResolutionResult* result = nil; ????if (location) { ?????? // Use the specified drop-off location. ?????? result = [INPlacemarkResolutionResult successWithResolvedPlacemark:location]; ????} ????else { ?????? // Ask for the drop-off location. ?????? result = [INPlacemarkResolutionResult needsValue]; ????} ????// Execute the completion block with the result. ????completion(result); } |
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //Swift func resolveDropOffLocation(forRequestRide intent: INRequestRideIntent, ????????????????????????????with completion: (INPlacemarkResolutionResult) -> Void) { ????let location = intent.dropOffLocation ????var result : INPlacemarkResolutionResult ???? ????if location != nil { ????????// Use the specified drop-off location. ????????result = INPlacemarkResolutionResult.success(with: location!) ????} ????else { ????????// Ask for the drop-off location. ????????result = INPlacemarkResolutionResult.needsValue() ????} ???? ????// Execute the completion block with the result. ????completion(result); } |
?
確認(rèn)請求
所有意圖的參數(shù)已獲得圓滿的解析后,處理程序被要求確認(rèn)的意圖的詳細(xì)信息,提出一個(gè)響應(yīng)。 所有參數(shù)都已成功地得到解析或不需要繼續(xù)解析滿意的決議。在確認(rèn)期間,您可以執(zhí)行額外的驗(yàn)證所有意圖參數(shù),確保您可以使用該信息來執(zhí)行所請求的服務(wù)。
在您的處理程序中實(shí)現(xiàn)確認(rèn)方法不是必需的但是強(qiáng)烈建議。Siri總是提示用戶確認(rèn)重要的請求,特別是那些不能撤銷或涉及金融交易。Siri在其他情況下可能或不會(huì)提示用戶。無論哪種方式,執(zhí)行確認(rèn)方法是好的方式,以確保您能夠提供響應(yīng)。
清單 3-2 顯示了開始健身的簡單確認(rèn)方法。確認(rèn)方法的主要工作是執(zhí)行提供的block與響應(yīng)對象。本示例創(chuàng)建一個(gè)響應(yīng)對象,表明健身可以成功啟動(dòng)。如果你想要執(zhí)行任何額外的驗(yàn)證,可以使用此方法去做。
清單3-2 確認(rèn)健身的開始
?
| 1 2 3 4 5 6 7 8 9 10 11 12 | //Objective-c - (void)confirmStartWorkout:(INStartWorkoutIntent *)startWorkoutIntent ???????????????? completion:(void (^)(INStartWorkoutIntentResponse * _Nonnull))completion { ?? NSUserActivity??*activity = [[NSUserActivity alloc] ????????????initWithActivityType:@"startWorkoutActivityType"]; ?? INStartWorkoutIntentResponse* response = [[INStartWorkoutIntentResponse alloc] ????????????initWithCode:INStartWorkoutIntentResponseCodeSuccess userActivity:activity]; ?? // Perform any final validation. ?? completion(response); } |
?
| 1 2 3 4 5 6 7 8 9 10 11 | //Swift ????func confirmStartWorkout(startWorkout intent: INStartWorkoutIntent, ???????????????????????????? completion: (INStartWorkoutIntentResponse) -> Void) { ????????let activity = NSUserActivity(activityType: "startWorkoutActivityType") ????????let response = INStartWorkoutIntentResponse(code: .success, userActivity: activity) ???????? ????????// Perform any final validation. ???????? ????????completion(response) ????} |
了解每個(gè)意圖創(chuàng)建的響應(yīng)對象的更多信息,參閱Intents Domains。
處理請求
處理的意圖的最后階段是執(zhí)行意圖與意圖關(guān)聯(lián)的操作。您的處理程序?qū)ο蟮奶幚矸椒ㄓ袃蓚€(gè)責(zé)任 ︰
- 執(zhí)行與意圖相關(guān)聯(lián)的任務(wù)
- 返回一個(gè)關(guān)于你的應(yīng)用的響應(yīng)對象信息。
處理一個(gè)任務(wù)時(shí),連接到你的服務(wù)并執(zhí)行相關(guān)任務(wù)。執(zhí)行任務(wù)的實(shí)現(xiàn)細(xì)節(jié)完全是你的責(zé)任。例如,旅行預(yù)訂服務(wù)連接到公司網(wǎng)絡(luò)服務(wù)器請求和返回結(jié)果。
除了執(zhí)行任務(wù),創(chuàng)建一個(gè)響應(yīng)對象包含你的詳細(xì)信息。信息中放入每個(gè)不同意圖的響應(yīng)對象 ,和可能比其他人需要更多的信息的一些響應(yīng)對象。你也應(yīng)該為NSUserActivity對象提供任何額外的細(xì)節(jié),您的應(yīng)用程序可能需要繼續(xù)任務(wù)。用戶可以選擇立即啟動(dòng)您的應(yīng)用程序以獲得更多細(xì)節(jié)。如果發(fā)生這種情況,用戶活動(dòng)對象activity object應(yīng)包含任何信息,您需要配置您的應(yīng)用程序的界面接口與任務(wù)的細(xì)節(jié)。
清單3顯示了一個(gè)處理方法,剛開始健身的狀態(tài)報(bào)告。在這個(gè)例子中,該處理程序調(diào)用自定義方法,通知指定的應(yīng)用程序開始健身前返回一個(gè)響應(yīng)給Siri。
清單3-處理健身的開始
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | //Objective-C - (void)handleStartWorkout:(INStartWorkoutIntent *)startWorkoutIntent ????????????????completion:(void (^) (INStartWorkoutIntentResponse * _Nonnull))completion { ?? NSUserActivity??*activity = [[NSUserActivity alloc] ?????????????? initWithActivityType:@"startWorkoutActivityType"]; ?? INStartWorkoutIntentResponse* response = [[INStartWorkoutIntentResponse alloc] ?????????????? initWithCode:INStartWorkoutIntentResponseCodeSuccess userActivity:activity]; ?? // Do the work… ?? [self startWorkoutWithName:startWorkoutIntent.workoutName]; ?? completion(response); } |
?
| 1 2 3 4 5 6 7 8 9 10 11 | //Swift func handleStartWorkout(startWorkout intent: INStartWorkoutIntent, ????????????????????????completion: (INStartWorkoutIntentResponse) -> Void) { ????let activity = NSUserActivity(activityType: "startWorkoutActivityType") ????let response = INStartWorkoutIntentResponse(code: .success, userActivity: activity) ???? ????// Do the work… ????self.startWorkout(startWorkoutIntent.workoutName!) ???? ????completion(response) } |
在您的意圖擴(kuò)展所做的更改也應(yīng)反映在你的 iOS 應(yīng)用程序的界面。作為處理任務(wù)的一部分,您的擴(kuò)展應(yīng)將任何所需的數(shù)據(jù)提供給你的iOS 應(yīng)用程序。即使您可以提供一個(gè)?INInteraction?對象與意圖和您的響應(yīng)的詳細(xì)信息,在所有情況下用戶活動(dòng)對象(activity objects)不會(huì)傳遞到您的應(yīng)用程序。例如,用戶可能會(huì)啟動(dòng)應(yīng)用程序,而無需使用切換。為了確保您的應(yīng)用程序是最新的,您的擴(kuò)展可以放置任何更新文件在您的應(yīng)用程序可訪問的的共享容器。您的應(yīng)用程序然后可以使用后臺(tái)應(yīng)用程序刷新以獲取任何更改和更新。
了解每個(gè)意圖創(chuàng)建的響應(yīng)對象的更多信息,參閱Intents Domains。
指定自定義詞匯表 Specifying Custom Vocabulary
Apps有自定義的詞匯可以告知 Siri 對該詞匯的正確使用。自定義詞匯是指 Siri 可能不理解自然語言的任何術(shù)語。例如,一個(gè)車輛預(yù)訂app引用的特定車輛類型"Vroom",app為 Siri 定義這個(gè)詞,并提供有關(guān)用戶如何使用它的例子。定義您的應(yīng)用程序的詞匯給 Siri ,了解有關(guān)您的應(yīng)用程序的用戶命令,有助于提高整體的用戶體驗(yàn)。
有兩種方法來定義應(yīng)用程序的自定義詞匯:
- 若要注冊特定于單個(gè)用戶的術(shù)語,請使用?INVocabulary?對象。
- 若要向您的應(yīng)用所有用戶程序注冊共同的術(shù)語,請將?AppIntentVocabulary.plist?文件添加到您的 iOS 應(yīng)用程序。
重要提醒:Siri 對待自定義詞匯作為提示,Siri會(huì)納入盡可能多的你自定義的詞匯。然而,自定義詞匯的空間是有限的,你注冊過多的詞匯的用法可能會(huì)混淆,否則,保持注冊術(shù)語總數(shù)盡可能小。
注冊特定用戶詞匯
使用共享的 INVocabulary 對象來注冊,特定于單個(gè)用戶的詞匯。特定于用戶的術(shù)語必須屬于以下類別之一 ︰
- 聯(lián)系人姓名 (如果他們不受contacts框架管理)
- 照片標(biāo)簽
- 圖片專輯名稱
- 運(yùn)動(dòng)名稱
當(dāng)選擇詞匯來注冊,選擇術(shù)語可能會(huì)被不熟悉您的應(yīng)用程序的人誤解。例如,消息的應(yīng)用程序(messaging app)可能注冊屏幕名稱從用戶的收藏夾列表。請不要注冊很容易理解的術(shù)語,如"我的相冊"或"我的健身"的條目。相反,專注于其字面意思不同于您的應(yīng)用程序使用中的這些術(shù)語的詞匯。
注冊的每個(gè)類別的術(shù)語集,使用 setVocabularyStrings:ofType: 方法。注冊一套新的術(shù)語替換為該類別舊的的條目,因此你需要您每次調(diào)用該方法。不要包括每個(gè)可用的可能的術(shù)語。相反,專注于與用戶的收藏夾、常用的術(shù)語或最近使用的術(shù)語相關(guān)的術(shù)語。最重要的是術(shù)語總是應(yīng)該在你創(chuàng)建的 NSOrderedSet 對象中。
清單 4-1 顯示了注冊自定義的健身術(shù)語集的示例。應(yīng)用程序排序的基礎(chǔ)使用了他們最后一次的健身的名稱,把大部分用于健身的術(shù)語放到ordered set中。通常情況下,您注冊用戶特定術(shù)語不是從您的應(yīng)用程序中,而是從您的意圖擴(kuò)展。
清單4-注冊特定于用戶的詞匯
?
| 1 2 3 4 5 6 | //Objective-C NSOrderedSet* workoutNames = [self sortedWorkoutNames]; INVocabulary* vocabulary = [INVocabulary sharedVocabulary]; [vocabulary setVocabularyStrings:workoutNames ??????????????ofType:INVocabularyStringTypeWorkoutActivityName]; |
?
| 1 2 3 4 5 | //Swift let workoutNames = self.sortedWorkoutNames() let vocabulary = INVocabulary.shared() vocabulary.setVocabularyStrings(workoutNames, of: .workoutActivityName) |
?
注冊一套術(shù)語并不是一個(gè)保證他們之后會(huì)受到 Siri識(shí)別。Siri將您提供任何術(shù)語視,如果它可以提示和使用它們。如果它可以。為此,
重要的是關(guān)注那些術(shù)語對于你的應(yīng)用程序是唯一的或者特定用戶的條件使用,不要包括通用術(shù)語或用戶不會(huì)通過Siri說出來的術(shù)語。
關(guān)于注冊用戶特定詞匯表術(shù)語的額外信息,請參閱INVocabulary Class Reference
創(chuàng)建全局的詞匯文件
使用一個(gè)全局詞匯表文件登記詞匯對于應(yīng)用程序的所有用戶是很常見的。全局術(shù)語必須屬于下列情形之一:
- 路線的選擇? Ride options
- 健身的名稱 Workout names
一個(gè)全局性的詞匯文件是稱為?AppIntentVocabulary.plist?的屬性列表文件。將此文件放在.lproj?目錄中對應(yīng)于您的應(yīng)用程序基礎(chǔ)的開發(fā)語言。在您的應(yīng)用程序的特定的語言的項(xiàng)目?(.lproj)?目錄中包含本地化的版本。在 Xcode中,你可以從文件檢查器創(chuàng)建本地化的版本自動(dòng)的。
創(chuàng)建全局詞匯表文件
全局詞匯表文件包在根級別含兩個(gè)鍵:
- ParameterVocabularies?鍵定義您的應(yīng)用程序的自定義術(shù)語和適用的意圖參數(shù)。
- IntentPhrases?鍵包含包含您自定義的術(shù)語的示例短語
對于每個(gè)自定義的術(shù)語,指定術(shù)語,該術(shù)語所適用的意圖屬性。一個(gè)單一的術(shù)語可能與多個(gè)意圖關(guān)聯(lián)。例如,自定義健身名稱可以同樣適用于所有其他的健身有關(guān)的意圖類。除了術(shù)語和意圖的信息,同時(shí)為SiriKit放置意圖對象,指定對象標(biāo)識(shí)符字符串。在解析期間,你將解析該標(biāo)識(shí)符字符串為健身。
重要提示:在開發(fā)過程中,Xcode 將全局詞匯轉(zhuǎn)發(fā)到Siri,但會(huì)限制詞匯對你開發(fā)設(shè)備的可用性。遷移你的詞匯量數(shù)據(jù)不是即時(shí)的,所以你可能測試任何自定義的詞匯前需要等待一兩分鐘。
關(guān)于全局詞匯表文件的詳細(xì)信息的結(jié)構(gòu)和鍵,參閱?App Vocabulary File Format。
提供自定義的界面 Providing a Custom Interface
Siri 和地圖應(yīng)用程序顯示您的意圖擴(kuò)展所提供的信息,但您可以自定義所顯示的內(nèi)容,使用意圖UI擴(kuò)展部分(Intents UI extension)。意圖用戶界面擴(kuò)展的用途是自定義的 Siri 或地圖的界面,以便讓用戶知道是您的應(yīng)用程序提供響應(yīng)。例如,您可能會(huì)添加到你的品牌相關(guān)的視覺元素或提供額外的信息與相關(guān)的請求,但不是標(biāo)準(zhǔn)界面的一部分。
意圖 UI 擴(kuò)展(Intents UI extension)包含一個(gè)視圖控制器與您的應(yīng)用程序響應(yīng)相關(guān)的信息。您可以自定義顯示信息的任何或所有您的應(yīng)用程序支持的意圖。當(dāng)顯示響應(yīng)的一個(gè)受支持的意圖時(shí),Siri 和地圖融入從意圖戶UI擴(kuò)展中的視圖控制器到他們顯示的界面中。
使用傳遞到你的視圖控制器的響應(yīng)數(shù)據(jù)配置任何視圖的內(nèi)容并決定要顯示什么內(nèi)容。你可能會(huì)顯示任何有關(guān)您的品牌或?qū)τ脩粲杏玫男畔?。但是。。。你可能無法顯示廣告。
您可以提供意圖UI擴(kuò)展來支持相關(guān)的車輛預(yù)定、 消息、 付款及健身的意圖。哪些情況可能會(huì)使用到意圖UI界面擴(kuò)展的,一些例子如下 ︰
- 打車。顯示附加車輛詳細(xì)信息和品牌。
- 消息。使用你的品牌的顏色和樣式顯示消息內(nèi)容。
- 付款。顯示品牌或其他付款相關(guān)的信息。
- 健身。顯示自定義健身信息和品牌。
意圖 UI 擴(kuò)展可能支持多個(gè)的意圖,但所有的意圖共享相同的視圖控制器。您的視圖控制器基于當(dāng)前的意圖和顯示環(huán)境影響不同接收到足夠的信息來配置本身。大多數(shù)的意圖通過Siri顯示 ,但車輛預(yù)定意圖通常顯示在地圖應(yīng)用程序中。
配置你的Xcode工程
要自定義的?Siri?界面,請將意圖?UI?擴(kuò)展?添加到您的?iOS?應(yīng)用程序。創(chuàng)建您的意圖擴(kuò)展時(shí),您可以添加此擴(kuò)展或晚些時(shí)候你可以將其添加到您的項(xiàng)目。 添加意圖擴(kuò)展到你的應(yīng)用程序- 在 Xcode 中打開您現(xiàn)有的 iOS 應(yīng)用程序項(xiàng)目。
- 選擇File > New > Target。
- 從 iOS 應(yīng)用程序擴(kuò)展組(?iOS Application Extension)中,選擇意圖UI界面擴(kuò)展(Intents UI extension)。
- 單擊Next。
- 指定您的擴(kuò)展的名稱和配置語言和其他選項(xiàng)。
- 單擊Finished。
Xcode 提供的意圖UI擴(kuò)展模板包含演示圖板與單一視圖控制器。Siri 和地圖總是加載和storyboard文件中顯示的initial view controller,因此配置該視圖控制器與你想要顯示的內(nèi)容。如果你想要顯示的視圖的每個(gè)意圖不同視圖集,創(chuàng)建子視圖控制器并將它們嵌入到您在運(yùn)行時(shí)的初始視圖控制器。
您的意圖UI擴(kuò)展的?Info.plist?文件告訴 Siri支持哪些意圖擴(kuò)展。表 5-1 列出必須包含在您的擴(kuò)展的?Info.plist?文件中的NSExtension?鍵。您在?NSExtensionAttributes關(guān)聯(lián)的字典中鍵指定支持的意圖。
表5-1 意圖UI擴(kuò)展的plist文件Keys信息
| NSExtensionAttributes | 與此鍵關(guān)聯(lián)的詞典必須包含其值是一個(gè)字符串?dāng)?shù)組,IntentsSupported?鍵。每個(gè)字符串的值是擴(kuò)展支持意圖類的名稱。 |
| NSExtensionMainStoryboard | 此鍵的值是包含您的擴(kuò)展視圖控制器的。storyboard文件的名稱。如果您希望以編程方式創(chuàng)建您的視圖控制器的系統(tǒng),可以用 NSExtensionPrincipalClass 鍵代替這一個(gè)。 |
| NSExtensionPointIdentifier | 這個(gè)鍵的值必須為字符串?com.apple.intents-ui-service. |
實(shí)現(xiàn)視圖控制器
顯示響應(yīng)之前,您的意圖UI界面擴(kuò)展storyboard的初始視圖控制器initial view controller負(fù)責(zé)顯示您的內(nèi)容。Siri 或地圖應(yīng)用程序加載該視圖控制器和調(diào)用其 configureWithInteraction:context:completion ︰方法。使用該方法從交互對象來配置您的視圖控制器的內(nèi)容和編寫它出現(xiàn)在屏幕上。使用上下文參數(shù)并根據(jù) Siri 或映射接口需要調(diào)整您的內(nèi)容的演示文稿。
在屏幕上,你的視圖控制器仍是foreground interface的一部分,直到用戶dismisses了Siri或者地圖界面。你可以根據(jù)需要更新您的視圖控制器的接口使用計(jì)時(shí)器或其他編程手段,和視圖控制器參與正常視圖控制器進(jìn)程加載時(shí),顯示和隱藏。雖然在屏幕上,你的視圖控制器不接收觸摸事件和其他響應(yīng)鏈responder-chain事件,你不能添加手勢識(shí)別器或試圖攔截事件在其他途徑。因此,需要用戶交互不應(yīng)該包括控制或視圖
圖 5-1 顯示您的意圖UI擴(kuò)展和其視圖控制器的生命周期。系統(tǒng)創(chuàng)建您的視圖控制器并調(diào)用其 configureWithInteraction:context:completion ︰方法,交互對象傳遞給它后您需要配置您的界面。配置完成后,您的視圖控制器與其余的 Siri 或地圖的內(nèi)容顯示在屏幕上。雖然在屏幕上,您的視圖控制器可以運(yùn)行動(dòng)畫并更新本身使用計(jì)時(shí)器和其他的手段,但它不能接收觸摸事件或響應(yīng)鏈?zhǔn)录?/p>
圖5-1 意圖UI擴(kuò)展的生命周期
當(dāng)用戶關(guān)閉 Siri 或地圖的界面時(shí),系統(tǒng)將釋放其引用到你的視圖控制器和您的意圖UI擴(kuò)展。視圖控制器應(yīng)僅用于顯示信息。當(dāng)您的視圖控制器移動(dòng)屏幕外,不要試圖將數(shù)據(jù)保存或與您的應(yīng)用程序直接溝通。
這里有一些建議來實(shí)現(xiàn)對你的意圖UI視圖控制器擴(kuò)展:
- 將你的品牌納入到你的界面。使用您的應(yīng)用程序的顏色、 圖像和其他設(shè)計(jì)元素,這是一個(gè)偉大的方式來增加熟悉和傳達(dá)您的應(yīng)用程序的存在。
- 子視圖控制器child view controllers用于不同類型的內(nèi)容之間進(jìn)行切換。您的意圖UI擴(kuò)展了只有一個(gè)主視圖控制器。如果您想顯示不同的內(nèi)容,不同的意圖,使用子視圖控制器管理視圖相關(guān)的意圖。在你的configureWithInteraction:context:completion ︰?方法、 安裝基于提供的意圖對象的子視圖控制器。
- 在視圖控制器可見時(shí)配置任何動(dòng)畫的內(nèi)容運(yùn)行。視圖控制器?viewDidAppear ︰?調(diào)用方法來啟動(dòng)動(dòng)畫。在視圖控制器viewWillDisappear ︰?方法停止動(dòng)畫。
- 盡可能快地配置您的視圖控制器的視圖,這樣 Siri可以顯示它。您的視圖控制器可能不在屏幕上很長時(shí)間,所以配置大量使用本地資源和提供的INInteraction?對象。如果您需要從服務(wù)器獲取更多的信息,異步請求和然后更新您的界面。
- 在界面中不要包含廣告。可以包括品牌和與用戶相關(guān)的信息,但禁止廣告。
配置視圖控制器的更多信息,請參閱INUIHostedViewControlling Protocol Reference
替換默認(rèn)界面
車輛預(yù)訂和消息意圖,如果它與您提供的內(nèi)容相沖突,你可以隱藏由系統(tǒng)提供默認(rèn)內(nèi)容。對于消息的意向,Siri 會(huì)顯示消息內(nèi)容和收件人。對于車輛預(yù)訂意圖,Siri 和地圖應(yīng)用程序顯示一張地圖,顯示用戶的位置。如果你你自己的界面提供相同的信息,使用?INUIHostedViewSiriProviding?協(xié)議的屬性來禁止顯示的系統(tǒng)界面。
轉(zhuǎn)載于:https://www.cnblogs.com/yuwei0911/p/6070708.html
總結(jié)
- 上一篇: linux下普通用户如何使用80端口启动
- 下一篇: 旧题复习{6}