在這里放出原文鏈接地址
Part 5.1: 創建一個 Intents UI Extension
當你處理一個 Intent
時, Siri
和 Maps
通常會使用一個默認的 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
:
使用 Xcode 打開你的工程.
-
選擇 File -> New -> Target
-
在 iOS 標簽下選擇
Intents UI Extension
, 點擊 Next.
指定文件名稱、開發語言以及其他的選項. 點擊 Finish.
Xcode 提供的模板包含了一個 Storyboard
文件, 其中包含了一個初始的視圖控制器, Siri
和 Maps
會通過 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
:
選擇你的
Info.plist
文件.-
展開
NSExtension
和NSExtensionAttributes
這兩個 Key.
在
IntentsSupported
Key 中添加你需要支持的Intent
, 字符串類型, 值則是Intent
的類名.
了解更多配置 Info.plist
的內容, 請查看: Information Property List Key Reference
Part 5.3: 實現你的視圖控制器
Storyboard
中的初始視圖控制器, 就是用來向用戶展示自定義內容的. 在向用戶展示你的自定義 UI 界面之前, Siri
和 Maps
將會先加載初始視圖控制器, 并且調用其中的 configureWithInteraction:context:completion: 方法, 實現這個方法時, 使用該方法提供的交互對象( interaction object ) 來配置你視圖控制器中需要顯示的內容. context
參數將會告訴你視圖控制器應該顯示 Siri
或 Maps
的內容, 所以此時你是有機會通過這個參數來判斷你應該向用戶展示哪些自定義內容的.
在用戶 dismiss
掉 Siri
或Maps
之前, 你的視圖控制器都是顯示在屏幕中的, 你可以使用 Timer
或其他的一些技術來更新你的界面. 該視圖控制器同樣遵守普通視圖控制器的生命周期, 例如顯示、隱藏之類的, 不同的是, 該視圖控制器是不接收任何觸摸事件的, 而且你也不可以在上面添加任何手勢. 所以在該控制器上不要創建任何需要用戶交互的試圖.
下圖中展示的是 Intents UI Extension
和 它的視圖控制器的生命周期. 系統創建視圖控制器, 并且調用configureWithInteraction:context:completion: , 并且該方法會傳入一個交互對象 ( interaction object ), 用這個對象來配置你的界面. 一旦配置完成, 你的視圖控制器將會顯示在屏幕中, 當你的視圖控制器出現在屏幕上以后, 你可以做一些動畫之類的操作, 也可以使用 Timer
或其他的一些技術來實現你界面的更新邏輯, 但是請記住, 它是不接受任何事件的.
注意:
當視圖控制器出現在屏幕上以后,Maps
將會再一次調用configureWithInteraction:context:completion: 方法將需要更新的信息發送給你, 讓你來顯示最新的內容. 例如:Maps
將會調用這個方法, 將旅行預訂的最新狀態發送給你, 利用這個時機來更新你的界面.
當用戶 dismiss
掉 Siri
或 Maps
以后, 系統將會 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 來說, Siri
和 Maps
將會展示一個地圖來顯示用戶的位置. 如果你想用你的自定義界面來顯示相同的信息, 使用 INUIHostedViewSiriProviding 協議來禁止系統提供默認界面的顯示.
了解更多禁止默認頁面顯示的內容, 請查看: INUIHostedViewSiriProviding Protocol Reference
Lemon龍說:
如果您在文章中看到了錯誤 或 誤導大家的地方, 請您幫我指出, 我會盡快更改
如果您有什么疑問或者不懂的地方, 請留言給我, 我會盡快回復您
如果您覺得本文對您有所幫助, 您的喜歡是對我最大的鼓勵
如果您有好的文章, 可以投稿給我, 讓更多的 iOS Developer 在簡書這個平臺能夠更快速的成長