WWDC25:Explore spatial accessory input on visionOS

visionOS 26 におけるスタイラスやゲームコントローラへの対応について。コントローラには興味なかったが、近い将来 Apple Pencil が 6DoF 対応し、Vision Pro でも利用可能になる伏線と見てチェックした。

実は、XRコンテンツにおけるコントローラ/ハンドトラッキングの是非については過去にも(当時)Oculus Quest での体験をもとに考察したことがあった。

Oculus: ハンドトラッキングに感じる課題

パススルーしない没入型VRコンテンツ内において、コンテンツへ対しての触覚やグリップ感を違和感なく表現するにはコントローラが優位だと考えた。ハンドジェスチャーにはその正確さや、触覚を伴う繊細なフィードバックに限界があるので(コントローラ一辺倒な体験設計は好ましくないだろうが)空間アクセサリを伴うユースケースの充実に期待したい。


0:00 – スタート

  • visionOSでは「目と手」による入力が基本だが、より細かい制御、ボタン入力、触覚フィードバックを可能にする空間アクセサリのサポートを追加。
  • サポートされるアクセサリ:
    • PlayStation VR2 Sense controller: ゲームに適したボタン、ジョイスティック、トリガーを搭載。標準ジェスチャー(タップなど)でシステムナビゲーションも可能
    • Logitech Muse: 先端とサイドボタンで可変入力が可能なフォースセンサーと強力な触覚フィードバックを搭載。生産性・クリエイティブアプリに適した精度
  • アクセサリは full space アプリ、shared space アプリの両方で使用可能。
  • Apple Vision Proのカメラとアクセサリのセンサーを組み合わせて位置と回転をトラッキング

2:41 – 彫刻アプリの構築

  • セットアップ:
    • Xcodeの機能エディタで「Spatial Gamepad」にチェックを入れて空間ゲームコントローラーサポートを追加
    • アプリのplistで「Accessory Tracking Usage」の説明を記述(例:「Tracking accessory movements to carve into virtual clay」)
  • アクセサリの接続:
    • GameController フレームワークを使用して空間アクセサリとの接続を検出
    • GCController(ゲームコントローラー)と GCStylus(スタイラス)の両方がGCDevice プロトコルに準拠。
    • 接続・切断イベントをリッスンし、productCategory が「Spatial Stylus」または「Spatial Controller」かどうかを確認
  • 仮想コンテンツの表示:
    • full space / shared space 両方で使え、プライバシー保護のため認証されたアプリのみ動き追跡可
    • AccessoryAnchoringSource を作成し、アクセサリの「aim」位置にターゲット
    • AnchorEntity を作成し、accessory ターゲット、aim 位置、トラッキングモードを指定
    • トラッキングモード:
      • predicted: 低遅延だが急激な動きでオーバーシュートする可能性。
      • continuous: 高精度だが高遅延
  • インタラクションの実装:
    • SpatialTrackingSession.accessory を追加してアクセサリの AnchorEntity のトランスフォームを取得。
    • 実装例
      • アクセサリが粘土に入った時に素材を削除し、触覚フィードバックを発生

13:37 – ARKitによるアクセサリのトラッキング

  • ARKit AccessoryAnchorの4つのプロパティ:
    • handedness: アクセサリを握っている手(左/右)
    • relativeMotion: 空間内での相対的な動き。
    • relativeRotationalMovement: 空間内での相対的な回転運動。
    • trackingState: トラッキング品質(センサーやカメラのカバレッジが低下すると品質も低下)
  • RealityKitとARKitの連携:
    • SpatialTrackingSession が実行中で設定されている場合、RealityKit AnchorEntity から ARKit AccessoryAnchor を取得可能
    • AnchorEntityARKitAnchorComponent にアクセスし、ARKitAnchorを取得して AccessoryAnchor にキャスト
  • リアクティブツールバーの表示:
    • アクセサリアンカーからheld chirality(利き手)を取得。
    • 左利きの場合は正のX方向、右利きの場合は負のX方向にツールバーを表示

14:45 – デザインに関する考慮事項

  • UIとの相互作用:
    • ビューにゲームコントローラー入力(ボタンやトリガー)をジェスチャーの代わりに受信するよう指示可能
    • 標準の手ジェスチャーとゲームコントローラーの両方を入力として処理可能
    • SwiftUIビューで .receivesEventsInView 修飾子を設定してジェスチャーイベントも受信
  • 没入感の向上:
    • 完全空間アプリでは .persistentSystemOverlays APIでホームインジケーターを非表示
    • .upperLimbVisibility APIで上肢とアクセサリを非表示
  • 適応的サポート:
    • 空間アクセサリと手の両方に対応することで、より多くのユーザーをサポート
    • ARKit は今年さらに高速で手をネイティブトラッキング
  • App Store バッジ:
    • 「Spatial game controller support」: 空間アクセサリトラッキング付きゲームコントローラーをサポート
    • 「Spatial game controller required」: 空間アクセサリトラッキング付きゲームコントローラーが必須

WWDC25:Design widgets for visionOS

visionOS 26 のアップデートのうち、まず試したのがウィジェットだった。紙やガラスといった素材感や光沢感をデジタルに落とし込むことで、実空間に存在する家具と共存するように設計されている。一貫して仮想コンテンツと一線を画するコンセプトだったのが印象的だった。近接認識なる機能によって、ユーザーとの距離に応じたコンテンツのだし分けができるとは知らなかった。


0:00 – イントロダクション

  • visionOSにおけるウィジェットは、ユーザーの現実空間に設置できる3Dオブジェクト
  • 既存のiPadアプリのウィジェットは、互換モードを有効にするだけでvisionOSに持ち込むことができ、自動的に空間的な見た目に変換される
  • ネイティブで構築することで、visionOS専用のサイズや、より空間に統合された見た目を実現できる
  • デザインの核となる4つの原則は「永続性」「固定サイズ」「カスタマイズ性」「近接認識」

3:36 – 表示の永続化

  • 一度空間に配置されたウィジェットは、セッションをまたいでも、部屋を移動しても、デバイスを再起動してもその場に固定され続ける
  • ウィジェットはホームグリッドの「ウィジェット」アプリから探し、空間に追加する
  • 机のような水平面、または壁のような垂直面に配置することで、その場に固定される
    • 水平面上に配置した時は、わずかにユーザー側に傾き、平面に影を落とす
  • ウィジェットは常にフレーム(枠)内に表示される:デジタルコンテンツと周囲環境とを繋ぐ役割
    • 新しいウィジェットを考える際は、それが部屋の一部であること(コンテクスト:キッチン、リビング、オフィス、、)を意識する
      • 例: 天気ウィジェット:実際の窓のような錯覚を生み出す
  • 同じウィジェットの複数のインスタンスを一つの空間に配置することも可能
  • ウィジェットは現実世界に存在するように振る舞う
    • 常に仮想コンテンツの背後にレンダリングされる
    • 常に物理環境の平面にスナップされる

6:39 – 固定サイズ

  • ウィジェットは現実世界の寸法に対応した、一貫性のあるサイズを持つ
  • テンプレートサイズ(小、中、大、特大)は物理的な大きさにマッピングされるため、設置される文脈(机の上、壁など)を考慮して選択することが重要
    • 生産性向上ツールでデスクの上に置くなら、小さなテンプレサイズ
    • 壁掛けのアートワークなら特大のテンプレサイズ
  • 現実のオブジェクトと空間を共有するため、印刷物や案内表示の原則を意識したデザインが必要
    • 明確な階層構造、明瞭なタイポグラフィ、慎重なスケール調整
  • ユーザーはウィジェットのサイズを75%から125%の範囲で調整できる
    • 加えて間近で見ることもできるため高解像度のアセットを使用することが推奨

8:57 – カスタマイズ性

  • スタイル:
    • Paper: 周囲の光に反応し、印刷物のように空間に溶け込むスタイル
      • Coating layer
      • Content layer: 空間に溶け込ませるための反射コーティング
    • Glass: 前景と背景に視覚的な分離を生み出し、前景の情報を常に鮮明に保つ軽量なスタイル、情報量の多いウィジェットに適している
      • Background
      • Duplicate UI layer: UIを暗めにした影により微妙な奥行きを加える
      • UI layer
      • Coating layer: 柔らかい反射仕上げ、部屋の照明に適応
  • :
    • システムが提供する豊富なカラーパレット(ライト7種、ダーク7種)をユーザーが選択し、ウィジェットを着色できる
  • マウンティングスタイル:
    • Elevated: 壁掛けの額縁のように表面に配置される
      • 水平・垂直両面に対応し、デフォルト設定
    • Recessed: 壁に埋め込まれたような見た目で、窓のような奥行き感を出す
      • 垂直面でのみ利用可能
      • 無効化が可能
  • フレーム幅:
    • 細いものから太いものまで5段階の幅をユーザーが選択できる(Recessed スタイルでは不可)
  • カスタム設定:
    • 標準のカスタマイズUIに加え、アプリ固有の設定(e.g. Musicのアルバムアートに合わせたテーマ or 時刻による自動調整)を追加できる

17:14 – 近接認識

  • ユーザーとの距離に応じて、ウィジェットが表示する情報を動的に調整する。
  • 2つの状態:
    • Default(近距離): 詳細な情報を表示 90m まで
    • Simplified(遠距離): 一目でわかるよう、必要不可欠な情報のみを表示
  • 距離に応じてボタンを追加するなど、距離に応じたインタラクション領域の変更が可能
    • インタラクションが含まれていなければ、ウィジェットタップでアプリ起動

WWDC25:Share visionOS experiences with nearby people

visionOS 関連のアップデート。visionOS 26 にアップデートしてから、ウィンドウにボタンが増えたので何かと思ったらこれのことか。今のところ身近に共有できる相手(Vision Pro ホルダー)がいないし、共有したいコンテンツも思いつかないのだが、、コンテンツのシェアリングは今のスマホやノートだと、物理的に身を寄せ合う必要があって限界があるため、今後グラス型のようにカジュアルユースなデバイスが登場するとしたら、体験共有のシームレスさが大きな売りのひとつになるかもしれない。


0:56 – 近くの人との体験共有の詳細

  • 各ウインドウのバーに新設された「共有」ボタンから、近くの人を選んで簡単に共有開始。
    • 共有されたウインドウは、全員の空間で同じ位置・サイズで表示され、ウインドウバーが緑色に変化。
    • まるで部屋にあるかのように指し示したりインタラクトすることが可能
    • 誰でもウインドウの移動・リサイズが可能で、全員の表示が同期。
    • デジタルクラウンで再センタリングも可能。手がウインドウに重なると内容がフェードし、人物が見やすくなる。
  • FaceTime との連携で、リモート参加者も空間に「ペルソナ」として登場し、近くの人と自然に混在可能。
    • ペルソナの表示位置は、共有するウィンドウのタイプ(e.g. volumetric)による
    • iOS/macOS など他プラットフォームからの参加者は、ウインドウ横にビデオ表示。
  • デフォルトでは「閲覧のみ」共有(他の人がアプリを持っていなくてもOK)。
  • インタラクティブな体験には SharePlay を採用。
    • visionOS の既存 SharePlay アプリは追加対応不要で近くの人と共有可能。
    • SharePlay の新APIで、近くの人向け体験を強化可能。

5:35 – 共有メニューからの共有の許可

  • 新しい Share メニューで GroupActivity を公開することで、ユーザーが簡単に共有を開始可能。
  • Volumetric ウインドウでは、アクティビティを公開していれば Share メニューが使える
    • 実装例の紹介
  • ImmersiveSpace ではウインドウバーがないため、アプリ内ボタンで共有開始を促す設計が必要。
  • 共有開始時に GroupSession を取得し、SharePlay を開始。
  • supportsGroupImmersiveSpacetrue に設定し、全員の空間を同期。

9:15 – 近くにいる参加者の体験の向上

  • 新APIで「近くの参加者」と「リモート参加者」を判別可能。
    • GroupSessionParticipantStateから .isNearbyWithLocalParticipant .localParticipant で判別  
    • 物理的に近い人同士を同じチームに割り当てるなど、空間に応じた体験設計が可能。

10:37 – ユーザーの相対位置へのコンテンツの配置

  • 参加者の空間内の位置(ParticipantState.pose)を取得し、各ユーザーの近くにコンテンツを配置するよう実装可能。
  • pose はリアルタイム追跡ではなく、共有開始や再センタリング時に更新。
  • seat pose(固定座席位置)も取得可能で、空間テンプレートのカスタマイズも可能。

13:20 – 共有されたメディア再生の調整

  • visionOS 26の AVPlayer/AVPlaybackCoordinator で、近くの人同士のメディア再生を完全同期するよう設計
    • 物理的に近いと、参加者のデバイスからの音ズレが顕著なため
  • GroupSession と連携し、音声・映像の遅延やエコーを防止。

15:38 – 複数のウインドウのサポート

  • 新APIで、複数 WindowGroup のうちどれをSharePlay対象にするかを明示的に指定可能。
  • .groupActivityAssociation 修飾子で、共有対象ウインドウを切り替え可能。

16:50 – アンカーされたコンテンツの共有

  • ARKitの新APIで、物理空間に固定した WorldAnchor を近くの参加者と共有可能。
    • ImmersiveSpaceは空間全体が動くため、物理的な位置固定に必要
    • WorldTrackingProvider を使用した実装方法の紹介
  • sharedWithNearbyParticipantstrue にしてアンカーを作成し、全員のデバイスで同じIDで同期。
    • worldAnchorSharingAvailability
    • これにより、家具配置アプリやコラボ体験など、物理空間を活かした共有体験が実現。
  • SharePlay 外でも独自のネットワークレイヤでも共有可能(ビジネス用アプリ)

WWDC25:Design hover interactions for visionOS

visionOS に関連するセッションビデオから。カスタムでホバーエフェクトが実装できるようになったとは、登場当初から期待していたが、いざ対応されると驚きだった。これまでは形状しかカスタマイズできなかった。ウェブアプリと同様にホバー表現が多様化するだろう、視線操作においてどんなインタラクションが有効であるかは良い題材になりそうだ。


0:33 – 基本知識

  • 重要なコンテンツは正面に配置し、インタラクティブ要素は丸みのある形状(円、ピル、角丸長方形)を推奨
  • 正確な操作のため、各要素は最低60ポイントのスペースを確保
  • 3Dオブジェクトも同様に、60ポイントは1m先で約4.4cmに相当
  • すべてのインタラクティブ要素にハイライト効果を適用し、カスタムコンポーネントや3Dオブジェクトにも同様の効果を追加

1:57 – カスタムエフェクト

  • 標準のハイライト効果に加え、独自のアニメーション(カスタムホバーエフェクト)を作成可能
    • standard appearance
    • hovered appearance
  • カスタムエフェクトは、アクション実行には使えない
    • 例: ダウンロードボタンを見つめただけではダウンロードは実行できない
  • アニメーションは3タイプ、用途により使い分け
    • 即時 instant: 見たら即時アニメーション
      • ボタンの先にさらに選択肢があることを示すインジケータの表示
      • 動画シークバーに残り時間のtooltipを表示
    • 遅延 delayed: 遅れて表示
      • ボタン下に表示されるタイトル tooltip
      • Safari profile button
    • 段階的 ramp: インスタントx遅延の段階展開
      • Environment icons: はじめ拡大だけ→しばらく後カプセル型に展開
  • ベストプラクティス:
    • アンカー要素を組み込む: e.g. タイトル
    • テキストの位置を固定
    • 隠れた要素は可視要素から表示か、見た即時に表示
    • 効果は控えめに
    • 予期しない動きを避ける
  • 実機でのテストと細かな調整が重要

9:37 – 注視してスクロール

  • 「Look to Scroll」機能で、視線だけでスクロールが可能に
  • スクロールビューの端を見つめると自動でスクロールが始まる
  • 主にリーディングやブラウジング用途のビューで有効化を推奨
  • UIコントロールが多いリストや、パララックスなど特殊なアニメーションを伴うビューには不向き
  • スクロールビューはウィンドウ全体を使い、明確な境界を設けると自然な体験になる

12:23 – 持続的なコントロール

  • 動画プレイヤーなどの自動非表示UIは、ユーザーが注視している間は表示を持続し、視線を外すと非表示に
  • 標準では手を加えずに適用されるが、カスタムコントロールの場合は、持続表示の挙動を自分で有効化する必要がある
  • メディアコントロールやセッションコントロールなど、遅延非表示UI全般で推奨

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

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
    • ガードレール違反エラーを適切に処理する
    • 安全に関する指示を追加する
    • プロンプト内のユーザー入力を制御する
    • ユースケース固有の対策を適用する
    • 評価とテストを行う
    • 問題を報告する