App IntentsとShortcuts
SiriとShortcutsからアクションを利用できるようにします。
「App IntentsとShortcuts」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
App Intentsとは
App Intentsフレームワークは、アプリのアクションをSiri、Shortcuts、Spotlight、Widget、アクションボタンなどのシステムに公開します。アクションをSwiftの型として一度記述すると、音声操作や自動化に対応した状態で、さまざまな場所から利用できるようになります。
import AppIntents
// Define an action as a type; the system can run it
// from Siri, Shortcuts, Spotlight, widgets, etc.AppIntentを定義する
IntentはAppIntentに準拠し、ユーザー向けのtitleを宣言し、処理を実行して結果を返すperform()を実装します。フレームワークが自動的に検出するため、登録は必要ありません。
import AppIntents
struct AddTaskIntent: AppIntent {
static var title: LocalizedStringResource = "Add Task"
func perform() async throws -> some IntentResult {
// create the task here
return .result()
}
}パラメーター
@Parameterプロパティラッパーを使って、ユーザーまたはSiriに入力を求めます。システムは不足している値を尋ね、その値を検証します。各パラメーターには、Shortcutsエディタに表示されるタイトルがあります。
import AppIntents
struct AddTaskIntent: AppIntent {
static var title: LocalizedStringResource = "Add Task"
@Parameter(title: "Title")
var taskTitle: String
func perform() async throws -> some IntentResult {
return .result()
}
}値とダイアログの返却
Intentはデータを返し、確認メッセージを伝えることができます。IntentResultの.result(value:dialog:)などのバリエーションを使うと、型付きの値と、Siriがユーザーに読み上げたり表示したりするダイアログを返せます。
import AppIntents
struct CountTasksIntent: AppIntent {
static var title: LocalizedStringResource = "Count Tasks"
func perform() async throws
-> some IntentResult & ProvidesDialog {
let count = 5
return .result(
dialog: "You have \(count) tasks")
}
}パラメータ概要
parameterSummaryは、Shortcutsエディタに表示される文を説明するもので、Add \(taskTitle) to my listのように、パラメータを自然な文章に組み込みます。ショートカットに組み込んだときにも、アクションの内容がわかりやすくなります。
import AppIntents
struct AddTaskIntent: AppIntent {
static var title: LocalizedStringResource = "Add Task"
@Parameter(title: "Title") var taskTitle: String
static var parameterSummary: some ParameterSummary {
Summary("Add \(\.$taskTitle) to my list")
}
func perform() async throws -> some IntentResult {
.result()
}
}エンティティ
AppEntityは、タスク、メモ、プレイリストなど、システムが扱えるモデルオブジェクトを表します。エンティティとクエリを用意すると、SiriやShortcutsで、ユーザーがデータの中からパラメータの値を選べるようになります。
import AppIntents
struct TaskEntity: AppEntity {
static var typeDisplayRepresentation:
TypeDisplayRepresentation = "Task"
var id: String
var displayRepresentation: DisplayRepresentation {
DisplayRepresentation(title: "\(id)")
}
static var defaultQuery = TaskQuery()
}エンティティクエリ
EntityQueryは、IDでエンティティを検索する方法と、候補を一覧表示する方法をシステムに伝えます。これにより、Shortcutsで値を選んだり、Siriに答えたりするときにユーザーが見る選択画面が動作します。
import AppIntents
struct TaskQuery: EntityQuery {
func entities(for ids: [String]) async throws
-> [TaskEntity] {
ids.map { TaskEntity(id: $0) }
}
func suggestedEntities() async throws -> [TaskEntity] {
[TaskEntity(id: "Groceries")]
}
}App Shortcuts
AppShortcutを使うと、ユーザーが先にショートカットを作成しなくても、設定なしでIntentを音声から実行できるようになります。Siriがコンテキストを把握できるように、アプリ名のトークンを必ず含むトリガーフレーズを指定します。
import AppIntents
struct AddTaskShortcut: AppShortcutsProvider {
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: AddTaskIntent(),
phrases: ["Add a task in \(.applicationName)"],
shortTitle: "Add Task",
systemImageName: "plus")
}
}トリガーフレーズ
フレーズには、Siriが意味を区別できるように\(.applicationName)を含める必要があります。ユーザーが言いそうな自然な言い回しを複数用意してください。マッチングはシステムが処理するため、言語を自分で解析する必要はありません。
import AppIntents
// Provide variants; applicationName is required:
// phrases: [
// "Add a task in \(.applicationName)",
// "Create a task with \(.applicationName)",
// "New \(.applicationName) task"
// ]
let phrases = "include applicationName token"
_ = phrasesSiri以外への展開
Intentは宣言的に定義されるため、同じAddTaskIntentで、インタラクティブウィジェットのButton(intent:)、コントロールセンターのコントロール、Shortcutsのアクションを動かせます。いずれも追加の接続処理なしでperform()を実行します。
import AppIntents
import SwiftUI
// In an interactive widget:
// Button(intent: AddTaskIntent()) {
// Label("Add", systemImage: "plus")
// }
let reuse = "one intent, many surfaces"
_ = reuseIntentのローカライズ
タイトルとダイアログにはLocalizedStringResourceを使うため、String Catalogを通じて翻訳できます。トリガーフレーズも言語ごとにローカライズできるので、Siriはユーザーの言語で応答できます。
import AppIntents
struct GreetIntent: AppIntent {
static var title: LocalizedStringResource = "Greet"
func perform() async throws
-> some IntentResult & ProvidesDialog {
.result(dialog: "Welcome back")
}
}クイックチェック
AppShortcutのフレーズを有効にする条件を思い出してください。
まとめ
App Intentsについて学びました:
titleとperform()を用意してAppIntentに準拠し、@Parameterで入力を受け取り、parameterSummaryで説明します。- データを
AppEntityとしてモデル化し、選択画面や候補表示のためにEntityQueryを用意します。 \(.applicationName)を含むAppShortcutのフレーズで、音声アクションを利用可能にします。- 同じIntentでSiri、Shortcuts、インタラクティブウィジェット、コントロールを動かせ、
LocalizedStringResourceでローカライズできます。
AI チューターと学ぶ Swift — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 122
- レッスン
- 409
よくある質問
「App IntentsとShortcuts」レッスンは無料ですか?
はい。「App IntentsとShortcuts」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「App IntentsとShortcuts」で何を学びますか?
SiriとShortcutsからアクションを利用できるようにします。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「App IntentsとShortcuts」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- WidgetKitウィジェットの構築
- タイムラインプロバイダーとスナップショット
- App Extensionsの概要
- App IntentsとShortcuts