Swift Siriショートカット実装、動作

参考

Qiita「[iOS 12]Siri Shortcutsの最小実装 – NSUserActivity編」
PEAKS「iOS 12 Programming」

概要

Single View Appプロジェクト、Siriショートカット追加

実装

Info.plist

NSUserActivityTypes追加

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSUserActivityTypes</key>
        <array>
            <string>jp.cloudsquare.ios.ExampleSiriShortcut.siri</string>
        </array>
:
省略
:
</dict>
</plist>

ViewController.swift

import追加

import UIKit
import Intents

NSUserActivity登録

    override func viewDidLoad() {
        super.viewDidLoad()
        super.userActivity = NSUserActivity.userActivity
        print("viewDidLoad")
    }

NSUserActivity生成

extension NSUserActivity {
    public static let myActivityType = "jp.cloudsquare.ios.ExampleSiriShortcut.siri"
    
    public static var userActivity: NSUserActivity {
        let userActivity = NSUserActivity(activityType: myActivityType)
        
        userActivity.isEligibleForSearch = true
        userActivity.isEligibleForPrediction = true
        userActivity.title = "Example Siri Shortcut"
        userActivity.suggestedInvocationPhrase = "Test"
        
        return userActivity
    }
}

AppDelegate.swift

ショートカットからの呼び出し先:UIApplicationDelegateのapplication(_:continue:restorationHandler:)
trueを返せば画面が呼び出される

    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        if userActivity.activityType == NSUserActivity.myActivityType {
            print("application(_:continue:restorationHandler:)")
            return true
        }
        return false
    }

動作

ショートカット登録

Siriと検索選択

ショートカット候補に追加されている

赤い釦を押下、呼び出しに使用するフレーズを登録

登録結果

呼び出し

Siriを呼び出し、登録したフレーズを発声
画面が起動されます

呼び出しに関して

Siriショートカットからの呼び出し時、ViewControllerのviewDidLoad等は呼ばれない。
application(_:continue:restorationHandler:)以降に表示されていない。

Swift

Posted by shi-n