🧬

[Swift]Home Screen Quick Actions 超速サンプル

2022/10/24に公開

Quick Actions の超速サンプルコードです。

サンプルプロジェクトはこちら。
https://github.com/hitonomichi/SampleHomeScreenQuickActions

設定

設定したいタイミングで下記を設定します。

  • 画像、タイトル、サブタイトル
  • タップ時に取得したい値(userInfo)
ViewControllerとか
// UIApplicationShortcutItem として保存する
var shortcutItems: [UIApplicationShortcutItem] = []
let bundleId = Bundle.main.bundleIdentifier ?? ""

let title = "タイトル"
let subTitle = "サブタイトル"
let icon = UIApplicationShortcutIcon(systemImageName: "clock") // システムアイコン
let icon = UIApplicationShortcutIcon(templateImageName: "quickactionsIconConfig") // Assetsに定義した任意画像
var userInfo: [String : String] = [:]
userInfo["キー1"] = "値1"
userInfo["キー2"] = "値2"

let shortcut = UIMutableApplicationShortcutItem(type: bundleId,
                                                 localizedTitle: title,
                                                 localizedSubtitle: subTitle,
                                                 icon: icon,
                                                 userInfo: userInfo as [String : NSSecureCoding])
shortcutItems.append(shortcut)

UIApplication.shared.shortcutItems = shortcutItems

タップ時の受け取り

タップ時にSceneDelegateのdelegateメソッドが呼ばれます。
アプリがバックグラウンドにあるか、タスクキルされているかで呼ばれるメソッドが変わります。

アプリがバックグラウンドにある場合

SceneDelegate.swift
func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void){
	// バックグラウンド時にQuick Actionsで起動された場合はここに来る
	guard let itemUserInfo = shortcutItem.userInfo else {
	    return
	}
	// userInfoからセットした値を取得できる
	let value1 = itemUserInfo["キー1"] as! String
	let value2 = itemUserInfo["キー2"] as! String
	print("value1=\(value1)")
	print("value2=\(value2)")
}

アプリがタスクキルされている場合

SceneDelegate.swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let _ = (scene as? UIWindowScene) else { return }
        
        if let shortcutItem: UIApplicationShortcutItem = connectionOptions.shortcutItem {
            // タスクキル時にQuick Actionsで起動された場合はここに来る
            guard let itemUserInfo = shortcutItem.userInfo else {
                return
            }
            // userInfoからセットした値を取得できる
            let value1 = itemUserInfo["キー1"] as! String
            let value2 = itemUserInfo["キー2"] as! String
            print("value1=\(value1)")
            print("value2=\(value2)")
        }
    }

表示例

アイコン長押しで表示します。
アイコン長押しで表示

Discussion