Siri介紹
Siri是一款蘋果 iOS 系統(tǒng)提供的智能語音助手軟件,它的全名是Speech Interpretation and Recognition Interface。在WWDC 2016上温峭,蘋果開放了Siri的 API迹鹅,開發(fā)者們可以利用SiriKit將自己的服務(wù)提供給用戶咳短。
支持 iOS 10.0+倒源;
官方文檔:https://developer.apple.com/documentation/sirikit攘蔽;
以下內(nèi)容均是對(duì)官方文檔的解析隶症!
概念概覽
Domain - 被蘋果劃分的不同業(yè)務(wù)領(lǐng)域政模,每個(gè)領(lǐng)域中可以執(zhí)行不同的任務(wù)
Intent - 領(lǐng)域中的任務(wù)或意圖指令
Domains
VoIP Calling - 語音通信相關(guān),如微信蚂会、Facebook Messager淋样、Line等;
Payments - 適用于支付類應(yīng)用,如PayPal胁住、支付寶等趁猴;
Photo - 與圖庫相關(guān)應(yīng)用,如Instagram等彪见;
Workouts - 運(yùn)動(dòng)健康類應(yīng)用儡司,如Strava、NikeRun余指、野獸騎行等捕犬;
Ride booking - 適用于出行類應(yīng)用,如Uber、滴滴打車等碉碉;
CarPlay(automotive vendors only)- 車載及自動(dòng)駕駛相關(guān)柴钻,尚不明晰
Restarurant reservations(Requires addtional support from Apple) - 酒店服務(wù)類,具體需求上不明晰
Intents
VoIP Calling
????Start an audio call -開始語音通話
????Start a video call - 開始視頻通話
????Search the user’s call history -搜尋通話歷史
Messaging
????Send a message
????Search for messages
????Set attributes on a message
Photos
????Search for photos
????Play a photo slideshow
Payments
????Send a payment to another user
????Request a payment from another user
Workouts
????Start a workout
????Pause a workout
????Resume a workout
????End a workout
????Cancel a workout
Ride Booking
????Get a list of available rides (Maps only)
????Book a ride
????Get the status of a booked ride
CarPlay
????Change the audio source
????Change the climate control settings
????Change the defroster settings
????Saving vehicle settings to a profile
????Restoring vehicle settings from a profile
????Change the seat temperature
????Change the radio station
Restaurant Reservations
????Get the user’s current restaurant reservations
????Get information about the user to associate with a booking.
????Get default values to use when requesting reservation times.
????Get the reservation times that are currently available.
????Book a reservation for the user.
簡(jiǎn)單來說:
開發(fā)功能基本上就是在蘋果提供的這些領(lǐng)域(Domain)上垢粮,在App開發(fā)中需要開發(fā)哪種領(lǐng)域的功能贴届,就要在對(duì)應(yīng)的plist文件中添加對(duì)應(yīng)的Intent支持;
當(dāng)然SiriKit不是萬能的蜡吧,語義的處理流程要按照蘋果的套路來(應(yīng)用領(lǐng)域毫蚓,意圖),界面UI也套路來斩跌,不能調(diào)用App內(nèi)部頁面绍些。
那什么是Intent呢?
了解Intent耀鸦,首先要清楚SiriKit的外部工作流程:
1)柬批、Siri完成語音識(shí)別和語義分析;
2)袖订、會(huì)根據(jù)你詞匯中的關(guān)鍵詞識(shí)別出你屬于上述領(lǐng)域(Domain)中的哪一種氮帐;
3)、然后將結(jié)構(gòu)化語音分析結(jié)果打包成一個(gè)某個(gè)領(lǐng)域(Domain)的意圖(Intent)洛姑;
4)上沐、接著交給支持這個(gè)意圖(Intent)的第三方應(yīng)用,第三方應(yīng)用被啟動(dòng)楞艾,從傳入的Intent中獲取相應(yīng)的信息参咙,完成操作。
整個(gè)宏觀的流程如下圖:
例如硫眯,上圖演示中提到了的例句 “用演示發(fā)消息給小明"蕴侧,
領(lǐng)域 (Domain):Messaging
意圖 (Intent):Send a message (INSendMessageIntent)
意圖參數(shù) (Intent Parameter)
收件人(recipients):小明
消息內(nèi)容(content):空
備注:(appname:演示。如果沒有消息內(nèi)容两入,這時(shí)就會(huì)涉及到Sikit的API中提供的處理機(jī)制净宵,這個(gè)機(jī)制會(huì)調(diào)Siri反問你要發(fā)送什么內(nèi)容,這個(gè)就涉及到下文提到的SiriKit相關(guān)功能和處理流程裹纳,會(huì)有不同的擴(kuò)展和類在處理這個(gè)問題)
項(xiàng)目集成
1.先創(chuàng)建對(duì)應(yīng)的target:
根據(jù)需求確認(rèn)是否需要?UI Extension 择葡,該target類似于富文本推送;
生成結(jié)果:
2.定義需要支持的Intent類型:
支持類型的具體對(duì)應(yīng)內(nèi)容可參考官方文檔剃氧;
IntentsRestrictedWhileLocked是可選項(xiàng)敏储,用來控制鎖屏狀態(tài)下,對(duì)不同命令的響應(yīng)行為朋鞍。
3.添加對(duì)主應(yīng)用Siri權(quán)限支持
在主應(yīng)用Info.plist文件中添加NSSiriUsageDescription Key已添,該key用來標(biāo)記應(yīng)用與Extension所溝通的數(shù)據(jù)類型迫横,用于告知用戶,你的應(yīng)用為何要支持Siri的描述信息酝碳,比如Workout類應(yīng)用,我可以這么寫:“健身鍛煉的信息會(huì)發(fā)送到Siri恨狈,更快捷的記錄健身數(shù)據(jù)”
僅僅添加NSSiriUsageDescription這個(gè)Key到Info.plist文件中是不夠的疏哗,當(dāng)應(yīng)用第一次啟動(dòng)時(shí),我們需要用戶打開應(yīng)用的Siri支持權(quán)限禾怠,默認(rèn)情況下返奉,這個(gè)權(quán)限是關(guān)閉的,所以吗氏,需要我們通過調(diào)用INPreferences的類方法equestSiriAuthorization: 來通知用戶打開Siri權(quán)限支持芽偏。
4.一個(gè)標(biāo)準(zhǔn)的意圖語音被Siri識(shí)別之后,SiriKit會(huì)先進(jìn)入一個(gè)繼承于INExtension的指定意圖流程入口(NSExtensionPrincipalClass)類IntentHandler.m(默認(rèn)類)弦讽。下面在這個(gè)相關(guān)類會(huì)處理整個(gè)流程:
意圖的生命周期如下圖文描述:
一個(gè)典型的Intent事件的處理過程中有這三個(gè)步驟Resolve污尉、Confirm和Handle
Resolve階段。在Siri獲取到用戶的語音輸入之后往产,生成一個(gè)INIntent對(duì)象被碗,將語音中的關(guān)鍵信息提取出來并且填充對(duì)應(yīng)的屬性。這個(gè)對(duì)象在稍后會(huì)傳遞給我們?cè)O(shè)置好的INExtension子類對(duì)象進(jìn)行處理仿村,根據(jù)子類遵循的不同協(xié)議來選擇不同的解決方案锐朴。
Confirm階段。在上一個(gè)階段通過handlerForIntent:(INIntent *)返回了處理Intent的對(duì)象蔼囊,此階段會(huì)依次調(diào)用confirm打頭的實(shí)例方法來判斷Siri填充的信息是否完成焚志。匹配的判斷結(jié)果包括Exactly one match、Two or more matches以及No match三種情況畏鼓。這個(gè)過程中可以讓Siri向用戶征求更具體的參數(shù)信息酱酬。
Handle階段。在confirm方法執(zhí)行完成之后滴肿,Siri進(jìn)行最后的處理階段岳悟,生成答復(fù)對(duì)象,并且向此Intent對(duì)象確認(rèn)處理結(jié)果然后執(zhí)顯示結(jié)果給用戶看泼差。
4.發(fā)消息INSendMessageIntent的意圖對(duì)象
具體在各個(gè)階段的方法里怎么代碼實(shí)現(xiàn)贵少,主要是要理解INSendMessageIntent的對(duì)象屬性,通過解析對(duì)象堆缘,可以在各個(gè)階段用獲取到的對(duì)象進(jìn)行相關(guān)程序邏輯編碼滔灶。如:
對(duì)象名稱類型備注
通過流程方法里獲取到INSendMessageIntent對(duì)象進(jìn)行解析,匹配吼肥,處理录平,這個(gè)過程還涉及到返回的處理麻车。每一個(gè)解析方法都需要得到一個(gè)INIntentResolutionResult類型的實(shí)例,用來保存校驗(yàn)結(jié)果斗这。
INIntentResolutionResult及其子類有不同的構(gòu)造方法生成不同類型的結(jié)果动猬,用來指定和Siri的交互。
| 值類型INIntentResolutionResult| 說明|
| --- | --- |--- |
|+ (instancetype)needsValue;| 需要一個(gè)值表箭,Siri會(huì)提示用戶給一個(gè)值|
|+ (instancetype)notRequired;| 不是必要的赁咙,是否給值都會(huì)過這個(gè)resolve|
|+ (instancetype)unsupported;| 不支持的,Siri會(huì)提示用戶這個(gè)值不被支持|
|+(instancetype)successWithResolvedValue:(BOOL)resolvedValue;| 成功解析|
|+(instancetype)confirmationRequiredWithValueToConfirm:(nullable NSNumber *)valueToConfirm;| Siri提示用戶確認(rèn)當(dāng)前是否是一個(gè)bool值|
當(dāng)一個(gè)intent的所有參數(shù)都成功解析了免钻,處理程序就會(huì)向用戶詢問是否確認(rèn)這個(gè)intent的細(xì)節(jié)彼水,并且提供一個(gè)建議響應(yīng)。當(dāng)所有參數(shù)被成功解析后极舔,或者在不要求所有參數(shù)進(jìn)行解析凤覆,那么就認(rèn)為是解析成功。
在確認(rèn)期間拆魏,就可以執(zhí)行所有的intent參數(shù)的附加驗(yàn)證盯桦,以確保你可以使用該信息來執(zhí)行所請(qǐng)求的服務(wù)。如果之前的解析函數(shù)是單元測(cè)試稽揭,那么這個(gè)確認(rèn)函數(shù)就是集成測(cè)試俺附,保證所有輸入?yún)?shù)正確。
最后一個(gè)處理intent的階段溪掀,就是執(zhí)行與這個(gè)intent相關(guān)的動(dòng)作事镣。在-handleSendPayment:completion函數(shù)中做相應(yīng)業(yè)務(wù)邏輯,需要注意的是你在Extension中做的修改也應(yīng)當(dāng)反應(yīng)到App主程序當(dāng)中揪胃,所以需要提供任務(wù)的數(shù)據(jù)給到App璃哟。SiriKit提供了一個(gè)包含intent細(xì)節(jié)(INIntent、INIntentResponse)的InInteraction對(duì)象喊递,你可以使用userActivityInstance.interaction得到它随闪,在App啟動(dòng)時(shí)調(diào)用
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler
函數(shù)處理來自Extension的數(shù)據(jù)。
5.根據(jù)流程方法處理之后骚勘,與主程序通信方式
輕量級(jí)通信可采用這個(gè)辦法:
1)铐伴、在handling階段在NSUserActivity存儲(chǔ)相應(yīng)的信息,字典或字符串都行(如上handling階段代碼)俏讹。
2)当宴、在AppDelegate,獲取NSUserActivity所存儲(chǔ)的信息泽疆。
3)户矢、發(fā)送通知給所需要的地方。
4)殉疼、接收到通知后對(duì)主程序進(jìn)行相應(yīng)操作梯浪。
在AppDelegate中處理SiriKit的Intent可以參考官方文檔:
//AppDelegate.m- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return NO;}- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivityrestorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { if ([userActivity.interaction.intent isKindOfClass:[INSendMessageIntent class]]) { INSendMessageIntent *intent = (INSendMessageIntent *)(userActivity.interaction.intent); NSLog(@"%@",[[intent.recipients lastObject] displayName]); } return YES;}
6.自定義界面(Intent UI Extension)
運(yùn)用SiriKit開發(fā)相關(guān)功能捌年,UI是依賴于Intent UI Extension,SiriKit并不能從系統(tǒng)層面調(diào)用App內(nèi)部UI挂洛,只能調(diào)用打開App和SirKit自定義UI礼预。
系統(tǒng)創(chuàng)建了ViewController,加載視圖虏劲,調(diào)用viewDidLoad方法并且調(diào)用了INUIHostedViewControlling協(xié)議的configureWithInteraction:context:completion:方法逆瑞,傳遞了一個(gè)交互對(duì)象,用于配置界面伙单。 當(dāng)配置完成后,ViewController就會(huì)展示在Siri或者M(jìn)aps應(yīng)用界面的空白部分哈肖。這時(shí)會(huì)調(diào)用viewWillAppear/viewDidAppear方法吻育。
當(dāng)視圖消失時(shí),也會(huì)調(diào)用生命周期的viewWillDisappear/viewDidDisappear方法淤井。
類似于富文本推送的 UI 界面構(gòu)造方式布疼。
關(guān)于控制器的使用,蘋果給出了幾點(diǎn)注意事項(xiàng):
1.切換子控制器來展示不同類型的內(nèi)容币狠。 你的Intents UI擴(kuò)展只有一個(gè)主視圖控制器游两,如果你想為不同的Intents展示不同的內(nèi)容,你需要使用不同的視圖漩绵〖福可以在configureWithInteraction:context:completion:這個(gè)方法里面,根據(jù)提供的intentObject來創(chuàng)建不同的子視圖止吐。
2.在你的視圖控制器可用的期間宝踪,動(dòng)態(tài)調(diào)整內(nèi)容。 在viewDidAppear:方法里面才開始啟動(dòng)動(dòng)畫碍扔,在viewWillDisappear: 方法里面要結(jié)束動(dòng)畫瘩燥。
3.盡快的配置好你的視圖控制器,這樣Siri才能更快的展示它不同。 你的視圖控制器也許不會(huì)在屏幕上停留太久厉膀,所以盡量利用本地資源以及提供的INInteraction對(duì)象來配置你的設(shè)置。如果你需要從服務(wù)器拉取更多的信息二拐,請(qǐng)異步完成服鹅,并在稍后再更新你的界面。
4.請(qǐng)不要在界面里面展示廣告卓鹿。你可以展示你自己的品牌信息菱魔,但是你不能夠加入其它廣告。
參考文檔:
http://www.reibang.com/p/0881bb0ff538吟孙;