概覽
- 最新的WWDC2016大會上,蘋果提出iOS10并推出了十個新特性,homekit、messageapp等等,大部分是基于iPhone原生應用的更新。其中最大的亮點之一是Siri的接口開放,在iOS10中提供了SiriKit框架在用戶使用Siri的時候生成INExtension對象來告知我們的應用,我們可以通過SiriKit提供的API展示給用戶更多的內容,提供更好的體驗。
- Siri通過語言處理系統對用戶發出的對話請求進行解析之后生成一個用來描述對話內容的Intent事件,然后通過SiriKit框架分發給集成框架的應用程序以此來獲取應用的內容,比如通過文字匹配查找應用聊天記錄、聊天對象,蘋果demo演示的通過Siri向指定對象發送信息等功能,此外還支持為用戶使用蘋果地圖時提供應用內置服務等功能。
SiriKit提供以下六類服務
- 語音和視頻通話 VoIP calling
- 發送消息 Messaging
- 收款或者付款 Payments
- 圖片搜索 Photo search
- 管理鍛煉 Workouts
-
行程預約 Ride booking
下面來看一下一個典型的Siri進行交互的語句:
詞匯邏輯
其中有三類關鍵部分:Intent、App以及其他信息。Intent就是我要想要通過Siri去做的事的意圖,App是通過手機安裝的什么App來做,至于其他的Payee、Amount等信息則是通過App去完成Intent的必須信息。而整個Siri的交互過程可以參照下圖:
執行流程
通過Siri來獲取用戶語言中的關鍵詞匯,這些詞匯在Extension中經過一些邏輯處理,最終反饋到用戶界面,與用戶進行交互。
Siri通過Intents extension的擴展方式和我們的應用進行交互,其中Intents Extension扮演協同Siri共同響應用戶的角色,Intents UI Extension可以提供自定義的用戶響應界面,用以增強體驗。
當我們實現了Intents extension擴展并產生了一個Siri請求事件時,Intent(意圖)事件的處理過程分Resolve、Confirm和Handle三個步驟。
Intent處理的三個階段
- Resolve階段:
幫助Siri明白用戶的含義
影響Siri的行為
提供resolution response
在Siri獲取用戶的語音輸入之后,生成一個INIntent對象,將語音中的關鍵信息提取出來并且填充對應的屬性,該對象會傳遞給我們設置好的INExtension子類對象進行處理,根據子類遵循的不同protocol來選擇不同的解決方案。通過handler(for intent:)返回處理intent的對象,此對象會調用resolve打頭的實例方法來對Siri的響應進行一系列的信息處理,比如是否需要進一步的信息提示等。在resolve階段提供了以下方法:
successWithResolvedPerson:成功找到匹配的人
disambiguationWithPeopleToDisambiguate:還需要挑選
confirmationRequiredWithPersonToConfirm:還需要確認下
needMoreDetailsForPerson:還需要更具體的信息,需要Siri進行詢問
unsupportedWithReason:無法使用指定值
needsValue:需要某些必需值
notRequired:應用并沒有要求某些值 -
Confirm階段。
告訴Siri預期結果
檢查必要的狀態
提供Intent response
Siri提供必要的確認提示
Siri進行最后的處理階段,生成答復對象,并且向此intent對象確認處理結果。大概長這樣:
效果圖當然,這個界面是經過自定義的。
- Handle階段:
執行請求操作
提供有關結果足夠精確的信息
如果結果耗時的話還可提供loading
在Confirm方法執行完成之后,然后顯示結果給用戶看。該階段完成后Intent的生命周期結束。
實現一個Siri Kit應用
- 升級到Xcode8,一臺升級到iOS10的測試設備
- Intents extension : resolve、confirm、handle流程
- Intents UI extension 提供界面自定義等內容
- 新建一個空應用并新增一個target
- 新增Intents Extension,創建時會詢問是否激活該擴展且是否將Intents UI Extension一并創建,都選擇是。
-
了解Embedded frameworks
extension
Embedded frameworks
Embedded frameworks是蘋果著重提出來的,主要用于以下幾個方面:
- 網絡服務
- 數據model
- Decision-making logic
- 用戶界面
可以在應用主target以及extension分別引用。
在創建extension之后,我們查看extension的plist文件,默認的plist結構如圖所示:
IntentsSupported表示的是應用支持的Intent事件,IntentsRestrictedWhileLocked表示的是鎖屏下支持的Intent事件。在demo中分別賦值:INSendMessageIntent。還要注意一下NSExtensionPrincipalClass,該項內容表示的是extension響應的入口類。其為INExtension的子類,需要實現handler(for intent: INIntent)方法如下:
用以根據不同的Intent分發各個自定義Handler進行處理。
另外還就是主項目plist 增加NSSiriUsageDescription 這個是請求Siri權限時提示的文案,同時使用Siri時,用戶必須說出App的名字,也就是Bundle display name,都需要進行設置。其中UCSendMessageIntentHandler需要實現INSendMessageIntentHandling中的方法用以與Siri進行交互,也就是Resolve、Confirm和Handler三階段的交互。
示例代碼如下:
-
獲取收件人信息,可以根據自身匹配的信息返回不同狀態與Siri進行進一步的交互。
收件人 -
獲取信息內容,也就是要給收件人發送的信息的具體內容。
信息內容 -
收件人、信息內容確定后,通過Siri向用戶進行信息確認。
confirm -
信息確認后,進行最終信息的發送并向用戶展示結果。
handle
具體展示到界面上的效果圖如下
效果圖
至此,一個完整的通過Siri進行發送信息的完整流程結束。簡要概括整個流程,可以參照蘋果Keynote中的圖示:
protocol三階段
當然,在上面圖例中,有開發者自定義的Siri反饋界面,這個界面的實現主要是通過Intents UI Extension來實現的。有興趣的話,可以自行研究,實現方式也很簡單。UI Extension的plist結構可以參照下圖,只需要設置一下IntentsSupported即可。
plist
總結
雖然蘋果開放了SiriKit的入口,但是總體而言還是限制頗多,具體如何使用還是需要繼續深入挖掘。類似可以自定義應用詞匯、使用UI Extension過程中的內存管理等等。