你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> iOS10 SiriKit QQ適配詳解

iOS10 SiriKit QQ適配詳解

編輯:IOS開發基礎

文章轉自 騰訊Bugly

1. 概述

蘋果在 iOS10 開放了 SiriKit 接口給第三方應用。目前,QQ已經率先適配了 Siri 的發消息和打電話功能。這意味著在 iOS10 中你可以直接告訴 Siri 讓它幫你發QQ消息和打QQ電話了,聽起來是不是很酷炫?

那麼第三方應用使用 Siri 的體驗究竟如何?哪些應用可以接入SiriKit?接入 SiriKit 又需要做哪些工作呢?這篇文章會為你一一解答這些疑惑。

1.jpg

圖1 用Siri發QQ消息效果展示

2. SiriKit 簡介

我們都知道 Siri 是 iphone 手機中的智能語音助手,那麼什麼是 SiriKit 呢?SiriKit 是蘋果為第三方應用支持 Siri 提供的開發框架。在官方文檔中,SiriKit 將對不同場景的語音支持劃分為不同的 domain,目前,SiriKit 支持的 domain 包括:VoIP 電話、發消息、轉賬、圖片搜索、網約車訂車、CarPlay 和餐廳預定,也就是說如果你的應用中包含有這些功能之一,就可以考慮將這些功能接入到 SiriKit 中啦。

實現 SiriKit 相關功能時,我們並不需要真正對語音進行識別,語音的識別工作會由 Siri 完成。Siri 識別完語音後,會將語音要完成的功能抽象成 Intent 對象傳遞給我們,而我們的接入工作主要是與這些 Intent 對象打交道,並不會涉及到自然語言處理(NLP)的技術。

關於 SiriKit 的開發網上已有一些文章,也可參考蘋果的官方文檔 SiriKit Programming Guide,本文著重介紹QQ的適配經驗。

2.jpg

圖2 SiriKit原理

3. SiriKit 接入

要實現 SiriKit 的功能需要在 Xcode 工程中添加 Intents Extension 的 target,和其他 extension一樣, Intents Extension 是一個獨立於 Containing App 進程運行的插件,主要用於處理和確認來自 Siri 的 intent 請求。如果想讓 Siri 在處理 App 相關 intent 時提供一些自定義的界面,那麼你就需要再添加 Intents UI Extension 的 target,Intents UI Extension 也是一個獨立運行的插件(所以要完整的支持 SiriKit 其實是需要添加兩個 target,有點蛋疼)。關於 App Extension 的開發可以參考蘋果的 App Extension Programming Guide。

我們以QQ中的發消息功能為例說明一下SiriKit的接入方法:

首先,我們需要在 Intents Extentsion 的 info.plist 文件中配置我們需要支持的 siri Intents,在 IntentsSupported 中加入 INSendMessageIntent,如果需要在鎖屏時禁用某個功能,則再在 IntentsRestrictedWhileLocked 中加入相應項的 Intent,如圖3所示。

3.jpg

圖3 Intent Extentsion info.plist配置

SiriKit 的接入主要分為 Intents Extension 和 Intents UI Extension 兩部分,下面分別進行介紹。

Intents Extension

當我們對 Siri 說“用QQ發消息給王一然說你好”時,語音的識別將會由 Siri 自動完成,Siri 會將識別好的內容展示在 Siri 的界面。如圖4所示,我們可以看到一個完整的發消息語句主要由四部分組成:

應用名:告訴 Siri 要使用哪個 App,Siri 會根據 app 的 bundle displayname 自動識別 app 的名稱,無需額外注冊。

發消息Intent:告訴 Siri 要使用發消息的功能,我們實測發現說發信息也是能識別,具體還有哪些詞匯會識別為發消息的 intent 蘋果沒有在文檔中說明。

消息接收者:告訴 Siri 消息的接收者是誰,“王一然”是我QQ好友的昵稱。

消息內容:告訴 Siri 你要發的消息內容是什麼,這裡的消息內容為“我很生氣”。

4.jpg

圖4 確認發送消息界面

其中應用名和 Intent 是必須的,不然 Siri 無法抽象出你的“Intent”。後兩項如果缺省的話,我們可以在實現中要求用戶進一步提供數據或者忽略。在識別完成後 Siri 會將消息內容和接收者抽象成一個 INSendMessageIntent 傳遞給 QQ的 Intent Extension。

我們從圖4還可以看到 Siri 准確從我的語音中識別出我QQ好友中昵稱為“王一然”的好友,然而“王一然”並不是一個通用的短語,那麼這是怎麼做到的呢?奧秘就在於在QQ運行時我們把所有QQ好友的昵稱同步到了 Siri 雲端,這樣 Siri 就可以識別出特定用戶要使用的特定短語,詳細同步方法可參考 INVocabulary 的 setVocabularyStrings:ofType: 方法。

每個 domain 的功能在 Siri 中都有對應的 Intents,而每個 intents 都對應一個特定的 handler 協議。對於發消息來講,對應的 Intent 和 handler 協議分別為 INSendMessageIntent 和 INSendMessageIntentHandling。只要實現 INSendMessageIntentHandling 協議中的相關方法,並在 Siri 解析出 INSendMessageIntent 請求時用我們的 INSendMessageIntentHandling 對象去處理相關的發消息請求。具體的流程如圖5:

5.jpg

圖5 Siri發QQ消息流程

1)ResolveRecipientsForSendMessage

對 Siri 從 Intent 中傳遞過來的接收者名稱進行處理和確認,比如可以確認該名稱當前是否在QQ好友列表中,並將 resolution result 反饋給 Siri。Resolution result 代表了應用對 intent 處理後的結果,對於發消息來說,表1列舉了幾種可能的 resolution results。

表1 send resolution result

6.jpg

2)ResolveContent

與接收者的處理類似,在這個方法中可以對 Siri 識別出的消息內容進行“修飾”,並且將 resolution result 反饋給 Siri,比如QQ對一些消息裡面的特殊詞匯如“生氣”做了 emoji 適配。

3)ConfirmSendMessage

這個方法的作用是確認是否要發送該消息,可以在這一步進行一些鑒權工作,鑒權通過後再確認發送,否則取消。確認可以發送後會調起確認發送界面,如圖4所示。如果需要從 Containing App 共享數據,具體的實現方案參考 App Group 的 Shared Container。

4)HandleSendMessage

如圖4,當用戶點擊了“發送”按鈕或者用語音給出了發送指令時會最終進入到這個方法,在這個方法裡我們需要實現發消息的邏輯,發送成功後可以調起消息發送成功的界面,如圖6。

7.jpg

圖6 消息發送成功界面

Intents UI Extension

對於支持自定義界面的 Intent 類型,可以在 Intents UI Extension 中提供更美觀的自定義界面。 Custom UI 的實現相對較簡單,和 iOS app 的開發一樣,都是通過 UIViewController 的子類實現。我們需要在 Intents UI Extension 的 info.plist 文件中設置 initial viewcontroller 或者設置 main storyboard,對於不同類型的 Intent 的界面展示通過 Child Viewcontrollers 的方式實現差異化界面展示。

如圖7所示,當接收到來自 Intents Extension 的 response 時,系統會喚起 Intents UI Extension 並加載 initial viewcontroller,通過 INUIHostedViewSiriProviding 協議的 configureWithInteraction:context:completion: 方法可以獲取 intent,比如在發消息功能中,在消息確認發送和發送成功後都會回調一次這個方法。根據 Intent 對象的類型和狀態,在收到相關 Intent 的回調時 present 對應的 Child Viewcontroller 即可實現定制化的界面展示。

這裡需要注意的是,Intents UI Extension 的進程並不會在界面銷毀後就退出,很可能只是在後台處於休眠狀態,下次 response 到來時再被喚醒。

8.jpg

圖7 Life cycle of an Intents UI extension

4. 總結

總的來說雖然蘋果這一次對 SiriKit 開放的場景有限,但是從我們的適配經歷來看蘋果對 Siri 還是非常重視的。另外,這是 SiriKit 首次對第三方應用開放接口,所以不可避免存在一些問題。我們在開發過程中也確實遇到了一些 SiriKit 本身的 Bug,大部分 bug 在向蘋果反饋後都得到了解決,但是在語言識別方面 Siri 依然存在一些缺陷,比如對中英文混合的場景識別依舊不太好。期待以後 Siri 對中文的支持越來越好,也希望 Siri 能夠開放更多的場景給第三方應用適配。




  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved