iOS開發(fā)-Siri預(yù)研

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吟孙;

http://www.reibang.com/p/eb15faeb4a66澜倦;

http://www.reibang.com/p/d0e157627f3a聚蝶;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市藻治,隨后出現(xiàn)的幾起案子碘勉,更是在濱河造成了極大的恐慌,老刑警劉巖桩卵,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件验靡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡雏节,警方通過查閱死者的電腦和手機(jī)胜嗓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钩乍,“玉大人辞州,你說我怎么就攤上這事×却猓” “怎么了变过?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涝涤。 經(jīng)常有香客問我媚狰,道長,這世上最難降的妖魔是什么阔拳? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任崭孤,我火速辦了婚禮,結(jié)果婚禮上糊肠,老公的妹妹穿的比我還像新娘裳瘪。我一直安慰自己,他們只是感情好罪针,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布彭羹。 她就那樣靜靜地躺著,像睡著了一般泪酱。 火紅的嫁衣襯著肌膚如雪派殷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天墓阀,我揣著相機(jī)與錄音毡惜,去河邊找鬼。 笑死斯撮,一個(gè)胖子當(dāng)著我的面吹牛经伙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼帕膜,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼枣氧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起垮刹,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤达吞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后荒典,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酪劫,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年寺董,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了覆糟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遮咖,死狀恐怖搪桂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盯滚,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布酗电,位于F島的核電站魄藕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏撵术。R本人自食惡果不足惜背率,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嫩与。 院中可真熱鬧寝姿,春花似錦、人聲如沸划滋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽处坪。三九已至根资,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間同窘,已是汗流浹背玄帕。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留想邦,地道東北人裤纹。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像丧没,于是被迫代替她去往敵國和親鹰椒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锡移,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容