SiriKit框架詳細(xì)解析(五) —— 編程指南之Intents和Intents UI擴(kuò)展(一)

版本記錄

版本號(hào) 時(shí)間
V1.0 2018.09.12

前言

大家都知道隨著人工智能的發(fā)展,會(huì)掀起來(lái)另外一個(gè)工業(yè)革命,而語(yǔ)音識(shí)別就是人工智能的初始階段,但是每個(gè)公司做的都不一樣,涉及到一系列的語(yǔ)音的采集和算法實(shí)現(xiàn),蘋果的Siri就是業(yè)界語(yǔ)音識(shí)別的代表性的產(chǎn)品。接下來(lái)的幾篇我們就詳細(xì)解析一下SiriKit這個(gè)框架。感興趣的可以看下面幾篇文章。
1. SiriKit框架詳細(xì)解析(一)—— 基本概覽(一)
2. SiriKit框架詳細(xì)解析(二)—— 請(qǐng)求授權(quán)使用SiriKit和INPreferences類(一)
3. SiriKit框架詳細(xì)解析(三)—— 創(chuàng)建Intents App擴(kuò)展(一)
4. SiriKit框架詳細(xì)解析(四)—— 構(gòu)建代碼以支持App擴(kuò)展和將意圖調(diào)度到處理對(duì)象(一)

開始

SiriKit是您通過(guò)Siri提供內(nèi)容的一種方式。 它還允許您向Maps應(yīng)用添加對(duì)服務(wù)的支持。 要支持SiriKit,您可以使用Intents框架和Intents UI框架來(lái)實(shí)現(xiàn)一個(gè)或多個(gè)擴(kuò)展,然后將這些擴(kuò)展包含在iOS應(yīng)用程序中。 當(dāng)用戶通過(guò)Siri或Maps請(qǐng)求特定類型的服務(wù)時(shí),系統(tǒng)會(huì)使用您的擴(kuò)展來(lái)提供這些服務(wù)。

僅當(dāng)您的應(yīng)用程序?qū)崿F(xiàn)以下類型的服務(wù)之一時(shí)才添加SiriKit支持:

  • 音頻或視頻通話
  • 消息
  • 支付
  • 搜索照片
  • 鍛煉
  • 乘車預(yù)訂

汽車制造商可以使用CarPlay intents允許用戶使用語(yǔ)音命令控制汽車功能。

每種類型的服務(wù)代表您可以支持的功能域,每個(gè)域定義一個(gè)或多個(gè)意圖供您支持。 意圖是表示用戶意圖的對(duì)象。 Siri和Maps創(chuàng)建意圖對(duì)象以響應(yīng)用戶請(qǐng)求,并使用任何用戶指定的信息填充它們。 例如,發(fā)送消息的意圖可能包括消息的接收者和內(nèi)容。 您使用intent對(duì)象提供適當(dāng)?shù)捻憫?yīng)并執(zhí)行相關(guān)的任務(wù)。 有關(guān)支持的域及其意圖的更多信息,請(qǐng)參閱Intents Domains。


The Intents and Intents UI Extensions - Intents和Intents UI擴(kuò)展

SiriMaps通過(guò)兩種不同類型的擴(kuò)展與您的應(yīng)用服務(wù)進(jìn)行互動(dòng):

  • Intents extension將您的應(yīng)用程序內(nèi)容傳遞給Siri和Maps,并執(zhí)行與任何支持的意圖相關(guān)的任務(wù)。
  • Intents UI extension為Siri或Maps界面中的內(nèi)容提供自定義界面。此擴(kuò)展是可選的。

您必須提供Intents擴(kuò)展才能支持SiriKit。您的Intents擴(kuò)展程序負(fù)責(zé)處理意圖并提供Siri和Maps可用于與用戶通信的信息。提供Intents UI擴(kuò)展是可選的,但是通過(guò)Siri與您的應(yīng)用進(jìn)行交互的方式對(duì)您的用戶來(lái)說(shuō)似乎很熟悉。例如,Intents UI擴(kuò)展可以顯示橫幅和其他特定于應(yīng)用的信息,以強(qiáng)化您的應(yīng)用正在提供響應(yīng)。

有關(guān)用于實(shí)現(xiàn)Intents擴(kuò)展的類的信息,請(qǐng)參閱Intents Framework Reference。有關(guān)用于實(shí)現(xiàn)Intents UI擴(kuò)展的協(xié)議的信息,請(qǐng)參閱Intents UI Framework Reference。


The Role of Siri and the Maps App - Siri和Maps應(yīng)用程序的角色

Siri處理將用戶的語(yǔ)音請(qǐng)求轉(zhuǎn)換為擴(kuò)展可以處理的可操作意圖所需的語(yǔ)言處理和語(yǔ)義分析。 Siri和Maps應(yīng)用程序管理所有用戶交互,并使用標(biāo)準(zhǔn)系統(tǒng)界面向用戶顯示結(jié)果。 您的角色主要是提供要顯示的數(shù)據(jù)。 如果您的應(yīng)用程序包含Intents UI擴(kuò)展,您還可以提供自定義界面來(lái)補(bǔ)充默認(rèn)系統(tǒng)界面。

乘車預(yù)訂和餐廳預(yù)訂主要由Maps應(yīng)用程序處理,盡管用戶也可以使用Siri預(yù)訂游樂(lè)設(shè)施。 您的Intents擴(kuò)展程序處理源自Maps應(yīng)用程序的交互,其處理方式與處理來(lái)自Siri的請(qǐng)求的方式相同。 如果您自定義用戶界面,您的Intents UI擴(kuò)展可以根據(jù)請(qǐng)求來(lái)自Siri還是Maps來(lái)進(jìn)行不同的配置。


Creating the Intents Extension - 創(chuàng)建Intents擴(kuò)展

SiriMaps通過(guò)您的Intents擴(kuò)展程序與您的應(yīng)用互動(dòng)。 Intents擴(kuò)展的入口點(diǎn)是INExtension對(duì)象,其唯一的工作是將Siri指向能夠響應(yīng)用戶請(qǐng)求的對(duì)象。實(shí)現(xiàn)Intents擴(kuò)展時(shí),您經(jīng)常使用三種類型的對(duì)象:

  • intent對(duì)象(intent object)定義用戶的意圖并包含Siri從用戶收集的數(shù)據(jù)。
  • 處理程序?qū)ο?code>(handler object)是您定義并用于解析,確認(rèn)和處理意圖的自定義對(duì)象。
  • 響應(yīng)對(duì)象(response object)是包含對(duì)intent的響應(yīng)的數(shù)據(jù)對(duì)象。

當(dāng)您的擴(kuò)展程序有意圖處理時(shí),Siri會(huì)詢問(wèn)您的INExtension對(duì)象是否有能夠處理該意圖的對(duì)象。處理程序?qū)ο罂梢允悄胍娜魏晤愋?,但它必須?shí)現(xiàn)處理給定意圖所需的特定方法。每個(gè)intent都有一個(gè)與其處理程序必須采用的關(guān)聯(lián)協(xié)議。該協(xié)議的方法分為三組:解決方法,確認(rèn)方法和處理方法。您可以實(shí)現(xiàn)所需的方法,并向Siri提供有關(guān)您計(jì)劃如何處理意圖的信息。

圖2-1說(shuō)明了Siri與擴(kuò)展中的處理程序?qū)ο笾g的高級(jí)別流程。在該示例中,當(dāng)用戶要求使用乘車預(yù)訂服務(wù)預(yù)訂乘車時(shí),Siri創(chuàng)建具有乘坐參數(shù)的意圖對(duì)象并將其發(fā)送給處理者。處理程序?qū)ntent對(duì)象中的數(shù)據(jù)解析為可用于完成行程的值。當(dāng)所有騎行參數(shù)都已解決后,Siri要求處理者確認(rèn)其計(jì)劃如何處理乘坐請(qǐng)求并執(zhí)行任何最終驗(yàn)證。在確認(rèn)階段,處理程序提供一個(gè)響應(yīng)對(duì)象,其中包含騎行的詳細(xì)信息,Siri可能會(huì)向用戶顯示。如果用戶接受了乘坐,Siri要求乘車請(qǐng)求處理者處理該意圖。處理程序通過(guò)預(yù)訂車輛并回復(fù)預(yù)訂車輛的詳細(xì)信息來(lái)回應(yīng)。

Figure 2-1 Handling a ride request intent

有關(guān)如何創(chuàng)建擴(kuò)展的一般信息,請(qǐng)參閱App Extension Programming Guide。


Configuring Your Xcode Project - 配置Xcode項(xiàng)目

要支持SiriKit,請(qǐng)?jiān)谀膇OS應(yīng)用中添加Intents extension。

1. To add an Intents extension to your app - 向您的應(yīng)用添加Intents擴(kuò)展程序

  • 1) 在Xcode中打開現(xiàn)有的iOS應(yīng)用程序項(xiàng)目。
  • 2) 選擇File > New > Target。
  • 3) 從適用平臺(tái)的Application Extension組中選擇Intents擴(kuò)展。
  • 4) 點(diǎn)擊下一步。
  • 5) 指定擴(kuò)展名稱并配置語(yǔ)言和其他選項(xiàng)。如果您計(jì)劃自定義Siri界面的某些部分,請(qǐng)啟用“包含UI擴(kuò)展”選項(xiàng)。
  • 6) 單擊完成。

Xcode提供的Intents擴(kuò)展模板包含一個(gè)INExtension子類供您自定義。 您可以使用該類來(lái)創(chuàng)建處理意圖所需的處理程序?qū)ο蟆?Siri使用您的擴(kuò)展的Info.plist文件來(lái)發(fā)現(xiàn)它支持的意圖。 Xcode提供的Info.plist文件主要是配置的,但您必須修改它的一部分以指定擴(kuò)展程序處理的意圖。

2. To specify the intents that your app supports - 指定應(yīng)用支持的意圖

  • 1) 在Xcode中,選擇Intents擴(kuò)展的Info.plist文件。
  • 2) 展開NSExtensionNSExtensionAttributes鍵以查看IntentsSupportedIntentsRestrictedWhileLocked鍵。
  • 3) 在IntentsSupported鍵中,為計(jì)劃支持的每個(gè)intent添加String項(xiàng)。將每個(gè)項(xiàng)的值設(shè)置為intent的類名。

這個(gè)key是必需的。您可以支持給定域中的所有或部分意圖,并且您的擴(kuò)展可以支持任意數(shù)量的域。該值必須包含擴(kuò)展支持的所有intent類。

  • 4) 在IntentsRestrictedWhileLocked鍵中,為僅在用戶設(shè)備解鎖時(shí)支持的任何意圖添加字符串項(xiàng)。將每個(gè)項(xiàng)的值設(shè)置為intent的類名。

此鍵是可選的。該值包含您需要解鎖設(shè)備的intent類的子集。如果處理意圖涉及訪問(wèn)磁盤上的受保護(hù)文件或操縱敏感用戶數(shù)據(jù),則可能在此列表中包含intent。

實(shí)現(xiàn)擴(kuò)展的行為涉及以下任務(wù):

  • Define handler classes for each intent that you support - 為您支持的每個(gè)intent定義處理程序類。您可以為每個(gè)intent定義一個(gè)處理程序類,或者為多個(gè)Intent使用單個(gè)處理程序類。使用協(xié)議可以輕松地將任何對(duì)象轉(zhuǎn)換為意圖的處理程序?qū)ο?。有關(guān)如何實(shí)現(xiàn)處理程序的信息,請(qǐng)參閱Resolving and Handling Intents。

  • Add the custom source files that you need to perform the tasks for any supported intents - 添加為任何支持的意圖執(zhí)行任務(wù)所需的自定義源文件。您的擴(kuò)展程序必須能夠執(zhí)行與任何意圖相關(guān)的任務(wù)。例如,乘車預(yù)訂服務(wù)的處理者必須能夠預(yù)訂乘車并獲得有關(guān)使用該服務(wù)的乘車的信息。將任何源文件添加到您需要實(shí)現(xiàn)的擴(kuò)展項(xiàng)目中;請(qǐng)參閱Structuring Your App’s Services。

  • update the default INExtension class that Xcode provided - 更新Xcode提供的默認(rèn)INExtension類。修改Xcode提供的INExtension子類的handlerForIntent:方法,以創(chuàng)建并返回自定義處理程序?qū)ο?。有關(guān)如何實(shí)現(xiàn)此方法的信息,請(qǐng)參閱INIntentHandlerProviding Protocol Reference。

  • Define any custom vocabulary that your app uses - 定義應(yīng)用使用的任何自定義詞匯表。以特定方式使用單詞或短語(yǔ)的應(yīng)用程序可以定義自定義詞匯表文件,以幫助Siri了解自定義用法。有關(guān)如何為Siri提供應(yīng)用程序自定義詞匯表的信息,請(qǐng)參閱Specifying Custom Vocabulary。

有關(guān)可用意圖的列表以及為每個(gè)意圖實(shí)現(xiàn)的關(guān)聯(lián)類和協(xié)議,請(qǐng)參閱Intents Domains。


Requesting Siri Authorization in Your iOS App - 在您的iOS應(yīng)用程序中請(qǐng)求Siri授權(quán)

在使用Intents擴(kuò)展程序之前,在注冊(cè)任何特定于用戶的詞匯表之前,您的iOS應(yīng)用程序必須請(qǐng)求授權(quán)才能使用Siri。 要請(qǐng)求授權(quán),請(qǐng)執(zhí)行以下操作:

  • 在應(yīng)用的Info.plist文件中包含NSSiriUsageDescription鍵。 此鍵的值是一個(gè)字符串,用于描述應(yīng)用程序在處理意圖時(shí)向Siri發(fā)送的數(shù)據(jù)。 例如,鍛煉應(yīng)用程序可能會(huì)將值設(shè)置為字符串“Workout information will be sent to Siri”
  • 在應(yīng)用程序執(zhí)行期間的某個(gè)時(shí)刻調(diào)用INPreferences的類方法requestSiriAuthorization:。

您的iOS應(yīng)用首次調(diào)用requestSiriAuthorization:方法時(shí),系統(tǒng)會(huì)顯示一條alert彈窗,提示用戶授權(quán)您的應(yīng)用。彈窗包括您在應(yīng)用的Info.plist文件的NSSiriUsageDescription鍵中提供的使用說(shuō)明字符串。用戶可以批準(zhǔn)或拒絕您的應(yīng)用程序的授權(quán)請(qǐng)求,并可以稍后在“設(shè)置”應(yīng)用中更改您應(yīng)用的授權(quán)狀態(tài)。系統(tǒng)會(huì)記住您的應(yīng)用程序的授權(quán)狀態(tài),以便后續(xù)調(diào)用requestSiriAuthorization:方法不會(huì)再次提示用戶。


Structuring Your App’s Services - 構(gòu)建應(yīng)用程序的服務(wù)

您的Intents擴(kuò)展程序是代表您的應(yīng)用程序執(zhí)行的代理程序,應(yīng)該能夠執(zhí)行與您的應(yīng)用程序相同的服務(wù)。由于您的iOS應(yīng)用和Intents擴(kuò)展執(zhí)行許多相同的任務(wù),請(qǐng)考慮以下事項(xiàng):

  • Use a private shared framework to store the code for your core services - 使用私有共享框架來(lái)存儲(chǔ)核心服務(wù)的代碼。將框架鏈接到您的iOS應(yīng)用程序和Intents擴(kuò)展程序。共享框架最小化了可執(zhí)行文件的大小,并確保兩者都使用相同的代碼與您的服務(wù)進(jìn)行交互。

  • Use a shared container to store common resources - 使用共享容器來(lái)存儲(chǔ)公共資源。如果您的服務(wù)使用位于應(yīng)用程序包外部的圖像或數(shù)據(jù)文件,請(qǐng)將這些資源放入共享容器中。在每個(gè)目標(biāo)的“Capabilities”選項(xiàng)卡中啟用共享容器支持。


Testing Your Extension - 測(cè)試你的擴(kuò)展

要測(cè)試Intents擴(kuò)展,必須在設(shè)備上運(yùn)行它。 Xcode支持直接從Xcode項(xiàng)目啟動(dòng)Intents擴(kuò)展,并在設(shè)備上運(yùn)行時(shí)對(duì)其進(jìn)行調(diào)試。

1. To run and debug your Intents extension on a device - 在設(shè)備上運(yùn)行和調(diào)試Intents擴(kuò)展

  • 1) 將活動(dòng)scheme設(shè)置為Intents擴(kuò)展的方案。

當(dāng)您向項(xiàng)目添加Intents擴(kuò)展時(shí),Xcode會(huì)自動(dòng)創(chuàng)建一個(gè)運(yùn)行該擴(kuò)展的scheme。

  • 2) 將scheme配置為在連接的設(shè)備上運(yùn)行。

您無(wú)法在模擬器中調(diào)試Intents擴(kuò)展。

  • 3) 選擇Product > Run以在設(shè)備上啟動(dòng)擴(kuò)展。

  • 4) 當(dāng)Xcode提示時(shí),選擇Siri作為要運(yùn)行的應(yīng)用程序。

Xcode構(gòu)建您的應(yīng)用和擴(kuò)展,將它們安裝在設(shè)備上,然后啟動(dòng)Siri。

首次安裝您的擴(kuò)展程序時(shí),Siri可能無(wú)法立即識(shí)別您的應(yīng)用擴(kuò)展程序。您可能需要等待幾分鐘才能發(fā)出任何相關(guān)命令。同樣,在更新Info.plist文件時(shí),您可能需要等待幾分鐘,然后Siri才能識(shí)別出更改。


Using the Intents Framework From Your iOS App - 使用iOS應(yīng)用程序中的Intents框架

您的iOS應(yīng)用程序使用Intents框架執(zhí)行特定任務(wù):

  • 使用INVocabulary類注冊(cè)用戶特定的詞匯表術(shù)語(yǔ)。 僅針對(duì)您的應(yīng)用和特定用戶自定義的術(shù)語(yǔ)注冊(cè)用戶特定詞匯,否則可能會(huì)被Siri誤解; 不要注冊(cè)常見或易于理解的術(shù)語(yǔ)。 有關(guān)注冊(cè)詞匯表的信息,請(qǐng)參閱Specifying Custom Vocabulary。

  • 使用INPreferences類獲取本地化內(nèi)容的Siri語(yǔ)言。 使用此信息來(lái)格式化您的應(yīng)用與擴(kuò)展程序共享的任何內(nèi)容。 有關(guān)更多信息,請(qǐng)參閱INPreferences Class Reference。

  • 如果要將交互移交給系統(tǒng),請(qǐng)創(chuàng)建INInteraction對(duì)象。 通過(guò)移交交互,您可以提供有關(guān)用戶正在執(zhí)行的操作的上下文。 系統(tǒng)和其他應(yīng)用程序可以使用該信息來(lái)改進(jìn)搜索結(jié)果并提供更好的用戶體驗(yàn)。 有關(guān)更多信息,請(qǐng)參閱INInteraction Class Reference。


Internationalization and Siri - 國(guó)際化和Siri

用戶可以為Siri配置與設(shè)備其余部分不同的語(yǔ)言。 在iOS應(yīng)用程序中,系統(tǒng)使用特定于設(shè)備的語(yǔ)言設(shè)置檢索本地化內(nèi)容。 在Intents擴(kuò)展中,系統(tǒng)使用Siri語(yǔ)言檢索本地化內(nèi)容。 如果您的應(yīng)用與擴(kuò)展程序共享本地化內(nèi)容,則必須使用Siri語(yǔ)言共享該內(nèi)容,您的應(yīng)用可以使用INPreferences類的siriLanguageCode方法檢索該語(yǔ)言。

有關(guān)獲取Siri語(yǔ)言的更多信息,請(qǐng)參閱INPreferences Class Reference。


Resolving and Handling Intents - 解決和處理意圖

Intents擴(kuò)展中,處理程序?qū)ο髨?zhí)行解析,確認(rèn)和處理Siri發(fā)送的intent對(duì)象的關(guān)鍵工作。每個(gè)intent對(duì)象都有一個(gè)專門為處理該intent而設(shè)計(jì)的相關(guān)協(xié)議。例如,INRequestRideIntent對(duì)象的處理程序采用INRequestRideIntentHandling協(xié)議。

每種協(xié)議的方法分為三組:

  • 用于解析intent參數(shù)的零個(gè)或多個(gè)方法
  • 一種確認(rèn)方法,為Siri提供您的建議響應(yīng)
  • 執(zhí)行任務(wù)的句柄方法

實(shí)現(xiàn)處理程序時(shí),必須始終實(shí)現(xiàn)處理intent的方法。所有其他方法都是可選的,但建議使用。解決和確認(rèn)方法是您在嘗試處理意圖之前驗(yàn)證意圖內(nèi)容的機(jī)會(huì)。您還可以使用這些方法來(lái)標(biāo)識(shí)或創(chuàng)建處理意圖所需的內(nèi)部數(shù)據(jù)對(duì)象。

有關(guān)意圖列表和相應(yīng)的意圖處理協(xié)議,請(qǐng)參閱Intents Domains。


Resolving the Parameters of an Intent - 解析意圖的參數(shù)

在意圖的解決階段,Siri要求您的處理程序解析關(guān)鍵參數(shù)并確認(rèn)您打算使用的值。因?yàn)檎f(shuō)出了來(lái)自用戶的數(shù)據(jù),所以可能存在丟失或模糊的信息。解決階段是您驗(yàn)證所提供數(shù)據(jù)的機(jī)會(huì),并讓Siri知道您是否需要澄清或更多信息。建議您為給定的處理程序協(xié)議實(shí)現(xiàn)所有解析方法。雖然您可能不會(huì)使用所有參數(shù),但每種方法都會(huì)告訴Siri您是否在自己的數(shù)據(jù)結(jié)構(gòu)中找到了適當(dāng)?shù)闹怠?/p>

您使用解析結(jié)果對(duì)象將解析結(jié)果傳回SiriKit,解析結(jié)果對(duì)象是INIntentResolutionResult類的實(shí)例。您可能需要解析每種參數(shù)類型的不同子類。例如,在以INPerson對(duì)象的形式解析聯(lián)系人時(shí),將返回INPersonResolutionResult類的實(shí)例。實(shí)例化子類時(shí),請(qǐng)使用與解析工作結(jié)果相對(duì)應(yīng)的創(chuàng)建方法。表3-1列出了可能的結(jié)果,并說(shuō)明了何時(shí)使用每種結(jié)果。

Table 3-1 Possible outcomes when resolving intent parameters

Resolution Examples
您已成功匹配該值。 成功驗(yàn)證參數(shù)后指定此結(jié)果,并具有可用于處理意圖的相應(yīng)值。 此結(jié)果是最優(yōu)選的,因?yàn)樗恍枰M(jìn)一步的用戶交互,您應(yīng)該盡可能采取步驟成功解析參數(shù)。 例如,您可以利用用戶模式或收藏夾來(lái)識(shí)別參數(shù)的可能值。
不需要值 如果不需要參數(shù)值來(lái)處理意圖,請(qǐng)指定此結(jié)果。 通常,僅在某些時(shí)間使用參數(shù)且當(dāng)前不相關(guān)時(shí)才返回此結(jié)果。 例如,當(dāng)意圖包含通常沒(méi)有目標(biāo)的開放式鍛煉的目標(biāo)時(shí),您可能會(huì)返回此結(jié)果。
值需要消除歧義 當(dāng)您確定兩個(gè)或更多可能的結(jié)果,但不能明確選擇一個(gè)時(shí),請(qǐng)指定此結(jié)果。 此結(jié)果通常會(huì)導(dǎo)致額外的用戶交互以消除參數(shù)的歧義。 例如,如果郵件收件人僅被標(biāo)識(shí)為“Brandon”,但用戶有兩個(gè)具有該名稱的聯(lián)系人,則可以使用此結(jié)果在選擇正確的聯(lián)系人時(shí)尋求幫助。
該值需要用戶確認(rèn) 如果希望Siri提示用戶確認(rèn)指定值,請(qǐng)指定此結(jié)果。 Siri總是要求確認(rèn)涉及金融交易的意圖,但是如果您希望用戶確認(rèn)您提供的值,您可以使用此方法。 例如,您可以請(qǐng)求確認(rèn)音頻呼叫的收件人。
該值需要更多細(xì)節(jié) 當(dāng)給定參數(shù)的信息不完整時(shí),請(qǐng)指定此結(jié)果。 一些參數(shù)由可能具有多條信息的對(duì)象表示。 例如,如果INPerson對(duì)象不包含足夠的詳細(xì)信息來(lái)標(biāo)識(shí)特定聯(lián)系人,并且您無(wú)法從可用信息中進(jìn)行合理猜測(cè),請(qǐng)使用此結(jié)果。 使用此結(jié)果要求用戶提供缺少的信息。
需要一個(gè)值 缺少必需參數(shù)的值時(shí)指定此結(jié)果。 無(wú)論用戶是否為該參數(shù)指定了值,Siri都會(huì)要求您的擴(kuò)展程序解析每個(gè)參數(shù)。 當(dāng)您需要值進(jìn)行處理時(shí),請(qǐng)使用此結(jié)果。 例如,如果用戶請(qǐng)求其他人付款但未指定金額,則可能會(huì)返回此結(jié)果。
該值不受支持 當(dāng)您的應(yīng)用不支持特定值或該值與其他參數(shù)的值沖突時(shí),請(qǐng)指定此結(jié)果。 您必須指定參數(shù)無(wú)效的原因。 您也可以選擇指定有效的替代值。 例如,當(dāng)用戶想要以瑞士法郎發(fā)送付款時(shí),您可能會(huì)返回此結(jié)果,但您的應(yīng)用需要以歐元或美元進(jìn)行交易。 在提供替代值列表時(shí),僅提供最可能的替代值而不是每個(gè)可能的值。 提供太多選擇可能使用戶難以選擇正確的選擇。

解析參數(shù)時(shí),嘗試盡快達(dá)成成功的解決方案。 詢問(wèn)更多信息會(huì)導(dǎo)致額外的用戶交互以及對(duì)處理程序的額外調(diào)用,從而導(dǎo)致延遲并可能使用戶感到沮喪。 相反,嘗試根據(jù)用戶的模式和習(xí)慣選擇合理的值,并僅在需要時(shí)要求消除歧義或確認(rèn)。

Listing 3-1顯示了乘坐預(yù)訂應(yīng)用程序的示例,該應(yīng)用程序驗(yàn)證了乘車的下車位置。 如果存在一個(gè)下車位置,則該方法返回一個(gè)成功的結(jié)果;否則,該方法返回表示需要該值的結(jié)果。

// Listing 3-1 Resolving a required parameter of an intent

//OC

- (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);
}
// 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);
}

后記

本篇主要講述了編程指南之Intents和Intents UI擴(kuò)展,感興趣的給個(gè)贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容