Flutterアプリでショートカット/クイックアクション機能を実装する
はじめに
個人で開発しているサブスク管理アプリsubskunでショートカット機能を実装しました。
ショートカット機能はホーム画面のアプリアイコンを長押ししたときに表示されるアレです。iOSではクイックアクションと呼ばれているようです。
方法
パッケージ
quick_actions
というパッケージを使用します。現時点での最新パージョンは1.0.1
です。
実装方法
実装方法は簡単で、QuickActions
クラスのインスタンスに対してinitialize
とsetShortcutItems
でショートカットの設定をします。
呼び出す場所はドキュメントでは”early in your application's lifecycle
“と書かれています。特に理由がなければ一番最初に出てくるページのinitState
内などで良いかと思います(サンプルでもそうなっています)。
const quickActions = QuickActions();
// ショートカットが呼び出されたときの処理をコールバックに設定する
quickActions.initialize((shortcutType) {
if (shortcutType == 'create') {
// 呼ばれたショートカットの種類によって処理を出し分ける
}
});
// 利用できるショートカットの種類とアイコンを設定
// typeはShortcutItem内で一意の名前にする必要があり、これがinitizeliaのコールバックの引数になる
quickActions.setShortcutItems(
[
ShortcutItem(
type: 'create',
localizedTitle: '作成',
icon: 'ic_create',
),
],
);
アイコンを用意
ショートカットで利用されるアイコンのファイル名はShortcutItem
のicon
で設定したものになります。
画像の配置位置は、Androidではdrawable
またはmipmap
に、iOSではAssets.xcassets
に配置します。また、iOSでは画像サイズごとにファイル名の末尾に-20x20@1x
などがつくと思います。
Androidでの追加対応
Androidの本番環境で動作確認をしてみると、アプリの設定次第ではショートカットのアイコンが表示されない問題が発生することがあります。
Androidではビルド時の設定でリソースの圧縮が有効になっていると、未使用のリソースが削除されます。これによって上記の問題が発生します。
この問題は指定したリソースを削除しないよう明示的に設定しておくことで回避できます。
具体的にはリソースのtools:keep
属性を利用することで、保持するリソースを指定することができます。
res/raw/keep.xml
というファイルに、以下のようなxmlを作成します。
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@mipmap/ファイル名" />
これでビルドしてみると、ショートカットのアイコンが表示されるようになりました。
おわり
ショートカット機能はとても便利ですが、普段スマホを使っていてもショートカット/クイックアクション機能がそもそもOSに搭載されていることを知らないユーザーもたくさんいそうですね…