共用方式為


iOS 11 中的 SiriKit 更新

SiriKit 是在iOS 10中引進的,有許多服務網域(包括鍛煉、乘車預約和撥打電話)。 請參閱 SiriKit 概念的 SiriKit 一節,以及如何在應用程式中實作 SiriKit。

Siri 工作清單示範

iOS 11 中的 SiriKit 會新增這些新的和更新的意圖網域:

  • 清單和附注 – 新增! 提供 API,讓應用程式處理工作和筆記。
  • 可視化程序代碼 – 新增! Siri 可以顯示 QR 代碼來共享聯繫人資訊或參與付款交易。
  • 付款 – 已新增付款互動的搜尋和轉移意圖。
  • 車程預約 – 已新增取消車程和意見反應意圖。

其他新功能包括:

  • 替代應用程式名稱 – 提供別名,可協助客戶提供替代名稱/發音,協助 Siri 以您的應用程式為目標。
  • 開始鍛煉 – 提供在背景開始鍛煉的能力。

以下是其中一些功能的說明。 如需其他詳細數據,請參閱 Apple 的 SiriKit 檔

清單和附注

新的清單和記事網域提供 API,讓應用程式透過 Siri 語音要求處理工作和筆記。

工作

  • 具有標題和完成狀態。
  • 選擇性地包含期限和位置。

注意事項

  • 具有標題和內容欄位。

工作和筆記都可以組織成群組。

如何處理 SiriKit 要求

依照下列步驟處理 SiriKit 要求:

  1. 解決 – 驗證參數,並從使用者要求進一步資訊(如有需要)。
  2. 確認 – 可處理要求的最終驗證和驗證。
  3. 句柄 – 執行作業(更新數據或執行網路作業)。

前兩個步驟是選擇性的(雖然鼓勵),而且需要最後一個步驟。 SiriKit 一節中有更詳細的指示。

解決和確認方法

這些選擇性方法可讓您的程式代碼執行驗證、選取預設值,或向使用者要求其他資訊。

例如,介面 IINCreateTaskListIntent 的必要方法是 HandleCreateTaskList。 有四個選擇性方法可提供對 Siri 互動的更多控制權:

  • ResolveTitle – 驗證標題、設定預設標題(如果適當),或發出不需要數據的訊號。
  • ResolveTaskTitles – 驗證使用者所說的工作清單。
  • ResolveGroupName – 驗證組名、選擇預設群組,或發出不需要數據的訊號。
  • ConfirmCreateTaskList – 驗證您的程式代碼可以執行要求的作業,但不會執行它(只有 Handle* 方法應該修改數據)。

處理意圖

清單和附注網域中有六個意圖,三個用於工作,三個用於附註。 您必須實作以處理這些意圖的方法如下:

  • 針對工作:
    • HandleAddTasks
    • HandleCreateTaskList
    • HandleSetTaskAttribute
  • 如需注意事項:
    • HandleCreateNote
    • HandleAppendToNote
    • HandleSearchForNotebookItems

每個方法都有傳遞給它的特定意圖類型,其中包含 Siri 已從使用者的要求剖析的所有資訊(而且可能在 和 Confirm* 方法中Resolve*更新)。 您的應用程式必須剖析所提供的數據,然後執行一些動作來儲存或處理數據,並傳回 Siri 對使用者說話和顯示的結果。

回應碼

必要 Handle* 和選擇性 Confirm* 方法會藉由在對象上設定值,將響應碼傳遞給其完成處理程式,以指出回應碼。 回應來自 INCreateTaskListIntentResponseCode 列舉:

  • Ready – 在確認階段期間傳回 (亦即,從 Confirm* 方法傳回,但不是從 Handle* 方法傳回)。
  • InProgress – 用於長時間執行的工作(例如網路/伺服器作業)。
  • Success – 回應成功作業的詳細數據(僅限來自 Handle* 方法)。
  • Failure – 表示發生錯誤,且無法完成作業。
  • RequiringAppLaunch – 無法由意圖處理,但可以在應用程式中執行作業。
  • Unspecified – 請勿使用:錯誤訊息會顯示給使用者。

在 Apple 的 SiriKit 清單和附註檔中深入了解這些方法和回應。

實作清單和附註

首先,若要新增 SiriKit 支援,請遵循 iOS 應用程式的下列步驟:

  1. 在 Entitlements.plist勾選 SiriKit
  2. Privacy – Siri 使用量描述 金鑰新增至 Info.plist,以及客戶的訊息。
  3. INPreferences.RequestSiriAuthorization在應用程式中呼叫 方法,以提示用戶允許 Siri 互動。
  4. 將 SiriKit 新增至開發人員入口網站上的應用程式識別碼,然後重新建立布建配置檔以包含新的權利。

然後將新的延伸模組專案新增至您的應用程式,以處理 Siri 要求:

  1. 以滑鼠右鍵按下您的方案,然後選擇 [ 新增 > 新增專案...]。
  2. 選擇 [iOS > 擴充>功能意圖擴充功能] 範本。
  3. 將會新增兩個新專案:Intent 和 IntentUI。 自定義 UI 是選擇性的,因此範例只會在 Intent 專案中包含程式代碼

延伸模組項目是處理所有 SiriKit 要求的位置。 作為個別的延伸模組,它不會自動有任何方式與主要應用程式通訊,這通常是透過使用應用程式群組實作共用檔案記憶體來解決。

設定 IntentHandler

類別 IntentHandler 是 Siri 要求的進入點 – 每個意圖都會傳遞至 GetHandler 方法,這個方法會傳回可處理要求的物件。

下列程式代碼顯示簡單的實作:

[Register("IntentHandler")]
public partial class IntentHandler : INExtension, IINNotebookDomainHandling
{
  protected IntentHandler(IntPtr handle) : base(handle)
  {}
  public override NSObject GetHandler(INIntent intent)
  {
    // This is the default implementation.  If you want different objects to handle different intents,
    // you can override this and return the handler you want for that particular intent.
    return this;
  }
  // add intent handlers here!
}

類別必須繼承自 INExtension,而且因為範例會處理清單和附注意圖,所以也會實作 IINNotebookDomainHandling

注意

  • .NET 中有一個慣例,讓介面前面加上大寫 I,Xamarin 會在從 iOS SDK 系結通訊協定時遵守此慣例。
  • Xamarin 也會保留 iOS 中的類型名稱,而 Apple 會使用類型名稱中的前兩個字元來反映類型所屬的架構。
  • Intents針對架構,類型前面會加上 IN* (例如INExtension),但這些不是介面。
  • 它也遵循通訊協定(在 C# 中變成介面),最後會有兩 I個 ,例如 IINAddTasksIntentHandling

處理意圖

每個意圖(新增工作、設定工作屬性等)都會以類似如下所示的單一方法實作。 方法應該會執行三個主要函式:

  1. 處理意圖 – Siri 剖析的數據可在意圖類型特定的物件中使用 intent 。 您的應用程式可能已使用選擇性 Resolve* 方法驗證該數據。
  2. 驗證和更新資料存放區 – 將資料儲存至文件系統(使用應用程式群組,讓主要 iOS 應用程式也可以存取它),或透過網路要求。
  3. 提供回應 – 使用 completion 處理程式將回應傳回 Siri,向使用者讀取/顯示:
public void HandleCreateTaskList(INCreateTaskListIntent intent, Action<INCreateTaskListIntentResponse> completion)
{
  var list = TaskList.FromIntent(intent);
  // TODO: have to create the list and tasks... in your app data store
  var response = new INCreateTaskListIntentResponse(INCreateTaskListIntentResponseCode.Success, null)
  {
    CreatedTaskList = list
  };
  completion(response);
}

請注意, null 會當做第二個參數傳遞至回應 – 這是用戶活動參數,而且未提供時,將會使用預設值。 只要 iOS 應用程式透過 NSUserActivityTypes Info.plist 中的金鑰支援它,您就可以設定自訂活動類型。 然後,當應用程式開啟並執行特定作業時,您可以處理此案例(例如開啟相關檢視控制器,並從 Siri 作業載入資料)。

此範例也會硬式 Success 編碼結果,但在實際案例中,應該新增適當的錯誤報告。

測試片語

下列測試片語應該在範例應用程式中運作:

  • “在 TasksNotes 中使用蘋果、香蕉和梨製作雜貨清單”
  • 「在TasksNotes中新增工作 WWDC」
  • 「將工作 WWDC 新增至 TasksNotes 中的訓練清單」
  • “Mark attend WWDC as complete in TasksNotes”
  • “在任務筆記提醒我回家時買一部iphone”
  • “將購買 iPhone 標示為 TasksNotes 中已完成”
  • “提醒我早上 8 點在任務筆記中離開家”

建立新的清單範例 將工作設定為完整範例

注意

iOS 11 模擬器支援使用 Siri 進行測試(與舊版不同)。

如果在實際裝置上進行測試,別忘了設定您 SiriKit 支援的應用程式識別碼和布建配置檔。

替代名稱

這個新的 iOS 11 功能表示您可以設定應用程式的替代名稱,以協助使用者使用 Siri 正確觸發它。 將下列索引鍵新增至 iOS 應用程式專案的 Info.plist 檔案:

Info.plist 顯示替代應用程式名稱索引鍵和值

設定替代應用程式名稱後,下列詞組也適用於範例應用程式(實際上名為 TasksNotes):

  • “在猴子筆記中使用蘋果、香蕉和梨製作雜貨清單”
  • “在 MonkeyTodo新增工作 WWDC”

疑難排解

執行範例時可能會遇到的一些錯誤,或將 SiriKit 新增至您自己的應用程式:

NSInternalInconsistencyException

Objective-C 擲回例外狀況。 名稱:NSInternalInconsistencyException 原因:使用 <INPreferences:從應用程式0x60400082ff00> 需要權利 com.apple.developer.siri。 您是否在 Xcode 項目中啟用 Siri 功能?

  • SiriKit 會在 Entitlements.plist勾選。

  • Entitlements.plist 是在專案選項>組建 > iOS 套件組合簽署設定。

    顯示權利已正確設定的項目選項

  • ( 適用於裝置部署 )應用程式標識碼已啟用 SiriKit 並已下載布建設定檔。