はじめに
こんにちはsuzukiです。前回に続き、SwiftのQuickActionについて触れて行きます。 前回はQuickActionで固定のパラメーターを送るように設定しましたが、アプリの内部の情報によってQuickActionの内容を、動的に設定する方法について説明して行きます。
動的なショートカットの追加
動的なショートカットで何ができるかというと例えば天気アプリのように、上二つの地域を表示することができます。
この機能を利用すれば固定のショートカットに比べ、
通話回数の一番多い人に電話をかける画面を表示するのような、ユーザーの行動に即したショートカットを設定することが可能です。。
前回説明が漏れてしまっていたのですが、設定できるショートカットの上限は4つとなります。限られた枠をどう使うのかもよく考えた方がいいですね。
実装
実装自体は非常に簡単です。UIMutableApplicationShortcutItemというクラスを作成し、設定するだけです。
UIMutableApplicationShortcutItem
InfoPlistで固定のショートカットとほぼ同じで、下記のプロパティが用意されています。
- var type: String:タイプの指定(必須)
- var icon: UIApplicationShortcutIcon?:ホーム長押しで表示されるアイコンの指定
- var localizedTitle: String:ホーム長押しで表示されるタイトルの設定(必須)
- localizedSubtitle: String?:ホーム長押しで表示されるサブタイトルの設定
- var userInfo: [String : NSSecureCoding]?:タップ時に受け取る情報を設定可能
実際に使う場合だとこんな感じです。
1 2 | let shortcut = UIMutableApplicationShortcutItem(type: "Location", localizedTitle: "Tokyo", localizedSubtitle: nil, icon: UIApplicationShortcutIcon(type: .markLocation), userInfo:nil) UIApplication.shared.shortcutItems = [shortcut] |
動的にショートカットを設定する
試しにABCのボタンを作成し、最も多く推されているボタンに対するショートカットを設定するというコードを書いてみました。実際に使う際は、一応intのオーバーフローの際の動作とかを定義する必要があるかなと思っております。
ボタンをタップした際の動作
1 2 3 4 5 6 | @IBAction func buttonAction(_ sender: UIButton) { var count = UserDefaults.standard.integer(forKey: "Key\(sender.tag)") //このままではオーバーフロー起こしちゃうので実際に実装する場合はリセットのことまで考える必要あるかも。 count += 1 UserDefaults.standard.set(count, forKey: "Key\(sender.tag)") } |
一番タップされているボタンの取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class ShortCutUtil { //一番タップされている値の取得 func mostTaped() -> String? { let userdefault = UserDefaults.standard let countArray:[(count: Int, name: String)] = [ (userdefault.integer(forKey: "Key0"),"A"), (userdefault.integer(forKey: "Key1"),"B"), (userdefault.integer(forKey: "Key2"),"C") ] let max = countArray.max { (a, b) -> Bool in return a.count < b.count } return max?.name } } |
アプリがバックグラウンドに遷移した際にショートカットの更新
1 2 3 4 5 6 | func sceneDidEnterBackground(_ scene: UIScene) { if let mostTapped = ShortCutUtil().mostTaped(){ let shortcut = UIMutableApplicationShortcutItem(type: "TappedTest", localizedTitle: "\(mostTapped)に電話をかける", localizedSubtitle: nil, icon: UIApplicationShortcutIcon(type: .contact), userInfo:nil) UIApplication.shared.shortcutItems = [shortcut] } } |
さいごに
今携わっているアプリでは、QuickActionを使って設定したい機能がいくつかあります。ただショートカット機能が、あまり認知されていないので、アプリ内で機能紹介しようかと思っております。ユーザビリティを少しでも上げる一手になればいいのかなと思っております。