iOS 11 中的 SiriKit 更新
SiriKit 是在iOS 10中引進的,有許多服務網域(包括鍛煉、乘車預約和撥打電話)。 請參閱 SiriKit 概念的 SiriKit 一節,以及如何在應用程式中實作 SiriKit。
iOS 11 中的 SiriKit 會新增這些新的和更新的意圖網域:
- 清單和附注 – 新增! 提供 API,讓應用程式處理工作和筆記。
- 可視化程序代碼 – 新增! Siri 可以顯示 QR 代碼來共享聯繫人資訊或參與付款交易。
- 付款 – 已新增付款互動的搜尋和轉移意圖。
- 車程預約 – 已新增取消車程和意見反應意圖。
其他新功能包括:
- 替代應用程式名稱 – 提供別名,可協助客戶提供替代名稱/發音,協助 Siri 以您的應用程式為目標。
- 開始鍛煉 – 提供在背景開始鍛煉的能力。
以下是其中一些功能的說明。 如需其他詳細數據,請參閱 Apple 的 SiriKit 檔。
清單和附注
新的清單和記事網域提供 API,讓應用程式透過 Siri 語音要求處理工作和筆記。
工作
- 具有標題和完成狀態。
- 選擇性地包含期限和位置。
注意事項
- 具有標題和內容欄位。
工作和筆記都可以組織成群組。
如何處理 SiriKit 要求
依照下列步驟處理 SiriKit 要求:
- 解決 – 驗證參數,並從使用者要求進一步資訊(如有需要)。
- 確認 – 可處理要求的最終驗證和驗證。
- 句柄 – 執行作業(更新數據或執行網路作業)。
前兩個步驟是選擇性的(雖然鼓勵),而且需要最後一個步驟。 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 應用程式的下列步驟:
- 在 Entitlements.plist 中勾選 SiriKit。
- 將 Privacy – Siri 使用量描述 金鑰新增至 Info.plist,以及客戶的訊息。
INPreferences.RequestSiriAuthorization
在應用程式中呼叫 方法,以提示用戶允許 Siri 互動。- 將 SiriKit 新增至開發人員入口網站上的應用程式識別碼,然後重新建立布建配置檔以包含新的權利。
然後將新的延伸模組專案新增至您的應用程式,以處理 Siri 要求:
- 以滑鼠右鍵按下您的方案,然後選擇 [ 新增 > 新增專案...]。
- 選擇 [iOS > 擴充>功能意圖擴充功能] 範本。
- 將會新增兩個新專案: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
。
處理意圖
每個意圖(新增工作、設定工作屬性等)都會以類似如下所示的單一方法實作。 方法應該會執行三個主要函式:
- 處理意圖 – Siri 剖析的數據可在意圖類型特定的物件中使用
intent
。 您的應用程式可能已使用選擇性Resolve*
方法驗證該數據。 - 驗證和更新資料存放區 – 將資料儲存至文件系統(使用應用程式群組,讓主要 iOS 應用程式也可以存取它),或透過網路要求。
- 提供回應 – 使用
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 檔案:
設定替代應用程式名稱後,下列詞組也適用於範例應用程式(實際上名為 TasksNotes):
- “在猴子筆記中使用蘋果、香蕉和梨製作雜貨清單”
- “在 MonkeyTodo 中新增工作 WWDC”
疑難排解
執行範例時可能會遇到的一些錯誤,或將 SiriKit 新增至您自己的應用程式:
NSInternalInconsistencyException
Objective-C 擲回例外狀況。 名稱:NSInternalInconsistencyException 原因:使用 <INPreferences:從應用程式0x60400082ff00> 需要權利 com.apple.developer.siri。 您是否在 Xcode 項目中啟用 Siri 功能?
SiriKit 會在 Entitlements.plist 中勾選。
Entitlements.plist 是在專案選項>組建 > iOS 套件組合簽署中設定。
( 適用於裝置部署 )應用程式標識碼已啟用 SiriKit 並已下載布建設定檔。