WWDC25:What’s new in visionOS 26

visionOS のアップデート。SwiftUI と RealityKit との親和性が高まったことが嬉しい。ハンドトラッキングの即応性が高まったのも嬉しい。あとは、AI、Speech-to-Text、ビデオ周り、エンタープライズ向けのアップデート。

触れる機会はなさそうだが、Enterprise API でウィンドウがユーザー追従してくれそうなのが気になる。


0:00 – Introduction

  • visionOS 26のリリースにより、アプリを次のレベルに引き上げる多くの新機能が追加
  • 本セッションでは、ボリュメトリック機能、システム機能、ゲーム・アクセサリ、共有体験、没入型メディア、空間Web、エンタープライズAPIなど、幅広い新機能を紹介

1:34 – Volumetric features

  • SwiftUIに3Dレイアウトを強化する新機能が多数追加 (Spatiall layout)
    • depthAlignment でZ軸方向の整列が簡単に
    • rotation3DLayout でレイアウトを意識した回転が可能に
    • その他多くの従来のモディファイアが3Dにも対応
  • Volume内でAlert, Sheet, Menu, PopoverなどのUIプレゼンテーションが可能に
    • Volumes, Ornaments, Attachments から表示可能
  • dynamic bounds restrictions で、アプリの境界を越えてコンテンツをレンダリングし、現実世界とシームレスに融合
    • .preferredWindowClippingMargins modifier
  • 新しいObject Manipulation API や RealityKit の ManipulationComponent で、3Dオブジェクトの直感的な操作を実現
  • SwiftUI, RealityKit, ARKit間の連携が強化され
    • 座標変換やジェスチャーハンドリングが容易に ( SwiftUI view → ARKit accessor anchor でさえも可能)
    • RealityKit の Observable entity が、SwiftUI のアップデートとも連携可能に
    • ViewAttachmentComponent: UIをRealityView のコードに対してインラインに実装可能に
    • Model3D to RealityView
      • アニメーションの再生制御が可能
      • .realityViewSizingBehavior: 3D content内に対しどうサイズ調整するか

10:28 – System features

  • Apple Intelligence 機能の利用
    • Foundation Models framework により、オンデバイスLLMへのアクセスが可能に
    • Image Playground が進化し、ChatGPT 連携や新しいスタイルを追加
  • 新しいSpeech-to-text API SpeechAnalyzer と新モデル SpeechTranscriber が登場。高速・高精度な文字起こしをオンデバイスで実現。
  • ウィンドウやシーン、Quick Look コンテンツが再起動後も同じ場所に復元されるように
    • SwiftUI の復元APIにより、どのシーンに対し復元を許容するか指定可能に
      • .defaultLaunchBehavior(.supressed)
      • .restorationBehavior(.disabled)
  • WidgetKitもvisionOSに最適化され、ガラスや紙のような質感調整や、ユーザーとの距離に応じた表示切替が可能に
    • levelOfDetail widgetTexture supportedMountingStyles

15:21 – Games and spatial accessories

  • ハンドトラッキングが最大3倍高速化(90Hz)し、ゲームの応答性が向上
  • 新しい空間アクセサリ (spatial accessories) に対応
    • Sony PlayStation VR2 Sense controller: 6DoFトラッキング可能なゲームコントローラ
    • Logitech Muse: 精密な描画や彫刻に適したクリエイティブツール
    • Shared space / Full space で有効
    • RealityKit / ARKit でトラック
  • ハイエンドiPadゲームの Vision Pro 対応
    • App Store Connect 経由で、既存のハイエンドiPadゲームをvisionOSに簡単に移植可能に
    • Progressive Immersion Styleが拡張され、既存のiOS/iPadOSゲームをvisionOSに最適化しやすく
  • Compositor Services
    • ホバーエフェクト: Metal immersive apps にも対応
    • 動的なレンダー品質 (Dynamic render quality) 調整に対応
  • macOS spatial rendering: Macのレンダリング能力を使って、高品質なイマーシブコンテンツをVision Proにストリーミング可能に
  • TabletopKit が進化し、カスタムデータやカスタムアクションを簡単に追加・同期できるようになり、共有ゲームの開発が容易に

23:00 – Shared experiences

  • SharePlayと 空間ペルソナ(Spatial Personas)により、遠く離れた人とも同じ空間でコンテンツを共有する魔法のような体験が実現
  • Nearby Window Sharing により、相手の実際の位置や動きを仮想空間上に再現し、より自然な共同作業や会話を可能にする

25:03 – Immersive media ecosystem

  • RealityKit の ImagePresentatinoComponent により、3D spatial content の生成が容易に
  • Apple Immersive Video(AIV)をサードパーティアプリに直接埋め込み可能に
  • 180度、360度、WideFov フォーマットへも対応
  • Apple Projected Media Profile(APMP)

31:04 – Spatial web

  • Spatial Browsing: Safari のナビゲーションバーからボタンを押すだけで体験可能
  • visionOSのSafariで、WebXRとmodel要素によるイマーシブなWeb体験をサポート
  • Webサイト上で3Dモデルを表示したり、VR/ARコンテンツを体験したりすることが可能に
  • Web Backdrop: 開発者用の新しいプレビューツール
    • ビジターにカスタム immersive environments を提供する際に使用
  • Look to Scroll: .scrollInputBehavior(.enabled, for: .look)

34:13 – New enterprise APIs

  • メインカメラのアクセスを shared space に活かすことができ、他の spatial app と同時にカメラ利用を伴う体験が提供可能
  • Stereoscopic Main Session: 左右のメインカメラ個別/同時にアクセス可能
  • ARKit の CameraRegionProvider : スタビライズされたビデオフィードにアクセス可能
  • 新しいAPI Protected Content: .contentCaptureProtected(bool) を指定することで、特定のビューをキャプチャーから保護することができる
  • Window Follow Mode: ユーザーの位置にウィンドウが自動的に追従する
  • Nearby Window Sharing for Enterprise
    • SharedCoordinateSpaceProvider

Foundation Models framework を触ってみたが、、

以前紹介した Foundation Models framework を触ってみたが、シミューレタ起動すると例外が発生した。

let session = LanguageModelSession()
let response = try await session.respond(to: "What's a good name for a trip to Japan? Reply only with a title")
print("response: \(response)")
Passing along InferenceError::inferenceFailed::Error Domain=com.apple.UnifiedAssetFramework Code=5000 "There are no underlying assets (neither atomic instance nor asset roots) for consistency token for asset set com.apple.modelcatalog" UserInfo={NSLocalizedFailureReason=There are no underlying assets (neither atomic instance nor asset roots) for consistency token for asset set com.apple.modelcatalog} in response to ExecuteRequest

調べてみると、

Your app runs on iOS / iPadOS / visionOS / macOS 26, with Apple Intelligence enabled.

If you use a simulator, be sure that your Mac is on macOS 26, with Apple Intelligence enabled.

Apple Intelligence is available for your system language and region. If not sure, set the system language of your device to English and the region to United States.

Always check the availability when using Apple Foundation Models, as demonstrated in the Apple sample.

https://developer.apple.com/forums/thread/787445

なるほど、macOS は Sequoia 15.5 のままだったので、M2 搭載 Mac かつ Apple Intelligence 有効でも、動作要件を満たせていないのだった。(どこかのセッションで触れてた気がする)

というわけで、iPadOS 26 にアップデートした M1 搭載 iPad でビルドしたら、無事結果を得ることができた。

response: Optional(FoundationModels.LanguageModelSession.Response<Swift.String>(userPrompt: "What\'s a good name for a trip to Japan? Reply only with a title", duration: 5.951339542, content: "\"Samurai Sojourn in the Rising Sun\"", transcriptEntries: ArraySlice([(Response) "Samurai Sojourn in the Rising Sun"])))

Foundation Models のネタとして、何ができるだろうと考えていたのだが、オセロゲームの実装を閃いた。もちろんオセロ自体、ChatGPTと対戦することもできるだろうが、構造化した結果を保証する Foundation Models の強みが活かせそうだと思ったのと、ストリーム方式の結果出力に同期して状態更新を行ってみる、良いサンプルにもなりそうだからだ。

しかしChatGPT相手のオセロってどんな感じなんだろうと、ひとつ試してみたが、出力結果がブレたり、ルールガン無視したり、打てる手を否定してきたりとなかなかカオスだった笑

https://chatgpt.com/share/68594389-f13c-8005-bb90-78b4f628e1ae

これに比べて、Foundation Models framework のモデルがどれくらい精度高い/低いのか気になる。

WWDC25:What’s new in RealityKit

RealityKit のアップデートについて(AI要約+加筆)。ManipulationComponentSceneUnderstandingFlags によって仮想物体とのインタラクションや現実世界との融合がかなりラクに実装できそう。SwiftUIとの統合が進んだ点は別のセッションで網羅されてるはずなのでそちらでキャッチアップする。


0:00 – Introduction

  • RealityKitは、3Dコンテンツをアプリに統合し、リアルなレンダリングと没入感のある体験を提供するフレームワーク
  • visionOSに加え、iOS, iPadOS, macOSでもクロスプラットフォームで利用可能
  • 今年からtvOSにも対応し、AppleTV 4Kで3D体験が可能に
  • ManipulationComponent, EnvironmentBlendingComponent, MeshInstancesComponentなど、仮想と現実を融合させる新機能が多数追加

3:19 – Anchoring updates

  • RealityKitから直接ARKitのデータにアクセスできる新しい SpatialTrackingSession APIを導入
  • AnchorStateEvents を購読することで、アンカーの状態変化
    • 固定成功 DidAnchor
    • 固定解除 WillUnanchor
    • 固定失敗 DidFailToAnchor
  • ARKitAnchorComponent を通じてARKitアンカーの生のトランスフォームや範囲を取得し、仮想コンテンツを現実世界の平面などに正確に配置
  • デモアプリでは、テーブルの表面を検出し、ARKitの生のデータ (originFromAnchorTransform anchorFromExtentTransform) にアクセス

6:52 – ManipulationComponent

  • シーン内の3Dエンティティを掴んだり回転させたりするインタラクションを簡単に追加できる新しいコンポーネント
  • configureEntityを呼ぶだけで、入力や当たり判定、ホバーエフェクトなどの設定を自動追加
  • releaseBehaviorでオブジェクトを離した際の挙動(元の位置に戻るか、その場に留まるか)を制御
  • ManipulationEventsWillBegin, WillEnd など)でインタラクションの状態を検知し、物理演算のオン/オフなどを細かく制御

10:01 – Scene understanding

  • SpatialTrackingSession を通じて、ユーザーの周囲環境のメッシュ(Scene Understanding mesh)を生成
  • SceneUnderstandingFlags (.collision/.physics)
  • 生成されたメッシュを物理シミュレーションに組み込むことで、仮想オブジェクトが現実の机や床などに衝突・落下するリアルな表現が可能に

11:18 – EnvironmentBlendingComponent

  • 仮想エンティティが、静的な現実世界の物体(壁や家具など)によって自然に隠される(オクルージョン)効果を実現する新コンポーネント
  • これにより、仮想オブジェクトが現実空間にさらに溶け込んだような表現が可能になる

12:26 – MeshInstancesComponent

  • 一つのエンティティで、同じメッシュを複数回効率的に描画(インスタンシング)できる新コンポーネント
    • 従来、同じ物体を大量に配置する場合、エンティティ (ModelComponent) を大量にコピーする必要があった
  • MeshInstancesComponent を利用することで、メッシュのコピーを大量に生成するよりも、メモリと処理負荷を大幅に削減
  • LowLevelInstanceData に各インスタンスのトランスフォーム(位置・回転・拡縮)を設定するだけで、大量のオブジェクトをシーンに配置可能
    • それぞれに CustomMaterial を設定可能

16:28 – Immersive media

  • 新しい ImagePresentationComponent で、2D画像、空間写真(Spatial Photo)、空間シーン(Spatial Scene)の3種類の画像を表示可能に
  • 空間シーン(Spatial Scene: 1枚の2D写真から深度情報を持つ3D画像を生成する新技術。頭の動きに合わせて視差が生まれ、写真が立体的に見える。
  • spatial3DImage.generate() でユーザー操作をトリガーに spatial scene への変換が可能(写真アプリ)
  • ImagePresentationComponent は非同期で初期化され、表示モード(2D/空間写真など)も指定可能
  • Spatial video playback / Apple Immersive Video format について

21:43 – Accessories and more

  • Spatial Accessories: Shared space / Full space 内で、6DoF追跡、ハプティックフィードバックのサポート
  • RealityKit への SwiftUI の統合
    • ViewAttachmentComponent: entityにSwiftUI viewを直接追加
    • PresentationComponent: entityにmodal presentation, popoverを追加
    • GestureComponent: entityにSwiftUI gestureを追加
  • Entity の新API
    • attach method:entity に別の entity をアタッチ可能に:アニメーションする骨格の関節へのメッシュ追加が容易に(手動のアライン処理や構造的な transform updates が不要)
    • Entity(from: data) :RealityKit scene や UDS をオンラインソースやストリーム経由でイニシャライズ可能に
  • AVIF テクスチャのサポート
  • Hover Effect GroupID
    • ホバーエフェクト間の関連付けが可能
    • 同一のGroupIDで、構造に関係なくホバーの切り替えが共有される
  • Post processing for RealityView

WWDC25:Explore new advances in App Intents

Get to know App Intent 」つながりで。AI要約してもらったが、要約されすぎて動画の内容が網羅されてなかったのと、そもそも App Intent 自体に全然馴染みなかったので理解追いつかず、追加で詳解してもらった(Result/Confirmation snippets の更新手順まわり)。なので正しいかわからないが個人的には腑に落ちた。


0:00 – Introduction

  • App Intentsは、アプリの機能をショートカット、Spotlight、Visual Intelligenceなどに統合するためのフレームワーク
  • 本セッションでは、インタラクティブスニペット、新しいシステム統合、ユーザー体験の改善、便利なAPIなど、App Intentsの最新の進化について解説

0:55 – Interactive snippets

  • App Intentの結果や確認画面を、インタラクティブなUI(スニペット)として表示できる新機能
    • 冒頭のスライドでは、Control Center 上のボタンからアクションし、その場で Interactive snippets を表示している
  • Snippet Intentプロトコルに準拠し、パラメータとアプリの状態に基づいてビューをレンダリング
    • スニペット内のボタンやトグルに既存のApp Intentを関連付け、ユーザー操作に応じてアプリの状態を更新し、スニペットを再描画できる
  • Result Snippet の更新手順
    • 最初の app intent が実行され、その結果として、どの情報を表示するかのテンプレート(Parameterized Result Snippet Intent)を返す
    • 次にシステムが、先ほどのテンプレートに具体的なデータ(パラメータ)を埋め込む。例えば「最も近いランドマーク」の情報を、クエリを通じて取得、設定する
    • データが設定されたインテントが perform メソッドを実行し、最終的にユーザーが見るUI(SwiftUI view)を描画する
    • 描画されたビュー内のボタンやトグルには、他の app intent が関連付けられている。ユーザーがこれらをタップすると、新しいアクションが実行され、スニペットが更新される、というサイクルが生じる
  • Confirmation Snippet の更新手順
    • Result Snippet上のボタンをユーザーがタップすると、関連付けられた intent が実行される
    • ↑の intent は、最終的なアクションをすぐに実行するのではなく、requestConfirmation を呼び出して、確認用の新しいスニペット(Parameterized Confirmation Snippet Intent)を返す
    • この Confirmation Snippet の表示以降は Result Snippet と同じ手順
    • ユーザーが最終的な確認ボタン(「検索開始」など)をタップすると、requestConfirmation が完了し、リクエスト元の inten 処理が再開される(チケット検索などの本来の処理)
  • システムは、snippet が表示されている限りアプリを終了しないため、メモリやデータベースに状態を保持しようとする必要はない

8:15 – New system integrations

  • Image Search: カメラやスクリーンショットからの画像検索結果に、アプリのコンテンツを表示可能に。IntentValueQuery に準拠し、SemanticContentDescriptor を入力としてエンティティを返すクエリを実装。
    • さらに検索結果を見たい場合にアプリに遷移する導線の実装:semanticContentSearch schema
    • @UnionValues
      • 従来、1つのクエリは1つの型のエンティティしか返せなかった
      • 「この写真に関連するランドマークと、そのランドマークが含まれるコレクションの両方を同時に表示したい」というニーズが実現できなかった
      • UnionValues により、1つのクエリで複数の型を返せる
  • Onscreen Entities: NSUserActivity を使い、画面上のコンテンツにエンティティを関連付けることで、SiriやChatGPT  (にスクリーンショットを送ることで) がそのコンテンツについて応答できるようになる。Transferable でPDFなどのデータ形式も提供可能。
  • Spotlight: MacのSpotlightから直接アクションを実行可能に。IndexedEntityPredictableIntent を活用し、検索候補の精度や関連性を向上。

15:01 – User experience refinements

  • UndoableIntent: App Intentで実行したアクションを、標準の「取り消し」ジェスチャーで元に戻せるようになるプロトコル。
  • Multiple-choice API: 複数の選択肢を提示し、ユーザーに選ばせるUIを簡単に実装可能。requestChoiceメソッドで選択肢を提示し、結果に応じて処理を分岐。
  • Supported Modes: background foreground(immediate/dynamic/deferred)などのモードをサポートし、Siriからの実行時やアプリ内での実行時で、Intentの振る舞い(UI表示の有無など)を動的に制御。

21:02 – Convenience APIs

  • View Control APIs: UIナビゲーションのロジックを Intent から分離し、SwiftUI ビュー側で onAppIntentExecution モディファイアを使ってハンドリング。コードの関心を分離し、見通しを良くする。
  • ComputedProperty: App Entity のプロパティを、値をコピーするのではなく、元のデータソースから直接算出できるマクロ。
  • DeferredProperty: App Entity のプロパティの値を、必要になるまで(例:ショートカットアプリで表示されるまで)非同期で遅延取得できるマクロ。高コストな処理を効率化。

WWDC25:Design interactive snippets

インタラクティブスニペットのデザインについて。前回「Get to know App Intents」で学んだ App Intents の活かし方のひとつとして見てみた。


0.00 – Introduction

  • Interactive snippets は、App Intents によって駆動するコンタクトなビュー
  • アップデート情報やクイックアクションを表示し、App Intents をサポートするどこでも表示可能 (Spotlight, Siri, Shortcuts app)
  • ボタンといった要素もサポートした

1.30 – Appearance

  • Larget type: スニペットの見やすさに寄与するのが文字サイズ、システムのデフォルトサイズよりも大きい
    • 大きな文字サイズが重要な情報への注意を引く
  • レイアウトが乱雑にならないよう、文字の周囲に十分な余白を確保すること
  • Consistent margins: 周囲に一定マージンを維持すること
    • スニペットがオーガナイズされ、ユーザーが何が起こっているかに集中できる
    • ContainerRelativeShapeAPI
  • Concise content: 340 points を超えるコンテントを含めないこと
    • 最も重要な情報に絞り、簡潔に示すこと
    • 詳細を知りたければ、スニペットから特定のビューにリンクすることができる
  • Clear contrast: コンテントの上に他のコンテンツを表示する際、アプリの visual identity をベースにし背景を vibrant するのが有効
    • 読みやすさを損なうことがあるので、背景とコンテンツとのコントラスト比を上げると良い

3.25 – Interaction

  • データ更新時、文字に対してスケールとブラーを伴うことで、明確なビジュアルフィードバックを与えられる
    • スニペット内で情報更新し、アクションが成功したことを示すことで、App Intent がユーザーのルーチン内に信頼を構築できる
  • ボタンを複数含められる
    • メインタスクを補う、明確で関連性のあるアクションであるべき
  • インタラクティブでなくとも、最新情報にアニメーションを伴って更新できる

4.49 – Types

  • ふたつのスニペットタイプ
    • Result (結果)
      • 確認 (confirmation) の結果、またはそれ以上のアクションを必要としない情報を表示
      • フォローアップの必要がないのでボタンラベルは “Done (完了)” とする
      • 注文状況の確認などに有効
    • Confirmation (確認)
      • 結果 (result) を表示する前にアクションを要する場合に使用
      • コーヒー注文の例: 数量変更、注文ボタンをタップするまでは注文がされない
      • ボタンラベルは明確な動詞とする (e.g. “Order (注文)”)
        • 事前定義から選ぶことが可能
      • アクション後は、結果 (result) を表示し、インテントの挙動をユーザーが理解する
  • ダイアログ
    • Siri が App Intent の代弁をするときに表示
    • AirPods 使用時など、ボイスファーストなインタラクションに必須
      • 画面を見ていないくても耳で(result / confirmation を)聞くことができる
    • ダイアログが表示されなくてもスニペットの内容を理解できるように設計するべき

WWDC25:Get to know App Intents

キーノートで、Mac の Spotlight 機能 Shortcuts “Quick keys” に興味が湧いたので見てみた。AI要約+加筆。


0:00 – Introduction

  • App Intents は、アプリの機能を Apple プラットフォーム全体に拡張し、発見性・操作性・連携性を高めるためのフレームワーク
  • アプリのアクションやエンティティをシステム全体で利用可能にし、ユーザー体験を向上

0:45 – App Intents ecosystem

  • App Intents は Spotlight、Action Button、ウィジェット、コントロールセンター、Apple Pencil Pro など多様なシステム機能と連携
  • Spotlight から直接アクションを呼び出すことも可能
  • intent にはパラメタ (input) と戻り値 (output) があり、これらは Swift型 で表現される
  • Intent(動詞)、App Enum や App Entity(名詞)を定義し、アプリの操作やデータをシステムに公開
  • App Shortcuts で主要な Intent を強調し、Spotlight や Siri、Action Button などから即座に呼び出せる

2:47 – Navigating the framework

  • App Intent の実装方法を step by step で紹介
  • Intentはタイトルと perform メソッドが必須で、パラメータや戻り値も柔軟に定義可能
    • 戻り値は IntentResult : ダイアログやSiriが発話する結果を含めることができる
  • supportModesIntentModes.forground を設定し、アクション実行時にアプリを開くことができる
  • AppEnum で定数値、AppEntity で動的なデータを表現
    • AppEnum
      • typeDisplayRepresentation: 型全体の説明
      • caseDisplayRepresentation: 各 case の説明
        • DispayRepresentation(title:image) でアイコン指定も可能
      • これらは定数である必要があり、コンパイル時に使用される
  • パラメータやアイコン、Parameter Summary、質問文などで Shortcuts アプリ上のユーザー体験をカスタマイズ
    • AppIntent 実装に @Parameter 定義
      • Shortcuts app 上でユーザーが変更可能なパラメタとして表示される
      • title に加えて、requestValueDialog によりユーザー選択時に質問文を表示できる e.g. “”Which section?
    • ParameterSummary
      • Shortcuts アプリ上で、パラメタをインラインに埋め込んだ説明文として表示される
      • 定義することで Mac の Spotlight でもアクションが利用できるようになる
  • App Shortcts
    • システム横断して App Intent を自動的に引き出す
    • Siri や Spotlight からの呼び出しを容易にする
    • AppShortcutsProvider で複数のショートカットを一括管理
      • すべてのショートカットを包含する1つの Provider を定義するべき
      • AppShortcut(intent:phrases:shortTitle:systemImageName:)
        • phrases : Siriに呼びかけてショートカットを起動するフレーズ
        • .applicationName を含めなければならない、ひとつまでパラメタを含められる
  • 固定値の AppEnum に対して、AppEntity はIDやプロパティ、クエリ(検索・解決方法)を持ち、動的なデータ連携が可能
    • @Property を持てる(従来)
    • @ComputedProperty が追加された
      • 値の参照を持てるため、コピーする必要がない
    • TypeDisplayRepresentation(name:) DisplayRepresentation(title:) が必要
    • Entity Query が必要
    • EntityQuery:システムからの質問に対してどんなエンティティがあるかを答える
      • EntityStringQuery : この文字列にマッチするエンティティはあるか?
      • EntityPropertyQuery : e.g. この州に存在するすべてのラドマークは?
      • すべてのクエリは “ID” に対するエンティティを特定できなければならない
  • TransferableIndexedEntity プロトコルで画像や Spotlight 連携も実現
  • OpenIntentTargetContentProvidingIntent で Spotlight から直接詳細画面への遷移も可能
  • クエリの suggestedEntitiesEntityString/PropertyQuery などで、柔軟な検索・提案体験を提供
  • すべてがオンメモリなエンティティであれば EnumerableEntityQuery で、すべてを返すことができる

21:15 – How it works

  • App Intents は Swift コードが唯一の情報源 (certain values must be constant) で、ランタイムでなくビルド時に Intent の情報が抽出・格納される
  • 設定ファイル不要で、アプリやフレームワークにIntent情報が自動的に組み込まれる
  • Intentのタイトルやパラメータは定数値である必要があり、ビルド時に検証される
  • 複数ターゲットや Swift Package、静的ライブラリ間で Intent 型を共有できるようになった
    • 型の共有をするには App Intents Package への登録が必要
  • 小さな Intent から始めて、徐々に機能拡張や他のシステム連携を検討するのがおすすめ

WWDC25:Explore prompt design & safety for on-device foundation models

Foundation Models frameworkを活用するにあたっての、プロンプトの設計方法に関するメモ。AI要約+筆者による加筆。いわゆるプロンプトエンジニアリング的なtipsに加えて、安全性構築のための prompt / instruction の使い分けについて。

Human Interface Guidelines にも、Generative AI のページが用意されたので、合わせて読む。

Generative AI | Apple Developer Documentation


0:00 – Introduction

  • Foundation Models frameworkを使ったアプリで、さまざまな現実世界の状況に対応できる堅牢な生成AI体験を設計するためのガイダンスを紹介
  • プロンプトは自然言語でLLMに指示を与えるもので、Apple Intelligenceでも同じ仕組みが使われている
  • 本セッションでは、オンデバイスLLM向けの設計戦略、プロンプトのベストプラクティス、AIセーフティ、評価・テスト方法を解説

2:30 – Design for on-device LLM

  • オンデバイスLLMは約30億パラメータで、サーバー型LLM(数百億〜数千億)より小型
  • 複雑な推論や最新の世界知識には限界があるため、タスクはシンプルなステップに分解するのが有効
  • 数学計算やコード生成には不向き
  • world knowledge が限られている(直近の知識を網羅できていないなど)ため、事実情報も要検証
    • 逆にゲーム内のやりとりには向いている
  • ハルシネーション(事実でない出力)に注意し、重要な情報はプロンプトに明示的に含める
  • Guided generation(型や制約を指定した出力)が信頼性向上に有効

6:14 – Prompting best practices

  • 出力量は「3文で」「詳細に」など期待する出力の長さをプロンプトで明示的に指示
  • スタイルや役割もプロンプトで指定可能(例:シェイクスピア風のキツネ)
  • 明確なコマンド形式で、1つの具体的なタスクを与えると精度が向上
  • 望ましい出力例を3〜5個プロンプトに含めると効果的
  • “MUST” “DO NOT” など強い否定も、望まない出力を防ぐのに有効
  • XcodeのPlayground機能でプロンプトの試行錯誤が容易
  • instructions(指示文)はセッション全体の振る舞いを制御し、プロンプトと組み合わせてインタラクティブな体験を設計できる

11:03 – AI safety

  • Foundation Models frameworkにはApple独自のガードレール(安全対策)が組み込まれており、入力・出力の両方で有害な内容をブロック(エラーが投げられる)
    • LanguageModelSession.GenerationError.guardrailViolation
  • エラー発生時はUIで適切にフィードバックし(逆にしないことも)、ユーザー主導の機能では代替案や説明を提供
  • 信頼性を高めるため、アプリ側でもプロンプトや指示文の設計に注意し、ユーザー入力の扱いに配慮
  • promptよりもinstructionに従うよう設計されているため、安全な出力のためにinstructionsは必ず開発者が用意し、ユーザー入力はpromptとして分離
  • 柔軟性と安全性のバランスを考え、
    • ユーザーインプットをプロンプトに組み込んだり(補助線的に)
    • プロンプトの選択肢を用意するのも有効
  • アレルギーや不適切な内容など、ユースケースごとに追加の安全対策や警告を設ける
  • 安全対策は多層防御(スイスチーズモデル)で設計

18:37 – Evaluate and test

  • 品質・安全性評価のため、主要ユースケースやリスクのあるプロンプトを集めてデータセット化
  • 自動化テストやUIテスター、手動検証、他のLLMによる自動評価などを活用
  • エラー時の挙動(アンハッピーパス)も必ずテスト
  • 継続的な評価・テストで品質と安全性を担保し、モデルやプロンプトの更新にも追従
  • ユーザーからのフィードバック収集やプライバシー配慮も重要
  • Appleの責任あるAI設計ガイドラインやHuman Interface Guidelinesも参照推奨
  • Safety checklist
    • ガードレール違反エラーを適切に処理する
    • 安全に関する指示を追加する
    • プロンプト内のユーザー入力を制御する
    • ユースケース固有の対策を適用する
    • 評価とテストを行う
    • 問題を報告する

WWDC25:Build a SwiftUI app with the new design

Liquid Glass に関するセッション。概要とベストプラクティスを具体的なAPIをもとに紹介。


0:00 – Introduction

  • iOS 26とmacOS Tahoeで導入された新しいデザイン「Liquid Glass」を中心に、アプリの見た目や操作感が大きく刷新
  • Liquid Glassはガラスの光学特性と液体の流動性から着想を得た新しいマテリアルで、コントロールやナビゲーション要素に適用
  • すべてのAppleプラットフォームで一貫した新しい体験を提供

3:07 – App structure

  • NavigationSplitView TabView NavigationStackSheet などの構造的なAPIが新デザインに最適化
  • NavigationSplitView
    • Liquid Glassサイドバーや背景拡張効果(backgroundExtensionEffect)で、コンテンツの美しさと可視性を両立
  • TabView
    • タブバーはフローティング化し、スクロールで最小化可能
    • tabBarMinimizeBehavior .onScrollDown 
    • @Environment(\.tabViewBottomAccessoryPlacement var placementをもとにアクセサリの表示位置を条件分岐でカスタマイズ
  • SheetはデフォルトでLiquid Glass背景となり、ユーザー操作による展開高さに応じてエッジや透明度が変化
  • プレゼンテーション(シート、メニュー、アラート、ポップオーバー)はトリガーになったボタンからスムーズに展開

7:49 – Toolbars

  • ツールバーはLiquid Glass上に配置され、下のコンテンツに応じて自動適応
  • ToolbarSpacer でグループ分けやスペース調整が容易
  • badge 修飾子で通知バッジを簡単に追加可能
  • アイコンはモノクロレンダリングが基本となり、必要に応じて.tint()で強調
    • モノクロにより視覚的ノイズが減り、コンテンツを強調できる
  • スクロールエッジ効果(scrollEdgeEffectStyle)でコントロールの可読性を維持
    • 不動要素が多く高密度 e.g. カレンダー:.hard

11:10 – Search

  • 検索フィールドはツールバー下部やタブ専用ページなど、柔軟な配置が可能
  • searchable修飾子やsearchToolbarBehaviorで検索体験をカスタマイズ
  • Liquid Glass上に検索フィールドが表示され、デバイスやツールバー嬢のボタン数などの状況に応じて自動的に最適化

14:03 – Controls

  • ボタンやスライダー、メニューなど標準コントロールが新デザインに対応
  • ボタンはカプセル型がデフォルト、ガラススタイルも選択可能
  • 特に注意を引くアクションのために extra large サイズをサポート
  • .buttonStyle(.glass) .buttonStyle(.glassProminent)
  • スライダーは目盛りの表示や中立値(neutralValue)に対応
  • コントロールの高さや角の一貫性(コーナーコンセントリシティ)も強化
  • concentric rectangle shapeや controlSize 修飾子で柔軟に調整可能

17:57 – Liquid Glass effects

  • .glassEffect 修飾子でカスタムビューにもLiquid Glassを適用可能
    • .glassEffect(in: .rect(cornerRadius: 16))
  • tintinteractive修飾子で意味やインタラクションに応じた表現が可能
    • .glassEffect(.regluar.tint(.green))
    • インタラクティブ要素を持つコンテナに対して:.glassEffect(.regluar.interactive())
      • ユーザー操作に追従し拡縮、バウンド、光る
  • GlassEffectContainerで複数のガラス要素を一体的に管理し、自然な反射・屈折・モーフィングを実現
    • glassEffectIDnamespace でアニメーションや遷移も滑らかに制御

21:31 – Next steps

  • Xcode 26で新デザインを導入し、標準コントロールの自動適用を活用
  • アプリ全体のフローや背景色を見直し、不要な装飾を削除
  • Liquid Glassを活かした独自コンポーネントでアプリの個性を表現

WWDC25:Code-along: Bring on-device AI to your app using the Foundation Models framework

前回の「Deep dive into the Foundation Models framework」に引き続き、Foundation Models framework のセッションメモ(今回もAI要約+筆者加筆修正)。前半はだいたい前出の内容と被っていた。UIに組み込む際の体験向上、パフォーマンスの検証や改善のtipsについて。

Foundation Models のデモアプリが結果を逐次表示する際、やたらぬるぬると表示更新される様子が気になっていて、実装難易度高そうだと思っていたが、ストリームで吐き出されるデータ表現が自動的に identifiable であるため、実装者はただアニメーションを指定すれば良いという、にわかに信じがたい魔法のような話だった。


Introduction

  • Foundation Models frameworkを使い、SwiftUIアプリにオンデバイスAI機能を追加する方法を実演
  • 旅行プラン作成アプリを例に、ランドマーク選択→旅程自動生成→外部情報取得→ストリーミング表示→パフォーマンス最適化までを一通り解説

Prompt engineering

  • XcodeのPlayground機能を活用し、プロンプトの試行錯誤を効率化
  • @Generable annotation, @Guide macro
  • Instructions (プロンプトの上位形式 – the higher level form of prompting) により、モデルの役割や期待する出力例を明示し、精度を高める
  • 生成結果は Observable オブジェクトとしてUIにバインドし、リアルタイムに反映
    • 初期化タイミングによっては、不要なタ再生成が行われパフォーマンスに影響するため、Task modfier 内で初期化し、表示時1度だけの生成を保証するべき

Tool calling

  • Tool プロトコルを実装することで、モデルがアプリ内の任意の関数やAPI(例:MapKit)を呼び出せる
  • ツールには名前・説明・call メソッド(引数はGenerable 型)を定義
  • モデルは必要に応じてツールを自律的に呼び出し、外部データ(例:ランドマーク周辺の観光地情報)を取得
    • ツールの有無、ある目的に対して使って欲しい tool の明示、呼び出し頻度はプロンプトや instruction で調整可能
  • Apple Intelligenceの利用可否 = Foundation models の利用可否や、モデルの準備状況も考慮し、UIで適切に案内・制御
    • SystemLanguageModelmodel.availability で判別
    • Xcode の build scheme から、モデルの無効化が可能 (Simulated Foundation Models Availability)

Streaming output

  • 旅程生成の出力をストリーミングで受け取り、部分的にUIへ即時反映
    • session.streamResponse(...) API
    • PartiallyGenerated 型(全プロパティが optional な構造体)を活用し、生成途中のデータも段階的に表示
  • SwiftUIのForEachやアニメーション、トランジションを組み合わせて、スムーズな体験を実現
    • PartiallyGeneratable 構造体は自動的に identifiable、IDの自前管理は不要
  • ストリーミングにより、ユーザーは生成完了を待たずに内容を確認できる

Profiling

  • Foundation Models Instrument を使い、アプリのパフォーマンスを可視化・最適化
  • モデルのロードや推論、ツール呼び出しの各工程の所要時間を計測
  • 初回リクエスト時の遅延対策として「プリウォーム(session.prewarm())」を推奨
    • モデルがリクエストをもらう前に、モデルをロードしておく
    • 例: ユーザーがプロンプトのタイピング開始時
    • 今回はランドマークタップ時(Generate ボタンタップ前)
  • 生成スキーマをプロンプトに含めるかどうかを状況に応じて最適化し、トークン数やレイテンシを削減
    • モデルがリクエスト生成前にレスポンスフォーマットを完全に理解していればincludeSchemaInPromptfalse に指定する
      • 有効ないくつかのケースを紹介
  • 実機での計測を推奨し、シミュレータとの違いに注意
    • Simulator on M4 Mac > iPhone の場合あり

WWDC25:Deep dive into the Foundation Models framework

前回の「Meet the Foundation Models framework」に続いて、Foundation Models framework を深ぼるセッションビデオのメモ。今回もAIに要約してもらったものをベースに理解したことを書き足していった。

Tool は Inputに対してOutput が一定決まっている(連絡先やカレンダー)ユースケースに対応しており、一方でたとえばカスタムデータからインサイトを得るような、ファインチューニング的な方法は現時点での Foundation Models framework ではまだ実現できなさそうだった。あくまで、オンデバイスLLMに外部リソースへの一問一答的な参照手段を与えるという理解。desciriptionを記述することでモデルが勝手に選択して使うという意味では、MCPに近いかも?将来的に、自身が保有するデータをこのツール定義としてアプリ外に公開し、アプリ間でAI同士やりとりできるようになると面白いかも、と妄想が広がった。


Sessions (Prompting / Transcript / Sampling)

  • session.respond(to: userInput)
    • instruction promptをトークン (small substrings) に分解
    • LLMがトークンシーケンスを受け取り、response を生成
    • Foundation Models framework が一連の処理を担うので使い手は気にしなくて良いが、トークンは free ではない:計算コストとレイテンシが生じる
  • ステートフルなセッションとその状態管理
    • セッション(LanguageModelSession)は状態を持ち (statefull)、やりとりの履歴(transcript)を保持する
    • session.transcript: デバッグやUIへの表示に有用
    • ただし、context limit あり:入力・出力のトークン数が多いと遅延やエラー(.exceededContextWindowSize)が発生する
      • 履歴のない新しいセッションを開始
      • 既存のセッションから transcript を要約し引き継げる
        • 例1. 最初(instruction)と最後のやりとりのみ引き継ぐ
        • 例2. transcipt 全体を要約して引き継ぐ (外部ライブラリ or Foundation Models 自体を用いて)
  • サンプリングと出力の多様性
    • 同じプロンプトに対して異なるアウトプットが生じる
    • モデルの出力 = トークンは、確からしさの分布に基づき確率的に選択される(sampling)
      • デフォルトは randam sampling
      • ゲームなどの用途に対して、再現性を求めたい場合:GenerationOptions でサンプリング方法や多様性 temperatureを調整可能 (数値大きい方がアウトプットが多様)
      • 決定論的な出力(.greedy)も選択できるが、モデルのバージョンによって結果が変わる場合がある
  • 言語サポート
    • 入力言語が未対応の場合は .unsupportedLanguageOrLocale エラーが発生
    • モデルが対応している言語かどうかを事前にAPIで確認可能

Generable

  • @Generable マクロを使うことで、Swiftの型に沿った構造化データを安全に生成できる
    • constrained decoding により、特定のスキーマに沿った正しい出力のみが生成される
      • ハルシネーションが発生しても、最終的にスキーマ定義されたトークンのみを採用することで誤りを防ぐ
    • enumやassociated value、配列、数値型など多様な型に対応
    • @Guide マクロでプロパティごとに値の範囲や説明を指定可能
      • @Guide(.range(1...10)) for Int
      • @Guide(.count(3)) for Array
      • @Guide(desciption: "A full name")
    • プロパティの生成順序はソースコードの宣言順に従うため、依存関係やUI表示順に注意
    • 文字列に@Guide(.pattern(...))を指定して 、正規表現(regex)による文字列制約も可能
      • Regex builder syntax

Dynamic Schemas

  • 実行時に構造が決まるデータにも対応可能(DynamicGenerationSchema
    • Dynamic schemas はPropertyのリストを持ち、Propertyごとがnameとpropertyの型を定義するschemaを持つ
    • Dynamic schemas は配列を持つことが可能
    • 他の dynamic schemas をスキーマ名を通じて参照することが可能
  • ユーザー入力などで動的にスキーマを構築し、モデルに渡すことができる
  • 検証済みスキーマに変換してから推論を行うため、動的でありながら同時に型安全性が保たれる

Tool Calling

  • Tool プロトコルを実装することで、モデルがアプリ内の任意の関数やAPIを呼び出せる
    • Tool.name は短く、しかし省略は用いず英語としてreadableで分かりやすくするのが推奨。動詞を使うべき e.g. "findContact"
    • Tool.description も同様に長すぎず (1文推奨)、実装の説明を含めるべきでない
      • この文字列がそのままプロンプトに用いられるため、トークンが長くなりレイテンシが増大する
  • インプットArgument を定義
    • モデルがツールを呼び出す際にArgumentを生成する
    • 入力引数もGenerable で型安全に生成されるため、想定外の値が渡される心配がない
  • ツールはインスタンスで、そのライフサイクルをコントロール可能
    • セッションの初期化時に渡し、セッション中は同じインスタンスが使われる
    •  ツールは状態を持つこともでき、複数回・並列で呼び出される場合もある
  • 例:連絡先やカレンダーの情報を使って、よりパーソナルな体験を実現

まとめ

  • Foundation Models frameworkは、オンデバイスで安全かつ柔軟にLLMを活用できる強力なツール
  • セッション管理、構造化出力、動的スキーマ、ツール呼び出しなど、実践的な機能が豊富
  • プライバシーを守りつつ、アプリに高度なAI体験を組み込むことが可能