WWDC Quick Look 💓 By SwiftGGTeam
ショートカットの新機能

ショートカットの新機能

元の動画を見る

ハイライト

ショートカットには、スクリーンショット、キーボードの接続/切断、通知という 3 つの新しいオートメーショントリガーが追加されました。さらに Use Model アクションではモデルの transcript を確認でき、Storage による永続保存も使えます。これにより App のコンテンツは Apple Intelligence と深く連携し、状態を記憶したままデバイス間で同期するオートメーションを実現できます。

主要内容

オートメーションが片隅に隠れなくなった

これまでショートカットのオートメーションを設定するには、独立したオートメーションタブへ移動する必要があり、アクション編集とは分断されていました。iOS 26 では、オートメーションがショートカットエディタに直接組み込まれ、アクション一覧と同じ階層で表示されます。(01:15)

新しく 3 種類のトリガーが追加されました。

  • スクリーンショットオートメーション: スクリーンショットを保存したときに実行される
  • キーボードオートメーション: 外部キーボードが接続または切断されたときに実行される
  • 通知オートメーション: 指定した App のプッシュ通知を受け取ったときに実行される

通知オートメーションは最も分かりやすい用途です。たとえばデリバリー App があり、配達員が近づいたときに「配達員 John があと 5 分で到着します」という通知を送るとします。ユーザーはショートカットで、この App の通知に「arriving」が含まれていたら玄関のライトを自動で点灯する、という設定ができます。(01:51)

ここには開発者への暗黙の要件があります。通知文には具体的な主語、動詞、操作可能なデータを含める必要があります。「新しいメッセージがあります」とだけ書かれていると、ユーザーはキーワードで絞り込めず、オートメーションはほとんど役に立ちません。

Use Model アクションで「診療録」を見られるようになった

Use Model アクションを使うと、大規模言語モデルをショートカット内で直接実行できます。iOS 26 のモデルはより強力になり、ネットワークから最新情報を取得することもできます。(03:28)

ただしモデルの出力が間違っていたとき、以前は理由を推測するしかありませんでした。今は Use Model アクションの後ろに Show Content アクションを追加し、Transcript プロパティを選ぶことで、モデルが実際に受け取った元データを確認できます。(05:11)

たとえば Soup Chef App は、ユーザーの好みに基づいて Use Model でスープを選びます。初回実行時、ユーザーは辛いものを望んでいたにもかかわらず、モデルはメニューで最も穏やかなチキンコーンスープを選びました。Transcript を確認すると、モデルに渡された Soup Entity には名前と本日提供中かどうかしかなく、材料情報がありませんでした。そのためモデルは名前だけで辛さを推測するしかなかったのです。(04:54)

SoupEntityingredients プロパティを追加すると、モデルは正しくトムヤムクンスープを選べました。

Storage がショートカットに記憶を持たせる

Storage は iOS 26 のショートカットで最も大きな新機能です。ショートカットが複数回の実行をまたいでデータを保存でき、iCloud によるデバイス間同期にも対応します。(06:59)

ショートカットエディタには Storage ビューが追加され、保存値の作成、確認、編集ができます。さらに複数のショートカットで共有されるグローバル値も作れます。API Key のような共通設定を保存するのに向いています。(07:08)

Storage を操作するアクションは 3 つあります。

  • Get Value: 保存値を読み取る
  • Set Value: 保存値を書き込む
  • Add to List: リストに要素を追加する

実例として、毎日レーシング技術の豆知識を通知するショートカットがあります。Use Model は決定的に動作するため、介入しないと同じ内容を繰り返し出力しがちです。Storage に「Previous Facts」リストを保存し、毎回まず履歴を読み取り、既存内容を避けるようモデルに伝え、最後に新しい結果をリストへ追加して保存し直します。(07:49)

別の例として、Soup of the Day Shortcut は数日続けて同じスープを推薦してしまうことがあります。Storage で最近の選択を記録し、それを除外条件としてモデルに渡すことで「重複しない推薦」を実現できます。(08:53)

デバイス間同期では Entity ID に厳密な要件があります。iPhone で保存した Soup Entity は、iPad で読み取ったときにも同じエンティティとして認識されなければなりません。ID が端末ローカルで生成される場合、別のデバイスでは無効になります。解決策は、バックエンドデータベースの行 ID のような安定した ID を使うことです。(10:07)

詳細

LLM 向けに App Entity を最適化する

(06:12)

SoupEntity の完全な定義です。

import AppIntents

struct SoupEntity: AppEntity, Identifiable {
    static var typeDisplayRepresentation = TypeDisplayRepresentation(
        name: "スープ",
        numericFormat: "\(placeholder: .int) 個のスープ"
    )
    static var defaultQuery = SoupEntityQuery()

    var id: Soup.ID

    @Property var name: String

    @Property(title: "本日提供中")
    var isAvailableToday: Bool

    @Property(title: "材料")
    var ingredients: String

    var displayRepresentation: DisplayRepresentation {
        DisplayRepresentation(title: "\(name)", subtitle: SoupStore.description(for: id))
    }
}

ポイント:

  • typeDisplayRepresentation は、ショートカットと Siri における Entity の表示名と複数形の形式を定義する
  • defaultQuery は Query 型を関連付け、Find Soups アクションがこの Entity を検索できるようにする
  • id はデバイスをまたいで安定した識別子でなければならない。この例ではバックエンドデータベースの Soup.ID を使っている
  • @Property(title: "材料")title は Transcript に表示され、LLM がフィールドの意味を理解する助けになる
  • ingredients は「材料名 + 1 人前あたりの量」の文字列を保存し、LLM が成分から辛さを推測できるようにする
  • displayRepresentation は UI 上の Entity 表示を制御し、タイトルとサブタイトルを含む

Use Model の Transcript をデバッグする

(05:11)

ショートカットエディタでの手順です。

  1. Use Model アクションを追加し、Prompt と入力データを設定する
  2. その後ろに Show Content アクションを追加する
  3. Show Content の入力を Use Model 出力の Transcript プロパティに設定する
  4. ショートカットを実行し、Transcript 内の各 Entity の構造化表現を確認する

Transcript では、各 Soup Entity がシリアライズされた完全なプロパティ一覧を確認できます。重要なプロパティが欠けていたり値が間違っていたりすれば、問題箇所を特定できます。たとえば初回実行時の Transcript には ingredients フィールドがなく、モデルは名前だけで判断するしかなかったため、辛くないスープを選びました。

Storage の利用パターン

(08:11)

記憶を持つ Soup of the Day Shortcut のデータフローです。

Get Value("以前のスープ")          // 履歴の選択を読み取る
  -> Use Model(prompt: "以下のスープから辛いものを1つ選んでください。
                       これらの履歴の選択は避けてください: \(previousSoups)",
               context: availableSoups)
  -> Add to List(newSoup, previousSoups)  // 新しい選択をリストに追加する
  -> Set Value("以前のスープ", updatedList)  // Storage に書き戻す
  -> Order Soup(newSoup)               // 注文を実行する

ポイント:

  • 初回実行時にキーが存在しない場合、Get Value は空の値を返すため、ショートカット側で処理が必要
  • Add to List は新しい要素を含む新しいリストを出力する。元のリストは変更されない
  • Set Value は保存値を上書きし、状態更新を完了する
  • 保存値は iCloud 経由で同期され、同じ Apple ID でサインインしたすべてのデバイスで共有される
  • Entity を保存するときは ID と公開プロパティだけが保存される。読み取るときは App Intent が ID から再解決する

核心アイデア

1. AI アシスタントに「味の記憶」を持たせる

何を作るか: ユーザーの毎回のフィードバック、たとえば「辛すぎる」「薄すぎる」を記録し、Storage に好みのプロファイルとして保存するショートカットを作ります。次回の推薦では Use Model が履歴を参照します。

なぜ価値があるか: 多くの推薦システムにはユーザーフィードバックの閉じたループがありません。Storage を使うと、ショートカットで低コストにパーソナライズを実現できます。

どう始めるか: App Entity に @Property var userRating: Int を追加し、推薦後にユーザーへ評価してもらい、Set Value で Storage に保存します。

2. 通知駆動のスマートホーム連携

何を作るか: フィットネス App がトレーニング終了時に「今日のトレーニング完了、300 kcal 消費」と通知します。ユーザーは通知オートメーションを設定し、ショートカットでリビングの照明を暗くしてリラックス音楽を再生します。

なぜ価値があるか: 通知オートメーションは App を「情報の送信者」から「場面のトリガー」へ変え、システム統合の深さを広げます。

どう始めるか: 通知文に「completed」「300 calories」のような明確な動詞と数値を含め、ユーザーがキーワードで絞り込めるようにします。

3. デバイスをまたいだ読書進捗同期

何を作るか: 読書 App が現在の読書位置を App Entity として保存します。ユーザーは iPhone で「あとで続きから読む」とマークするショートカットを実行し、iPad では別のショートカットでその位置へ直接ジャンプします。

なぜ価値があるか: Storage のデバイス間同期により、独自バックエンドなしでショートカットを軽量な状態同期チャネルとして使えます。

どう始めるか: Entity ID には書籍 ISBN + 章番号を使い、各デバイスで一貫させます。Get Value で保存された Entity ID を読み取り、App Intent で該当ページを開きます。

4. AI 生成のパーソナライズ日報

何を作るか: ユーザーが注目する株式リスト、天気の都市、カレンダーのキーワードを Storage に保存します。毎朝ショートカットを 1 回実行し、Use Model がそれらのデータから自然言語の朝の概要を生成します。

なぜ価値があるか: 複数のデータソースを集約し、LLM で一貫した文章にできます。Storage は「データソース設定」の永続化を解決します。

どう始めるか: グローバル Storage に設定データを保存し、Get Value で読み取って Use Model に渡し、Prompt で出力形式を指定します。

5. LLM の重複を防ぐ創作アシスタント

何を作るか: 執筆 App が、テーマに基づいて Use Model でアイデアを生成するショートカットを提供します。Storage は生成済みアイデアを記録し、重複を避けます。

なぜ価値があるか: 決定的に動く LLM は、同じ Prompt に対して似た内容を出しがちです。Storage は簡単な「重複排除メモリ」を実現します。

どう始めるか: Storage にアイデアタイトルのリストを保存し、生成前に除外条件としてモデルへ渡し、生成後に新しいアイデアを追加して保存します。

関連 Session

コメント

GitHub Issues · utterances