Siri 快捷方式——如何實現它們?

已發表: 2020-01-16

Siri 快捷方式是去年 WWDC 上提出的一項新功能,它提供了在後台執行應用程序某些功能的能力。 我們不必打開應用程序就可以在應用程序中使用這些功能,我們可以簡單地對 Siri 說,例如“漢堡時間”,系統就會知道該快捷方式分配給哪個應用程序並為我們訂購漢堡。

什麼是 Siri 快捷方式?

  • 從鎖定屏幕或搜索區域完成任務的便捷方式。
  • 還可以將快捷方式添加到 Siri,以便在 iOS、HomePod 和 watchOS 上使用語音短語運行。
  • 開發人員將快捷方式掛鉤添加到他們的應用程序中,使 Siri 能夠連接到這些快捷方式。
  • 使用您行為的機器學習模型來分析您執行的常見功能並自動建議快捷方式。
  • iOS 12+

在本文中,我們將重點介紹下單快捷方式的實現,這是 Siri Shortcuts 最流行的應用程序之一。 我們將創建一個簡單的應用程序,讓您可以訂購漢堡

我們如何創建 Siri 快捷方式?

創建 Siri 快捷方式的過程
  1. 一開始,我們必須考慮用戶真正想要在我們的應用程序中簡化的功能。 這應該是用戶經常執行的功能,並且需要用戶進入應用程序並在其中傳遞很長的路徑。 快捷方式將能夠縮短此路徑以執行功能。
  2. 在下一步中,您需要捐贈一個快捷方式。 這是什麼意思? 我們必須將有關我們已下訂單的信息傳遞給系統,例如一個帶有培根的漢堡。 我們將此信息提供給系統,然後 Siri 可以在特定時間建議我們進行此特定訂單。
  3. 最後要做的是處理這個快捷方式,當用戶告訴 Siri 之前定義的命令時,例如“漢堡時間”,或者當用戶在鎖定屏幕上按下 Siri 建議的快捷方式時,就會發生這種情況。

好吧,也許我們會寫一些代碼? 作為開發人員,我們有哪些可能性?

NSUserActivity & Intents - Siri 快捷方式示例

NSUserActivity - 我們將創建一個快捷方式,讓我們啟動屏幕以進行新訂單

  1. 將密鑰添加到 Info.plist
 <key>NSUserActivityTypes</key>
<數組>
	<string>com.miquido.SiriShotcutDemo.make-order</string>
</array>

2.用戶進屏時捐贈快捷方式

 讓 orderActivity = NSUserActivity(activityType: "com.miquido.SiriShotcutDemo.make-order")
orderActivity.persistentIdentifier = NSUserActivityPersistentIdentifier("com.miquido.SiriShotcutDemo.make-order")
orderActivity.isEligibleForSearch = true
orderActivity.isEligibleForPrediction = true
orderActivity.title = "下訂單"
orderActivity.suggestedInvocationPhrase = "漢堡時間"

讓屬性 = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)
attributes.contentDescription = "美味的漢堡!"
attributes.thumbnailData = UIImage(named: "logo")?.pngData()
orderActivity.contentAttributeSet = 屬性
用戶活動 = 訂單活動

3. 在AppDelegate中,您必須實現continueUserActivity委託,在獲得此特定類型後,將重定向到給定屏幕

 func應用程序(_應用程序:UIApplication,
                 繼續用戶活動:NSUserActivity,
                 restoreHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    如果 userActivity.activityType == "com.miquido.SiriShotcutDemo.make-order" {
        // 處理訂單屏幕上打開的應用程序
        返回真
    } 
    返回假
} 
實施 Siri 快捷方式來點漢堡的過程

意圖——我們將實現一個快捷方式來下訂單

實施前的專業提示:
當用戶系統地做某事時,意圖就會出現。 但是,當您想測試此功能以便始終從 Siri 獲得建議時,您必須在設置 -> 開發人員中啟用兩個選項——“顯示最近的快捷方式”和“在鎖定屏幕上顯示捐款”。

選項:在鎖定屏幕上顯示最近的快捷方式和顯示捐贈
  1. 創建意圖定義文件。 最好的方法是將它添加到我項目中的單獨框架中,它將位於OrderKit中。
SiriKit 意圖定義文件圖標

2. 選擇一個類別,在本例中為“訂單”。 在這個文件中,我們必須選擇我們將傳遞給系統的參數並創建這些參數的組合。

自定義 Intent、參數和快捷方式類型
訂單定義 – 創建自定義意圖
訂單定義 - 定義響應
訂單定義 - 定義響應

3. 創建一個帶有意圖擴展的新目標,創建時選擇“包含 UI 擴展”。

意圖擴展圖標
文件 -> 新建 -> 目標... -> 意圖擴展
這是Order.intentdefinition的 Target Membership 的樣子

4. 在MainInterface.storyboard文件中為意圖創建一個 UI。

為意圖創建 UI
為我們的 Intent 創建 UI

5. 在IntentViewController中配置readysuccess狀態。

 func configureView(for 參數: Set<INParameter>,
                       交互:INInteraction,
                       交互行為:INUI交互行為,
                       上下文:INUIHostedViewContext,
                       完成:@escaping (Bool, Set<INParameter>, CGSize) -> Void) {
        
    守衛讓意圖=交互。意圖為? 訂單意向其他 {
        完成(假,設置(),.零)
        返回
    }
    如果interaction.intentHandlingStatus == .ready {
        設置(含:意圖)
        waitTime.isHidden = true
        完成(真,參數,desiredSize)
    } 否則,如果interaction.intentHandlingStatus == .success,
        讓 response = interaction.intentResponse 作為? 訂單意向響應 {
        設置(含:意圖)
        waitTime.isHidden = false
        如果讓 waitTimeText = response.waitTime {
            waitTime.text = "訂單將在 \(waitTimeText) 分鐘內準備好"
        }
        EverythingIsOkLabel.text = "點擊顯示訂單"
        完成(真,參數,desiredSize)
    }

    完成(假,參數,.zero)
}

私人功能設置(意圖:OrderIntent){
    burgerNameLabel.text = intent.burgerName
    如果讓數量 = intent.quantity?.stringValue {
        quantityLabel.text = "\(數量) 個。"
    }
    如果讓添加 = intent.additions {
        addedsLabel.text = 添加.元素.toString
    }
}

6.創建好UI後,我們就可以去捐贈我們的意向了。 在這種情況下,最好在下單時註明捐贈意向。 我們向系統提供我們之前在文件Order.intentdefinition中定義的所有信息,即漢堡名稱、數量和添加物,以及在我們想在下訂單時立即將此快捷方式添加到 Siri 的情況下顯示的建議短語.

 private func donateInteraction(for order: Order) {
    讓交互= INInteraction(意圖:order.intent,響應:無)
    
    互動.捐贈{(錯誤)在
        如果錯誤!= nil {
            // 處理錯誤
        } 別的 {
            print("捐贈互動成功")
        }
    }
} 
 公共擴展訂單{
    
    變種意圖:OrderIntent {
        讓 orderIntent = OrderIntent()
        orderIntent.burgerName = 名稱
        如果讓intValue = Int(數量){
            orderIntent.quantity = NSNumber(值:intValue)
        }
        orderIntent.suggestedInvocationPhrase = "漢堡時間"
        
        orderIntent.additions = addeds.map { option -> INObject in
            返回INObject(標識符:option.rawValue,
                            顯示:option.rawValue)
        }
        退貨訂單意向
    }
    
}

7. 現在我們可以處理當用戶收到快捷方式的建議並單擊它以及用戶通過 Siri 調用快捷方式時會發生什麼情況。

 公共類 OrderIntentHandler: NSObject, OrderIntentHandling {
    
    公共函數確認(意圖:OrderIntent,
                        完成:@escaping (OrderIntentResponse) -> Void) {
        完成(OrderIntentResponse(代碼:OrderIntentResponseCode.ready,userActivity:nil))
    }
    
    公共函數句柄(意圖:OrderIntent, 
                       完成:@escaping (OrderIntentResponse) -> Void) {
        守衛讓 burgerName = intent.burgerName else {
            完成(OrderIntentResponse(代碼:.failure,userActivity:nil))
            返回
        }
        
        Defaults.save(訂單:訂單(來自:意圖))
        完成(OrderIntentResponse.success(burgerName:burgerName,waitTime:“5”))
    }
    
} 
Siri 快捷方式演示

就是這樣,一切正常

你可以在這裡查看我的 GitHub 上的整個項目

資料來源:

  • https://developer.apple.com/videos/play/wwdc2018/211/
  • https://developer.apple.com/videos/play/wwdc2018/214/
  • https://developer.apple.com/documentation/sirikit/donating_shortcuts
  • https://developer.apple.com/design/human-interface-guidelines/sirikit/overview/siri-shortcuts/
  • https://www.raywenderlich.com/6462-siri-shortcuts-tutorial-in-ios-12