【Swift/iOS】AppShortcutsProviderの実装方法!ショートカット自動追加
この記事からわかること
- Swift/iOSのAppShortcutsProviderの実装方法
- ショートカットやSiriで操作を実行するには?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:16.0
- iOS:18.0
- Swift:5.9
- macOS:Sonoma 14.6.1
公式リファレンス:App Intentでアプリのコア機能をユーザーに提供 - WWDC2024
App Intentsフレームワーク
「App Intentsフレームワーク」はアプリがSiriやショートカット、ウィジェットと連携するための機能を提供しているフレームワークです。アプリで提供している機能やデータに対してユーザーが音声コマンドやショートカットを経由してアクセスできるようになります。
実際にコードベースで見るとSiriやショートカットと連携するためには「App Intent」という特定のインターフェースを定義する必要があります。「App Intent」の実装方法は以下の記事を参考にしてください。
AppShortcutsProvider
「App Intent」で定義したインテントはショートカットアプリから追加できるようになりますが、ユーザーが追加しないとそのインテントは使用できません。(Siriで問いかけても動作しない)
アプリをインストールした段階でインテントを有効にさせたい場合はAppShortcutsProvider
を使用します。AppShortcutsProvider
で定義するとショートカットアプリに以下のように表示されるようになり、ユーザーが追加作業を行わなくてもSiriなどを使用してインテントを実行できるようになります。
実装方法
適応させるにはAppShortcutsProvider
を継承した構造体を実装するだけです。構造体を定義しておくだけで自動でショートカットアプリに反映されるようになります。中に定義するのは[AppShortcut]
型のappShortcuts
プロパティです。
import AppIntents
struct AppTestShortcuts: AppShortcutsProvider {
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: AppTestIntent(),
phrases: [
"Start a \(.applicationName)",
"\(.applicationName)を起動して",
],
shortTitle: "アプリを起動する",
systemImageName: "swift"
)
AppShortcut(
intent: FetchDataDialogIntent(),
phrases: [
"\(.applicationName)のデータを表示して",
],
shortTitle: "データを取得する",
systemImageName: "note.text"
)
}
}
配列で保持するAppShortcut
型がデフォルトで用意できるショートカットのインターフェースになります。この中に実行したいインテントやSiriで起動するためのフレーズを定義しておきます。
AppShortcut(
// 実行したいインテント
intent: AppTestIntent(),
// Siriで呼び出す時のフレーズ
phrases: [
// .applicationNameでアプリ名を取得できる
"Start a \(.applicationName)",
"\(.applicationName)を起動して",
],
// 表示されるタイトル
shortTitle: "アプリを起動する",
// 表示されるアイコン
systemImageName: "swift"
)
Siriのフレーズにはアプリ名である.applicationName
を含めないと動作しませんでした。またアプリ名はディスプレイ名に指定した値が反映されますが、アプリ名によってはうまく動作しない場合があるので注意してください。(TestAppという名前で進めてみたら動作しませんでした)
ショートカットに表示されない
AppShortcutsProvider
に定義しているのにショートカットに表示されない場合があるようです。再起動などしても表示されない場合はAppShortcutsProvider
の定義を見直してみてください。[AppShortcut]
の実装方法(配列をreturnするなど)によってもうまく動作しないこともあるようです。
明示的にupdateAppShortcutParameters
メソッドを呼び出すことで表示されることもあるようなので試してみてください。
init() {
AppTestShortcuts.updateAppShortcutParameters()
}
シミュレーターでSiriを有効/起動にする
シミュレーターでSiriを有効/起動にするためには上部メニュー「Device」>「Siri」をクリックすることでSiriが起動するので後はMacに話しかけると動作してくれます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。