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