Swift Academy · レッスン

App IntentsとShortcuts

SiriとShortcutsからアクションを利用できるようにします。

レッスン 4/413 ステップ

「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"
_ = phrases

Siri以外への展開

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"
_ = reuse

Intentのローカライズ

タイトルとダイアログには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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. WidgetKitウィジェットの構築
  2. タイムラインプロバイダーとスナップショット
  3. App Extensionsの概要
  4. App IntentsとShortcuts
← Swift Academyに戻る