概覽
- 最新的WWDC2016大會(huì)上讼积,蘋(píng)果提出iOS10并推出了十個(gè)新特性,homekit脚仔、messageapp等等勤众,大部分是基于iPhone原生應(yīng)用的更新。其中最大的亮點(diǎn)之一是Siri的接口開(kāi)放鲤脏,在iOS10中提供了SiriKit框架在用戶使用Siri的時(shí)候生成INExtension對(duì)象來(lái)告知我們的應(yīng)用们颜,我們可以通過(guò)SiriKit提供的API展示給用戶更多的內(nèi)容,提供更好的體驗(yàn)猎醇。
- Siri通過(guò)語(yǔ)言處理系統(tǒng)對(duì)用戶發(fā)出的對(duì)話請(qǐng)求進(jìn)行解析之后生成一個(gè)用來(lái)描述對(duì)話內(nèi)容的Intent事件窥突,然后通過(guò)SiriKit框架分發(fā)給集成框架的應(yīng)用程序以此來(lái)獲取應(yīng)用的內(nèi)容,比如通過(guò)文字匹配查找應(yīng)用聊天記錄硫嘶、聊天對(duì)象阻问,蘋(píng)果demo演示的通過(guò)Siri向指定對(duì)象發(fā)送信息等功能,此外還支持為用戶使用蘋(píng)果地圖時(shí)提供應(yīng)用內(nèi)置服務(wù)等功能音半。
SiriKit提供以下六類服務(wù)
- 語(yǔ)音和視頻通話 VoIP calling
- 發(fā)送消息 Messaging
- 收款或者付款 Payments
- 圖片搜索 Photo search
- 管理鍛煉 Workouts
-
行程預(yù)約 Ride booking
下面來(lái)看一下一個(gè)典型的Siri進(jìn)行交互的語(yǔ)句:
其中有三類關(guān)鍵部分:Intent则拷、App以及其他信息是越。Intent就是我要想要通過(guò)Siri去做的事的意圖赛惩,App是通過(guò)手機(jī)安裝的什么App來(lái)做金砍,至于其他的Payee、Amount等信息則是通過(guò)App去完成Intent的必須信息彻桃。而整個(gè)Siri的交互過(guò)程可以參照下圖:
通過(guò)Siri來(lái)獲取用戶語(yǔ)言中的關(guān)鍵詞匯,這些詞匯在Extension中經(jīng)過(guò)一些邏輯處理晾蜘,最終反饋到用戶界面邻眷,與用戶進(jìn)行交互。
Siri通過(guò)Intents extension的擴(kuò)展方式和我們的應(yīng)用進(jìn)行交互剔交,其中Intents Extension扮演協(xié)同Siri共同響應(yīng)用戶的角色肆饶,Intents UI Extension可以提供自定義的用戶響應(yīng)界面,用以增強(qiáng)體驗(yàn)岖常。
當(dāng)我們實(shí)現(xiàn)了Intents extension擴(kuò)展并產(chǎn)生了一個(gè)Siri請(qǐng)求事件時(shí)驯镊,Intent(意圖)事件的處理過(guò)程分Resolve、Confirm和Handle三個(gè)步驟。
Intent處理的三個(gè)階段
- Resolve階段:
幫助Siri明白用戶的含義
影響Siri的行為
提供resolution response
在Siri獲取用戶的語(yǔ)音輸入之后板惑,生成一個(gè)INIntent對(duì)象橄镜,將語(yǔ)音中的關(guān)鍵信息提取出來(lái)并且填充對(duì)應(yīng)的屬性,該對(duì)象會(huì)傳遞給我們?cè)O(shè)置好的INExtension子類對(duì)象進(jìn)行處理冯乘,根據(jù)子類遵循的不同protocol來(lái)選擇不同的解決方案洽胶。通過(guò)handler(for intent:)返回處理intent的對(duì)象,此對(duì)象會(huì)調(diào)用resolve打頭的實(shí)例方法來(lái)對(duì)Siri的響應(yīng)進(jìn)行一系列的信息處理裆馒,比如是否需要進(jìn)一步的信息提示等姊氓。在resolve階段提供了以下方法:
successWithResolvedPerson:成功找到匹配的人
disambiguationWithPeopleToDisambiguate:還需要挑選
confirmationRequiredWithPersonToConfirm:還需要確認(rèn)下
needMoreDetailsForPerson:還需要更具體的信息,需要Siri進(jìn)行詢問(wèn)
unsupportedWithReason:無(wú)法使用指定值
needsValue:需要某些必需值
notRequired:應(yīng)用并沒(méi)有要求某些值 -
Confirm階段喷好。
告訴Siri預(yù)期結(jié)果
檢查必要的狀態(tài)
提供Intent response
Siri提供必要的確認(rèn)提示
Siri進(jìn)行最后的處理階段他膳,生成答復(fù)對(duì)象,并且向此intent對(duì)象確認(rèn)處理結(jié)果绒窑。大概長(zhǎng)這樣:
當(dāng)然棕孙,這個(gè)界面是經(jīng)過(guò)自定義的。
- Handle階段:
執(zhí)行請(qǐng)求操作
提供有關(guān)結(jié)果足夠精確的信息
如果結(jié)果耗時(shí)的話還可提供loading
在Confirm方法執(zhí)行完成之后些膨,然后顯示結(jié)果給用戶看蟀俊。該階段完成后Intent的生命周期結(jié)束。
實(shí)現(xiàn)一個(gè)Siri Kit應(yīng)用
- 升級(jí)到Xcode8订雾,一臺(tái)升級(jí)到iOS10的測(cè)試設(shè)備
- Intents extension : resolve肢预、confirm、handle流程
- Intents UI extension 提供界面自定義等內(nèi)容
- 新建一個(gè)空應(yīng)用并新增一個(gè)target
- 新增Intents Extension洼哎,創(chuàng)建時(shí)會(huì)詢問(wèn)是否激活該擴(kuò)展且是否將Intents UI Extension一并創(chuàng)建烫映,都選擇是。
-
了解Embedded frameworks
Embedded frameworks
Embedded frameworks是蘋(píng)果著重提出來(lái)的噩峦,主要用于以下幾個(gè)方面:
- 網(wǎng)絡(luò)服務(wù)
- 數(shù)據(jù)model
- Decision-making logic
- 用戶界面
可以在應(yīng)用主target以及extension分別引用锭沟。
在創(chuàng)建extension之后,我們查看extension的plist文件识补,默認(rèn)的plist結(jié)構(gòu)如圖所示:
IntentsSupported表示的是應(yīng)用支持的Intent事件族淮,IntentsRestrictedWhileLocked表示的是鎖屏下支持的Intent事件。在demo中分別賦值:INSendMessageIntent凭涂。還要注意一下NSExtensionPrincipalClass祝辣,該項(xiàng)內(nèi)容表示的是extension響應(yīng)的入口類。其為INExtension的子類切油,需要實(shí)現(xiàn)handler(for intent: INIntent)方法如下:
用以根據(jù)不同的Intent分發(fā)各個(gè)自定義Handler進(jìn)行處理蝙斜。
另外還就是主項(xiàng)目plist 增加NSSiriUsageDescription 這個(gè)是請(qǐng)求Siri權(quán)限時(shí)提示的文案,同時(shí)使用Siri時(shí)澎胡,用戶必須說(shuō)出App的名字孕荠,也就是Bundle display name绢片,都需要進(jìn)行設(shè)置。其中UCSendMessageIntentHandler需要實(shí)現(xiàn)INSendMessageIntentHandling中的方法用以與Siri進(jìn)行交互岛琼,也就是Resolve底循、Confirm和Handler三階段的交互。
示例代碼如下:
-
獲取收件人信息槐瑞,可以根據(jù)自身匹配的信息返回不同狀態(tài)與Siri進(jìn)行進(jìn)一步的交互熙涤。
-
獲取信息內(nèi)容,也就是要給收件人發(fā)送的信息的具體內(nèi)容困檩。
-
收件人祠挫、信息內(nèi)容確定后,通過(guò)Siri向用戶進(jìn)行信息確認(rèn)悼沿。
-
信息確認(rèn)后等舔,進(jìn)行最終信息的發(fā)送并向用戶展示結(jié)果。
具體展示到界面上的效果圖如下
至此糟趾,一個(gè)完整的通過(guò)Siri進(jìn)行發(fā)送信息的完整流程結(jié)束慌植。簡(jiǎn)要概括整個(gè)流程,可以參照蘋(píng)果Keynote中的圖示:
當(dāng)然义郑,在上面圖例中蝶柿,有開(kāi)發(fā)者自定義的Siri反饋界面,這個(gè)界面的實(shí)現(xiàn)主要是通過(guò)Intents UI Extension來(lái)實(shí)現(xiàn)的非驮。有興趣的話交汤,可以自行研究,實(shí)現(xiàn)方式也很簡(jiǎn)單劫笙。UI Extension的plist結(jié)構(gòu)可以參照下圖芙扎,只需要設(shè)置一下IntentsSupported即可。
總結(jié)
雖然蘋(píng)果開(kāi)放了SiriKit的入口填大,但是總體而言還是限制頗多戒洼,具體如何使用還是需要繼續(xù)深入挖掘。類似可以自定義應(yīng)用詞匯栋盹、使用UI Extension過(guò)程中的內(nèi)存管理等等施逾。