Part5: 創建 Intent UI Extension

在這里放出原文鏈接地址

Part 5.1: 創建一個 Intents UI Extension

當你處理一個 Intent 時, SiriMaps 通常會使用一個默認的 UI 界面將 Intents Extension 返回的響應者對象( response object ) 中的詳細內容展示給用戶, 如果你希望在此基礎上添加你自定義的 UI 界面, 此時你需要添加一個 Intents UI Extension.

Intents UI Extension 不會替代你用來處理 Intent 對象的 Intents Extension. 它是一個單獨的 App 擴展, 使用它來自定義你的 UI 界面, 向用戶展示響應者對象( response object ) 中的內容. 你可以在它上面添加你 App 的標識, 也可以在它上面添加一些附加的信息, 如此一來, 你可以給用戶一種很熟悉的感覺.

當你支持一下場景( domains ) 時, 你可以提供 Intents UI Extension:

  • 消息 ( Messaging )
  • 支付 ( Payments )
  • 旅行預訂 ( Ride booking )
  • 健身 ( Workouts )

Intents UI Extension 中最主要的一個對象是一個 View Controller, 使用它來自定義你向用戶所展示的內容. 一個Intents UI Extension 中只有一個 View Controller, 所以它必須有能力顯示所有你所支持場景( domains ) 的內容. 當然, 你也可以為你每一個支持的場景 ( domains ) 分別創建一個 Intents UI Extension.

Part 5.2: 配置你的 Xcode 工程

當你創建一個 Intents Extension 時, 你可以同時創建一個 Intents UI Extension, 當然, 只要你有需要, 你在任何時間單獨添加 Intents UI Extension 也是沒問題的.

在項目中添加一個新的 Intents UI Extension:

  1. 使用 Xcode 打開你的工程.

  2. 選擇 File -> New -> Target


  3. 在 iOS 標簽下選擇 Intents UI Extension, 點擊 Next.

  4. 指定文件名稱、開發語言以及其他的選項. 點擊 Finish.

Xcode 提供的模板包含了一個 Storyboard 文件, 其中包含了一個初始的視圖控制器, SiriMaps 會通過 Storyboard 中的初始視圖控制器來向用戶顯示你的自定義內容, 所以先將初始視圖控制器的內容初始化成你想要展示的默認內容. 你也可以在 Storyboard 文件中添加新的視圖控制器, 將新添加的視圖控制器作為初始視圖控制器的子視圖控制器來使用. 所以為了你自定義 UI 可以正確的顯示你想要的內容, 你有責任去管理初始視圖控制器和新建視圖控制器之間的所有交互過程.

Intents UI Extension 中的 Info.plist 文件將會向SiriKit 提供一些信息, 你的Intents UI Extension都支持哪些 Intents 就是在這個文件中配置的. 下面表格中展示的3個 Key, 是你必須在Info.plist 中包含的. 另外需要注意的是 NSExtensionAttributes 這個 Key, 你需要在這個 Key 中詳細說明你的 Intents UI Extension 都支持哪些場景.

Key 描述
NSExtensionAttributes 該 Key 對應的值是一個字典, 該字典中必須包含 IntentsSupported Key, 該 Key 對應的值是一個字符串數組. 這些字符串的值實際就是你所支持的 Intent 的類名. 配置這個 Key 就跟配置 Intents extension 時一樣.
NSExtensionMainStoryboard 該 Key 對應的值就是你顯示自定義內容的 Storyboard 名稱. 如果你不想使用 Storyboard 而是使用代碼來初始化你的視圖控制器, 你可以使用NSExtensionPrincipalClass這個 Key 來替換NSExtensionMainStoryboard.
NSExtensionPointIdentifier 該 Key 的內容必須為 com.apple.intents-ui-service.

指定 Intents UI Extension 所支持的 Intent:

  1. 選擇你的 Info.plist 文件.

  2. 展開NSExtensionNSExtensionAttributes 這兩個 Key.

  3. IntentsSupported Key 中添加你需要支持的 Intent, 字符串類型, 值則是 Intent 的類名.

了解更多配置 Info.plist 的內容, 請查看: Information Property List Key Reference

Part 5.3: 實現你的視圖控制器

Storyboard 中的初始視圖控制器, 就是用來向用戶展示自定義內容的. 在向用戶展示你的自定義 UI 界面之前, SiriMaps 將會先加載初始視圖控制器, 并且調用其中的 configureWithInteraction:context:completion: 方法, 實現這個方法時, 使用該方法提供的交互對象( interaction object ) 來配置你視圖控制器中需要顯示的內容. context 參數將會告訴你視圖控制器應該顯示 SiriMaps 的內容, 所以此時你是有機會通過這個參數來判斷你應該向用戶展示哪些自定義內容的.

在用戶 dismissSiriMaps 之前, 你的視圖控制器都是顯示在屏幕中的, 你可以使用 Timer 或其他的一些技術來更新你的界面. 該視圖控制器同樣遵守普通視圖控制器的生命周期, 例如顯示、隱藏之類的, 不同的是, 該視圖控制器是不接收任何觸摸事件的, 而且你也不可以在上面添加任何手勢. 所以在該控制器上不要創建任何需要用戶交互的試圖.

下圖中展示的是 Intents UI Extension 和 它的視圖控制器的生命周期. 系統創建視圖控制器, 并且調用configureWithInteraction:context:completion: , 并且該方法會傳入一個交互對象 ( interaction object ), 用這個對象來配置你的界面. 一旦配置完成, 你的視圖控制器將會顯示在屏幕中, 當你的視圖控制器出現在屏幕上以后, 你可以做一些動畫之類的操作, 也可以使用 Timer 或其他的一些技術來實現你界面的更新邏輯, 但是請記住, 它是不接受任何事件的.

圖片來自官方文檔

注意:
當視圖控制器出現在屏幕上以后, Maps 將會再一次調用configureWithInteraction:context:completion: 方法將需要更新的信息發送給你, 讓你來顯示最新的內容. 例如: Maps 將會調用這個方法, 將旅行預訂的最新狀態發送給你, 利用這個時機來更新你的界面.

當用戶 dismissSiriMaps 以后, 系統將會 release 掉對視圖控制器和 Intents UI extension 的引用. 你的視圖控制器僅僅用來展示信息就可以了, 當視圖控制器從屏幕中消失的時候, 不要試圖保存任何數據 或 和你的 App 產生任何的聯系.

對于如何實現 Intents UI extension 中的視圖控制器, 這里給出幾條建議:

  • 在視圖控制器中添加你App的標識: 使用你 App 的主色調、圖片、圖標, 以及其他的一些設計元素來提升用戶對你 Intents UI extension 的熟悉感是一個不錯的選擇.
  • 通過初試視圖控制器的子視圖控制器來切換你要顯示的內容: Intents UI extension 中僅包含了一個主視圖控制器(初試視圖控制器), 所以當你希望根據不同的 Intent來顯示不同的內容時, 你可以使用子視圖控制器來管理不同 Intent 所對應的不同內容. 在configureWithInteraction:context:completion: 方法中, 根據不同的 Intent 對象初始化不同的視圖控制器.
  • 只有當你視圖控制器完全顯示, 你才可以做一些動畫操作: 等到視圖控制器聲明周期到達 viewDidAppear: 之后, 再提交你的動畫. 停止動畫則需要在 viewWillDisappear: 方法中.
  • 盡可能快的配置視圖控制器的 View: 由于你的視圖控制器在屏幕中顯示的時間不會很長, 所以盡可能使用一些本地的數據和configureWithInteraction:context:completion: 方法中提供的交互對象( interaction object ) 來配置你的視圖. 如果你需要從服務器上獲取一些數據來進行顯示, 此時你應該異步的進行數據請求, 當請求成功后再來刷新你的頁面.
  • 不要在你的界面中添加廣告: 你可以添加一些和用戶相關的信息, 但是廣告這東西是被禁止的.
  • 當你希望隱藏掉你的自定義界面時, 返回一個 CGSizeZero 就可以了: 當你的視圖控制器沒有任何附加信息需要展示給用戶時, 你可能需要隱藏掉你的視圖控制器, 此時你可以在 configureWithInteraction:context:completion: 方法中回調 completion block 時傳入一個 CGSizeZero 就可以了.

了解更多關于配置視圖控制器的內容, 請查看: INUIHostedViewControlling Protocol Reference

Part 5.4: 替換默認的界面

對于一個旅行預訂( Ride booking ) 或消息( Messaging ) 相關的 App 來說, 如果系統提供的默認 UI 和你提供的 UI 產生了沖突, 那么此時你可以將系統提供的 UI 隱藏掉. 對于消息( Messaging ) App 來說, Siri 默認會展示消息的內容和消息接收者. 對于旅行預訂( Ride booking ) App 來說, SiriMaps 將會展示一個地圖來顯示用戶的位置. 如果你想用你的自定義界面來顯示相同的信息, 使用 INUIHostedViewSiriProviding 協議來禁止系統提供默認界面的顯示.

了解更多禁止默認頁面顯示的內容, 請查看: INUIHostedViewSiriProviding Protocol Reference

Lemon龍說:

如果您在文章中看到了錯誤 或 誤導大家的地方, 請您幫我指出, 我會盡快更改

如果您有什么疑問或者不懂的地方, 請留言給我, 我會盡快回復您

如果您覺得本文對您有所幫助, 您的喜歡是對我最大的鼓勵

如果您有好的文章, 可以投稿給我, 讓更多的 iOS Developer 在簡書這個平臺能夠更快速的成長

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在這里放出原文鏈接地址 Part 2.1: 創建 Intents Extension Intents Extens...
    李國安閱讀 3,525評論 1 2
  • 內容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標下拉刷新...
    皇小弟閱讀 46,887評論 22 665
  • 介紹SiriKit SiriKit是讓你的內容通過Siri展示的一個框架庫。當用戶向Siri請求特別類型的服務時,...
    孢子菌閱讀 4,358評論 1 6
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,241評論 4 61
  • 回家鄉了,車子穿梭在一路上的五彩斑斕中,好美的秋色!輕松的心緒,瀏覽著錯落有致的彩林,沒有思想的負累…… ...
    如夢過兒閱讀 485評論 0 5