iOS 10 SiriKit QQ 適配詳解

1. 概述

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

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




圖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 初探 —— WWDC 2016 技術賞析》),也可參考蘋果的官方文檔 SiriKit Programming Guide,本文著重介紹 QQ 的適配經驗。




圖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 Intent Extentsion info.plist 配置


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

Intents Extension

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

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

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

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

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




圖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 協議分別為INSendMessageIntentINSendMessageIntentHandling。只要實現INSendMessageIntentHandling協議中的相關方法,并在 Siri 解析出INSendMessageIntent請求時用我們的INSendMessageIntentHandling對象去處理相關的發消息請求。具體的流程如圖5:




圖5 Siri 發 QQ 消息流程


1)ResolveRecipientsForSendMessage

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


表1 send resolution result




2)ResolveContent

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

3)ConfirmSendMessage

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

4)HandleSendMessage

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




圖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 到來時再被喚醒。




圖7 Life cycle of an Intents UI extension


4. 總結

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

來源:CSDN

上一篇: 從產品運營角度看 iOS 10通知新特性

下一篇: 研究人員發現蘋果iOS漏洞:可繞過“激活鎖”功能

分享到: 更多
吉林时时票控 大乐透顺序不对算不算 中国体育彩票手机投注 pk10计划手机免费版 pk10手机直播视频直播 七星彩有哪些固定规律 3000元倍投法稳赚 大乐透近100斯走势图开门彩 极速快三计划软件免费下载 幸运飞艇万能码图解 188比分直播 网上牛牛赢钱秘诀 赢三张手机版下载 宝马棋牌下载 贝贝游戏通比牛牛技巧 时时彩网