WWDC 2018: Shortcuts 快速入門

Shortcuts

WWDC 2018 Session 216:Introduction to Siri Shortcuts
查看更多 WWDC 18 相關文章請前往 老司機x知識小集xSwiftGG WWDC 18 專題目錄
做者:米廣,米菜雞在搬磚ios

本文主要介紹一些 SiriKit 的基本用法,以及如何建立 Shortcuts(三個步驟) Shortcuts 就是可以讓用戶自定義一段語音 (Phase) 或識別用戶的語音短語,用戶說出這個短語,能夠執行既定的邏輯。 ShortcutsSiriKit 的一部分,是原有 SiriKit API 的擴展, 用戶能夠經過 Siri 指令,執行 App 內的一系列邏輯,Shortcuts 自己的指令須要足夠簡潔,Shortcuts 在設計時應該足夠的簡潔,可以知足用戶的目的,常常能被常用,而且易於記住。 Shortcuts 不是 SiriKit 中抽象的 Intent , 舉例來講 Intent 描述了一種用戶的抽象意圖,好比「訂電影票」,但一種具體的用戶意圖是「在最近電影院訂 3 張『侏羅紀公園2』的電影票」,Shortcut 就是指代這種具體的用戶意圖。Shortcut 最終是讓用戶能夠利用 Siri 快速執行這種可重複的具體意圖swift

首先簡介一些 SiriKit 的基本用法

  • 使用 SiriKit 須要在項目中先新建一個 Intent Extensiontarget,若是須要本身定 Siri 中的交互視圖,還須要建立 Intent UIExtension ,分別負責處理 Intent 的業務邏輯 和 Intent 的視圖;

新建 Siri Intents Extension

  • 新建 Intent Definition File

  • Intent Definition File 新建 Intent , 會自動生成對應 Intent 的類文件, 在類文件中,會關聯你聲明的 parameter 爲類的屬性,有關這種文件的具體用法,下文中會結合實例說明。api

  • SiriKit 的核心是 Intent , 也就是一種天然語言的描述,描述了用戶的意圖;使用 SiriKit 並不須要實現具體的天然語言解析,你只須要按照正常語言描述便可,說明一句話中需猜測的參數, Intent DefinitionHandler 也告訴 Siri 如何來解析、處理和推測用戶意圖,以及根據上下文在合適的時機向用戶推薦這些 Intent 。Intent 的生命週期分爲:Resolve - Confirm - Handle ,好比 Siri 中的發消息這種 Intent(System Intent), Inetnt 描述了收件人、消息內容等,同時須要在 IntentHandler 中解析和糾錯收件人和消息內容(resolve),確認用戶的操做(confirm),以後將消息發送出去(handle);再好比 Clock 的計時器的 Intent,描述了用戶說「計時70分鐘」所想要設定的計時器中哪些部分是具體的變量,哪些是單位(resolve),以及如何轉化爲對應計時器的響應(handle);滴滴作的 Intents ,經過語言解析出目的地(resolve) ,用戶確認價格(confirm),最終幫助用戶叫到車(handle)。SiriKit 在 iOS10 中推出,若是你對 SiriKit 不太熟悉,推薦 閱讀 WWDC2016 Session217 Introducing SiriKitSiriKit 的文檔 以及 raywenderlich 的 SiriKit 快速入門!app

  • 以調用 App 發送信息爲例 ,IntentHandler 類會遵循 INSendMessageIntentHandling 協議,實現如下四個方法,對 Siri 的事件進行異步處理,每一個 block 中的 Result(主要包括一些內容矯正的方法) 或 Response(主要含有一個 NSUserActivity 的屬性) 參數中包含了實際的處理異步

    func resolveRecipients(for intent: INSendMessageIntent, with completion: @escaping ([INPersonResolutionResult]) -> Void)  // 處理接收人 - Resolve
        func resolveContent(for intent: INSendMessageIntent, with completion: @escaping (INStringResolutionResult) -> Void)  // 處理信息內容 - Resolve
        func confirm(intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) // 確認的操做 - Confirm
        func handle(intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) // 發送信息 - Handle
    複製代碼

基於 Shortcut 的行爲來決定實現方法

  • 若是是打開 App 特定頁面,跳轉到 App 內用戶繼續完成一些操做,在 Spotlight 結果中復現已經索引的內容,或者提供 Handff 操做,這種狀況的 Shortcut 推薦使用 NSUserActivity 來實現,只需修改 userActivity 的新屬性 isEligibleForPrediction ,並向 viewcontrolleruserActivity 屬性賦值便可完成 donate
  • 若是用戶無需跳轉到 App 內,經過 Siri 語音或者自定義的 Siri 展現界面便可響應用戶需求(使用 Siri Intent Extension Target 響應),推薦使用 Intents , 固然 Intent 也能夠實現跳轉到 App

建立 Shortcuts 的三個步驟

  • Declare Shortcut - 聲明 Shortcut

  • Donate Shortcut - 向 iOS 告知本身的 Shortcut

  • Handle Shortcut - 處理對應的 Shortcut 的實際響應

使用 NSUserActivity 實現 Shortcut

若是不熟悉 NSUserActivity能夠參考這裏的文檔 https://developer.apple.com/documentation/foundation/nsuseractivity )ide

  • 在項目的 Info.plist 文件中, 聲明一個新的 user activity type,例如:spa

  • <key>NSUserActivityTypes</key> <array>
    <string>com.myapp.name.my-activity-type</string> </array>
    複製代碼
  • 步驟 I:Declare Shortcut :聲明新的 NSUserActivity 如同以往, 要支持 Shortcuts 只需聲明一個新屬性 isEligibleForPrediction 爲 true, 以下

  • let userActivity =  NSUserActivity(activityType: "com.myapp.name.my-activity-type")
    userActivity.isEligibleForSearch= true
    userActivity.isEligibleForPrediction = true // 新屬性,賦值爲 true 後能夠暴露給 `SiriKit`
    userActivity.title = "Activity的顯示標題"
    userActivity.userInfo = ["key": "value"] 
    userActivity.suggestedInvocationPhrase = "一些推薦的建議"
    
    let attributes = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)
    let image = UIImage(named: "myImage")!
    attributes.thumbnailData = image.pngData()
    attributes.contentDescription = "Activity 的副標題"
    userActivity.contentAttributeSet = attributes
    
    viewController.userActivity = userActivity // 賦值以後,這條 UserActivity 就被 donate 了
    複製代碼
  • 步驟 Ⅱ:Donate Shortcut :將新建的 NSUserActivity 對象賦值給 viewController 的 userActivity 屬性便可完成 donate,如上

  • 步驟 Ⅲ:Donate Shortcut :在Siri 喚起 App 時,在 Appdelegate 中處理經過 UserActivity 相關的信息,以下

  • func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
        if userActivity.activityType == "com.myapp.name.my-activity-type" {
            // 匹配 activity 的種類
        }
        if interaction = userActivity.interaction {
            // 處理 Siri 所告知的相關信息
        }
    // 根據已知信息,跳轉到用戶所需頁面,或恢復一些場景
    }
    複製代碼

使用 Intents 來建立 Shortcut

這裏將藉助蘋果提供的 Siri ShortcutsDemo (點擊下載) 來進行講解設計

  • 這個 Demo 中的結構是,App 與 Intent 共用了一部分業務代碼,也就是處理「湯」的一部分邏輯,這部分封裝爲SoupKit.framework , 這樣作能夠複用代碼,由於 Intent 有單獨執行的能力,也會用到「湯」的相關邏輯。SoupChef 是 App 的 target ;SoupChefIntents 這個 target 處理了 Siri Intents 的實際 Handler;SoupChefInetntsUI 處理自定義的 Siri 響應視圖;SoupKit包含了共用的「湯」的邏輯,具體邏輯見下圖,蘋果但願咱們使用這種方式來組織咱們的 App ,複用更多代碼 3d

  • 步驟 I:Declare Shortcut

    • 新建一個 Intent 調試

    • Intent Definition File 選擇不在主項目中生成相關類,避免符號表衝突

    • Intent Definition File 中聲明如圖中的字段,具體做用在圖中註明

    • 編輯後在編譯對應的 target 時會自動生成對應的$(name)Intent.swift文件,這個 intent 被關聯到 SoupKit 中,因此編譯 SoupKit 時會生成以下文件

    • 而後在 Intent Definition 中進一步聲明相關的 Response

    • 編譯時會自動生成,對應的IntentResponse

    • 經過以上步驟,就完成了聲明一個 Siri Intent ,這個 Intent 描述了用戶向 Siri 說 'Order Soup' 的時候響應

  • 步驟 Ⅱ:Donate Shortcut

    • 結合訂餐這個場景, 每次在用戶訂完餐後,能夠告知 Siri 一個新的 Intent,每次訂餐成功後,本身新建一個 Intent 對象,並調用 donate() 方法, 具體代碼以下,這種方式 donate 後,用戶能夠在設置 - Siri 中看到這個 Shortcut ,而且在 Spotlight 的推薦中也會出現這個 Shortcut

    • Shortcuts 的一大新特性是用戶自定義語音,這樣的話,用戶可使用本身喜歡的語音指令來完成訂餐操做,好比「來碗蛤蜊湯」,若是想要在 App 內讓用戶自定義語音命名一個 Shortcut,能夠經過 Present INUIAddVoiceShortcutViewController 實例來實現,具體方法以下

    • App 內喚起 新建和編輯 Shortcut 的Controller 會顯示以下效果,此時用戶能夠將對應 Shortcut 自定義語音保存到 iOS 內

    • 在新版的 iOS12 調試中,在 Developer 中開啓相關選項,在鎖屏和 spotlight 搜索界面顯示上一次的 Shortcuts 指令,不須要一遍遍語音調試 Siri

    • 設置好以後, 在手機上就能夠看到這個,第一次須要使用 Siri 語音試一次,以後就能夠在 Spotlight 和 鎖屏界面出現

    • OrderDetail Controller 中,有相關 NSUserActivity 的相關信息,只需將 iOS12 的新增的屬性賦值爲了 isEligibleForPrediction = true,就能夠直接 donate NSUserActivity 類的 Shortcuts, 也就是上面圖片中的 第二個選項

    • 有關在 apple Watch 的 Siri 錶盤中展示相關 intents, 請參照(Session Siri Shortcuts on Watch Face)

  • 步驟 Ⅲ:Donate Shortcut

    • Intent 最終都須要經過INExtension 的子類來進行回調,最終會經過如下方法進入到你的代碼中
  • 以後,你就能夠進行 Intent 中進一步的處理, 該 Intent 實際爲 OrderSoupIntent ,會包含 soup、quantity、options 等屬性,調試時,能夠直接將 Siri Intent Extension 也就是 SoupChefIntents 這個 target 編譯到手機上,並選擇 Siri 爲運行對象,就能夠只調試 Handler 相關邏輯,而不運行 App

調試效果以下,有關 Intent 的 handler ,能夠參考 demo 中的具體代碼

自此完成了 Intent 的 Declare 、Donate 、Handle , 有關 Intent 的進一步應用,能夠參考 Demo文檔和 WWDC 相關 Session211 、21四、21七、22五、228

相關文章
相關標籤/搜索