Categories
程式開發

愛奇藝iOS深度實踐:SiriKit詳解應用篇


前言

蘋果全球開發者大會(Worldwide Developers Conference,下文簡稱WWDC)自1983年加州首次舉辦以來至今一直備受iOS 開發者關注,第一代iOS 也從2007年一路走來,如今iOS 系統的版本也已經到了兩位數。這次 iOS 13 帶來了新的對話式快捷指令、更深層次的自定和新媒體播放體驗,讓各項功能變得更加強大。 WWDC2019 之後,愛奇藝對Siri 進行了相關的技術研究和探索,本文重點討論SiriKit Media Intents 和Siri Suggestions,鑑於業界對此討論也不並多,結合愛奇藝的場景上線了媒體播放意圖、媒體搜索意圖、Siri 建議、Siri 新媒體播放建議等功能,幫助用戶更便捷的使用愛奇藝。

SiriKit

2016年 WWDC大會上蘋果開放了 Siri 的 API,開發者們可以利用 SiriKit 將自己的服務提供給用戶。 SiriKit 負責處理用戶通過 Siri 對 App 服務的請求,並定義了用戶可以發出的請求類型,稱為意圖,使用域將相關的意圖進行分組。例如,消息域具有發送消息,搜索消息以及將消息標記為已讀或未讀的意圖。 App 通過創建能與 Siri 通信的擴展來使用 SiriKit,使用時 App 無需處於運行狀態。此擴展會對它能夠處理的特定域和意圖進行註冊。比如,一個信息 App 可以註冊支持信息的域,以及發送信息的意圖,SiriKit 包含 Intents IntentsUI 框架,支持兩種類型的擴展:

1. Intents app extension: 負責接收來自 SiriKit 的用戶請求,並將其轉換為 App 特定的操作。

2. Intents UI app extension: 支持自定義擴展程序的樣式,但自定義視圖控制器無法收到任何觸摸事件。

愛奇藝iOS深度實踐:SiriKit詳解應用篇 1

SiriKit Media Intents

在 WWDC2019 上蘋果介紹了新的媒體播放服務,並且給開發者開放更多的能力。愛奇藝也同步開始技術調研,並在 iOS 13 正式版發布前上線了對媒體播放意圖的支持。 Media domain 負責處理用戶對媒體類服務的請求,支持媒體播放、添加媒體、搜索媒體、媒體偏好四種意圖。借助 Media domain,用戶無需啟動 App 即可實現對音頻媒體的播放和控制,這對音頻類 App 非常有意義。對於視頻,Siri 會幫用戶啟動 App 並在前台播放,同樣簡化了播放流程,提高使用體驗。

愛奇藝媒體播放意圖接入流程

愛奇藝iOS深度實踐:SiriKit詳解應用篇 2

1. Extension Target 下Supported Intents Class Name 添加 INPlayMediaIntent, Media Categories 選擇適合 App 的選項,支持多選;

2. 需要在前台播放媒體時, App Target Info.plist NSUserActivityTypes 添加 Intent Class Name.

  • 在後台播放 ,App 收到的系統回調是 application:handleIntent:completionHandler:
  • 在前台播放, App 收到的系統回調是

application:continueUserActivity:restorationHandler

需要在 Info.plist 中聲明 App 支持的活動類型.

3. 提供意圖示例短語, 對於媒體播放意圖,缺失不會影響功能,但提交商店時會收到缺失示例短語警告

4. App Info.plist 中設置 App 別名(可選), 用戶通過 Siri 使用 App 服務時,必須在對話中包括 App 的名稱,為了方便表述,可以為 App 提供別名。比如,愛奇藝 iPad 版名稱為 “愛奇藝HD”,別名為“愛奇藝”。當 iPad 同時安裝了“愛奇藝” App 和“愛奇藝HD” App 時,Siri 會優先選擇“愛奇藝” App 響應用戶對“愛奇藝”服務的請求。

5. 處理請求:

1). 典型的處理流程需要三個步驟:Resolve、Confirm 和 Handle

  • Resolve: 驗證意圖的參數,確保具有滿足用戶請求所需的信息。 SiriKit 會調用每個參數的解析方法,根據返回的解析結果決定如何繼續。
  • Confirm: 對意圖參數執行最終驗證,並驗證 App 的服務已準備就緒,可以實現意圖。
  • Handle: 實現意圖,並向 SiriKit 反饋處理結果。

愛奇藝iOS深度實踐:SiriKit詳解應用篇 3

2). Media domain 的意圖處理建議省略 Confirm 步驟。 Apple 在分析自己 App 的使用情況時,發現Confirm 步驟會降低人們繼續播放媒體的可能性。

  • 媒體播放意圖中,Resolve 步驟負責解析意圖的 INMediaSearch 對象,並返回具體可播放的媒體對象。
  • mediaSearch 包含的媒體信息可能不會精確匹配實際的媒體名稱,因為用戶的表述和 Siri 語音識別的結果可能是不准確的。搜索服務的模糊查詢會返回準確的媒體信息,Siri 也會正確的提示實際播放的內容。
  • mediaSearch 可能為空,用戶沒有指定具體播放的內容。不建議主動詢問要播放什麼,用戶可能會因此而退出使用。開發者需要做出決定,比如播放推薦或熱門的內容,或者按用戶的播放記錄繼續播放。
  • 除了媒體名稱,mediaSearch 還包括媒體類型、藝術家、排序等信息,這些信息應結合使用,縮小搜索範圍,播放更匹配的內容。
  • 愛奇藝對用戶的意圖做了進一步的識別,比如播放“破冰行動大結局”,“延禧攻略第十集”,“最新的奇葩說”等,提供更好的用戶體驗。

3). 擴展程序的生命週期很短,媒體播放是由 App 完成的,Handle 步驟只需返迴響應結果即可。

  • 音頻媒體應該在後台播放,響應碼為:

    INPlayMediaIntentResponseCodeHandleInApp

  • 視頻媒體需要在前台播放,響應碼為:

    INPlayMediaIntentResponseCodeContinueInApp

4). App 讀取 intent 中的媒體信息,開始播放。

  • 後台播放,App 收到的系統回調是

    application:handleIntent:completionHandler:,intent 參數包含了需要的信息;

  • 前台播放,App 收到的系統回調是

    application:continueUserActivity:restorationHandler:,userActivity.interaction.intent 包含了需要的信息。

    愛奇藝會為媒體播放意圖跳過啟動廣告,提高播放體驗。

5). App 讀取 intent 中的媒體信息,開始播放。

  • 後台播放, App 收到的系統回調是 application:handleIntent:completionHandler:,intent 參數包含了需要的信息;
  • 前台播放,App 收到的系統回調是 application:continueUserActivity:restorationHandler:,userActivity.interaction.intent 包含了需要的信息。愛奇藝會為媒體播放意圖跳過啟動廣告,提高播放體驗。

愛奇藝iOS深度實踐:SiriKit詳解應用篇 4

愛奇藝媒體搜索意圖接入流程

媒體搜索意圖只支持 App 在前台展示搜索結果,在完成播放意圖的支持後,搜索意圖的實現比較簡單。

愛奇藝iOS深度實踐:SiriKit詳解應用篇 5

細節及注意事項如下:

1. 處理請求, 搜索意圖需要 Resolve 和 Handle 兩個步驟。

  • Resolve 步驟主要提取搜索內容

  • Handle 步驟返迴響應結果即可,響應碼 INSearchForMediaIntentResponseCodeContinueInApp

    愛奇藝iOS深度實踐:SiriKit詳解應用篇 6

2. App 在系統回調

application:continueUserActivity:restorationHandler: 拿到搜索信息,展示搜索結果。

愛奇藝iOS深度實踐:SiriKit詳解應用篇 7

Siri Suggestions

Siri 基於用戶的習慣和使用 App 的方式,提供接下來可能要做的事情的建議。例如,如果用戶經常在上午買咖啡,Siri 可能會在用戶通常下單的時間建議用戶下單。 Siri 會在鎖定屏幕或“搜索”中向用戶建議快捷指令。 Shortcuts 使開發者可以將 App 的關鍵功能與 Siri 接通,讓用戶可以在新的場景以新的方式使用 App。

愛奇藝iOS深度實踐:SiriKit詳解應用篇 8

定義 Shortcu

開發者需要考慮為哪些重要的、經常使用的功能定義 Shortcut,幫助用戶更快速的使用 App 的功能。 有兩種定義的方式,NSUserActivity 和 Intents。

  • NSUserActivity 是一種表示 App 狀態的輕量級方式,如果只是要構建打開 App 內某個功能的簡單 shortcut,建議使用這種方式。定義 Shortcut,只需在 App Target Info.plist NSUserActivityTypes 中添加類型即可,例如,com.myapp.name.my-activity-type;
  • Intents 可以提供最優的 Shortcuts 體驗。 Siri 會根據意圖參數提供更加智能的預測,並且支持自定義語音回復和定制化的 UI,結合 Intents App Extension,無需啟動 App 即可完成響應。

開發者可以選擇自定義意圖或使用系統內置意圖。在自定義之前,應查看 Siri Domains,優先選擇滿足需要的內置意圖。

愛奇藝iOS深度實踐:SiriKit詳解應用篇 9

捐贈 Shortcut

每次用戶在 App 中使用支持了 shortcut 的功能時,App 需要告訴 Siri,這樣 Siri 才會學習到建議 shortcut 的正確時機和場景。

  • NSUserActivity

    Siri 會根據 userInfo 中的信息尋找規律,使用 requiredUserInfoKeys 指定 userInfo 中哪些關鍵 key 在尋找規律時用來對比。 persistentIdentifier 在刪除捐贈時使用。

    愛奇藝iOS深度實踐:SiriKit詳解應用篇 10

    愛奇藝iOS深度實踐:SiriKit詳解應用篇 11

  • Intents

    Siri 會將捐贈按意圖參數解構組合為 Intent Definition File 中定義的所有可能的 shortcut,從而實現更智能的預測。 groupIdentifier 在刪除捐贈時使用。

    愛奇藝iOS深度實踐:SiriKit詳解應用篇 12

    愛奇藝iOS深度實踐:SiriKit詳解應用篇 13

刪除捐贈

如果已捐贈的 shortcut 中包括用戶刪除的信息,或者 App 不再支持已捐贈的功能時,應該從 Siri 中刪除捐贈。

  • NSUserActivity

    愛奇藝iOS深度實踐:SiriKit詳解應用篇 14

  • Intents

    愛奇藝iOS深度實踐:SiriKit詳解應用篇 15

Handle Shortcuts

  • NSUserActivity 需要在 App 內處理;

    愛奇藝iOS深度實踐:SiriKit詳解應用篇 16

  • Intents 支持後台使用的 shortcut,需要創建 Intents App Extension。

    意圖處理的具體方法參考上述媒體播放意圖《處理請求》部分。

愛奇藝 Siri Suggestions 實現

愛奇藝目前支持兩種建議,常用功能建議和媒體播放建議。 Siri 建議出現的時機依賴捐贈形成的規律,而具體策略並不完全透明。開發者在日常生活中,有遇到其他 App 的 Siri 建議功能彈出略頻繁,可能會對用戶有所打擾。愛奇藝在捐贈播放行為時,會考慮播放的持續性,希望建議出現時,用戶確實有觀看時間和觀看需求,避免用戶在碎片時間偶然播放形成規律帶來不好的體驗。

  • 常用功能建議使用 NSUserActivity 實現,點擊後會打開播放記錄頁面;

愛奇藝iOS深度實踐:SiriKit詳解應用篇 17

  • 媒體播放建議使用系統內置的 INPlayMediaIntent 實現。 App 捐贈當前播放行為,但用戶可能不會重複觀看已看過的內容。 INUpcomingMediaManager 提供了更新建議內容的方式,可以向用戶建議未看過或未看完的內容。
  • 支持在後台執行的 shortcut 可以定制擴展程序的 UI,給用戶更好的體驗。愛奇藝也對 Intents UI app extension 做了調研,詳細實現方式請參考官方文檔

愛奇藝iOS深度實踐:SiriKit詳解應用篇 18

愛奇藝iOS深度實踐:SiriKit詳解應用篇 19

總結

SiriKit 的能力還需要不斷完善,仍有一些可優化的地方,比如當用戶播放意圖但不指定具體 App 時,希望可以展示支持播放的 App 列表給用戶選擇。隨著 Apple 開放更多 Siri 相關的能力,用戶可以在新的場景以新的方式使用 App 的功能。開發者可以參考以下資料,為 App 支持 Siri 相關功能。

愛奇藝iOS深度實踐:SiriKit詳解應用篇 20

本文轉載自公眾號愛奇藝技術產品團隊(ID:iQIYI-TP)。

原文鏈接

https://mp.weixin.qq.com/s?__biz=MzI0MjczMjM2NA==&mid=2247486750&idx=1&sn=8e092b0edcd905a7e95b563479563be8&chksm=e976913dde01182b0dfc3aec1f100eb53e3213eeab852228e57c5aa52fe9209f8fcfbd397993&scene=27#wechat_redirect