View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

WWDC25に戻る

  • 概要
  • Summary
  • トランスクリプト
  • コード
  • 空間ビジネスアプリの機能強化の詳細

    visionOS 26の最新の機能強化とAPIが、昨年発表されたアクセス機能とエンタープライズ機能をどのように拡張するかを紹介します。これらのまったく新しい機能により、モデルトレーニングワークフローの構築やビデオフィードの強化を簡単に行うことができます。また、ローカルネットワーク上で座標系を同期して、社内アプリでコラボレーション体験を実現できます。このセッションでその方法を学びましょう。

    関連する章

    • 0:04 - イントロダクション
    • 1:37 - 開発の効率化
    • 4:54 - ユーザー体験の向上
    • 13:37 - 環境の視覚化
    • 24:01 - 次のステップ

    リソース

    • Building spatial experiences for business apps with enterprise APIs for visionOS
    • Implementing object tracking in your visionOS app
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC25

    • 近くにいるユーザーとvisionOSの体験を共有

    WWDC24

    • ARKitを活用したより高度な空間コンピューティング体験の創出
    • visionOSにおけるオブジェクトトラッキングの詳細
    • visionOS向けエンタープライズAPIのご紹介
  • このビデオを検索

    こんにちは Alex Powersです visionOS Enterpriseチームのエンジニアです 今年もWWDCにようこそ

    昨年 visionOS向けエンタープライズAPIの 最初のセットを導入しました それ以来 私たちは エンタープライズ機能の 拡充に取り組んできました

    新機能について説明する前に エンタープライズAPIの 基本的な要件を確認しましょう

    これらのAPIは幅広いユーティリティと 高度なデバイスアクセスを提供するため アクセスするには 管理対象エンタイトルメントと デベロッパアカウントに関連付けられた ライセンスファイルが必要です これらのAPIは 企業が自社の従業員用に 開発する社内アプリ または 他社での内部利用を目的として 開発するカスタムアプリ向けに 設計されています

    これらの考慮事項を念頭に置き 今回取り上げるのは 新しいエンタープライズAPIと 既存のAPIに対する 主な改善点についてです

    エンタープライズ機能への アクセスを容易にし 開発を合理化する 変更点から見ていきます 次に ウインドウを操作し 近くにいる人とコンテンツを共有して 機密情報を保護するための 新しい方法を提供することで ユーザー体験を 向上させる方法を紹介します 最後に 環境を視覚化するための 新しい機能について説明します

    エンタープライズ機能への アクセスを容易にし 開発を合理化するための方法を 最初に紹介します

    まずはAPIアクセスの拡大です 昨年導入したAPIへの アクセスを拡大するために 今年はいくつかの変更を加えました

    Appleは既に Vision Pro Developer Strapを介して USBビデオクラス(UVC)デバイスから 外部ビデオへのアクセスを可能にする 機能を導入しています このAPIを使用すると アプリで UVC対応Webカメラを活用して ビデオ会議を強化したり 特殊な画像処理デバイスを活用して リモート診断を行ったり 産業用検査カメラを 品質管理に導入したりできます

    高度なオンデバイスの 機械学習を実現するために Neural Engineへの アクセスも提供しました いいお知らせとして 最新のvisionOSでは すべてのデベロッパがこれらのAPIを 利用できるようになりました エンタープライズライセンスや エンタイトルメントなしで UVCビデオとNeural Engineに アクセスできます

    昨年 visionOSに オブジェクトトラッキングを導入し 現実世界の特定のオブジェクトを アプリで認識して追跡できる パワフルな体験を実現しました 今年はコマンドラインから直接 トレーニングする機能が追加されます

    つまりモデルの トレーニングプロセスを自動化し 既存のパイプラインに統合して オブジェクトトラッキングアセットを 効率的に管理できます いずれも オブジェクトごとに CreateMLアプリを 手動で使う必要がありません このツールではCreateMLアプリと 同じコントロールがすべて提供されます 期待としては 新しいワークフローが実現し オブジェクトトラッキング機能の反復処理が 高速でスケーラブルになります

    また エンタープライズライセンス管理も よりシンプルになります

    Apple Developerアカウントから直接 ライセンスファイルに アクセスできるようになりました 更新は自動的にワイヤレスで アプリにプッシュされます そして Vision Entitlement Services フレームワークを作成しました このフレームワークにより アプリが特定の機能について 適切にライセンスされ 承認されているか簡単に確認できます Vision Entitlement Servicesにより 特定のエンタープライズAPIに アプリがアクセスできるか判断できます メインカメラへのアクセスなどです ライセンスのステータスと 有効期限を確認し Increased Performance Headroom エンタイトルメントを使うアプリでは 負荷の高いタスクの前に この操作を検証して 最高のパフォーマンスを確保できます

    例として メインカメラにアクセスできるよう アプリが適切に設定されているか 確認する方法を ご紹介します

    まずフレームワークをインポートします 次にEnterpriseLicenseDetailsという 共有のシングルトンを使用して まずライセンスが有効であることを確認し 次にmainCameraAccessに対して ライセンスが承認されているのを確認します

    このように最新のvisionOSは APIアクセスを拡大し エンタープライズアプリの管理と モデルの開発を容易にします

    では より直感的で共同作業向けの 安全な空間アプリを構築して ユーザー体験を向上させる 新しい方法をご紹介します まず空間環境での ウインドウインタラクションを より自然にする方法を導入します Vision Proを装着して 移動するときに特に効果的です

    これはWindow Followモードといいます

    有効にすると コンテンツがアクセス可能な状態になり ユーザーの位置に基づいて表示されます この動作を使用するのに必要となるのが window-body-followエンタイトルメントです このエンタイトルメントはライセンスされた エンタイトルメントとして要求し管理します エンタイトルメントが付与され アプリに組み込まれると この動作はデバイス上の すべてのウインドウで有効になります

    visionOSの標準ウインドウは 配置した空間に固定されたままです しかし 移動を伴うタスクを 実行していて ダッシュボード、一連の手順、 参考資料などを頻繁に確認する 必要があるとしたらどうでしょうか

    Window Followモードでは ユーザーがウインドウを選択して ユーザーの移動に合わせて ウインドウを移動させることができます

    Window Followモードの 動作を見てみましょう

    ここでは作業台での プロジェクトに集中しているとします 同時にマニピュレータアームで タスクを実行しています マニピュレータの状態を監視したいのですが メインの作業を いちいち中断したくはありません 状態ウインドウで Window Followモードを有効にするには ウインドウを閉じるコントロールを長押し を選択します

    すると こうなります 状態ウインドウは 私が作業場に戻るとついてきます

    これがWindow Followモードです ユーザー体験を向上させる 優れた方法の1つです ただし 空間コンピューティングが 真価を発揮するのは 共有の共同作業体験を実現するときです そしてまさに 共有座標空間を可能にするものです この機能により 物理的に同じ場所にいるユーザーが 空間体験を共有できるようになります

    アプリのコンテンツが 物理的に存在しているかのように 誰もが自然に操作し 話し合うことができます SharePlayを使用して 共有座標空間の 検出、接続、セッション管理を 自動的に処理する 高レベルAPIを提供します

    これについて詳しくは 「Share visionOS experiences with nearby people」をご覧ください

    SharePlayは細かい設定が不要な 素晴らしい使いやすさを提供しますが 一部のシナリオでは より高度な制御が必要になるでしょう 例えば カスタムネットワークインフラとの 統合が必要になるかもしれません また 企業の要件によっては デバイス通信を直接処理する必要が生じます

    こうしたユースケースのために 企業のお客様向けに 共有座標空間を確立するための 新しいARKit APIを導入します それが SharedCoordinateSpaceProviderです このAPIにより 複数の参加者が 座標系を合わせることができます これはARKitが生成した特定のデータを 選択したローカルネットワーク伝送路経由で 交換することで実現されます 各参加者はこのデータを 他の参加者と継続的に共有します この継続的な共有により 共通の座標系が構築され 共有ワールドアンカーが全員に 一貫して提供されるようになります

    では このAPIを使って カスタム共有体験を構築する方法を 説明しましょう

    SharedCoordinateSpaceProviderは ARKitデータプロバイダの 使用経験があれば簡単に使えます

    ワールドトラッキング またはハンドトラッキングと同様に インスタンス化して アクティブなARKitSessionで実行します 実行すると SharedCoordinateSpaceProviderは CoordinateSpaceDataオブジェクトに カプセル化された 必要な配置情報を生成します このデータを取得するために使うのが プルベースAPIの プロバイダの nextCoordinateSpaceData()関数です このアプリはCoordinateSpaceDataを 他の参加者に送信して 共有座標空間を確立する役割を担います これで完全に制御できます 任意のネットワークレイヤを使用できます

    逆に このアプリが ネットワーク経由で他の参加者から CoordinateSpaceDataを受信した場合は ローカルの SharedCoordinateSpaceProviderに push()メソッドを介して渡します 各受信データには送信者の 一意のparticipantIDがタグ付けされます 最後に プロバイダはセッション ライフサイクルの管理を支援します 参加者が共有スペースを退出した時など 重要な変更について通知する eventUpdates非同期シーケンスを 提供します

    これがコードでどう機能するか 例を使って説明します

    SharedCoordinateSpaceProviderを まず作成して ARKitSessionで実行します ネットワーク上の別の参加者から データが到着したら データをプッシュして ローカルプロバイダの認識を更新します デバイスで共有する必要がある データを取得するには nextCoordinateSpaceData()関数を 呼び出します これにより ローカル状態を表す CoordinateSpaceDataオブジェクトを得て ネットワーク経由で ブロードキャストできます

    最後に このロジックは カスタム共有スペース管理の中核を成し ネットワークレイヤと ARKitの座標配置を橋渡しします

    これがARKitの企業デベロッパ向け Shared Coordinate APIで 社内アプリにコラボレーションを 追加するのに最適な方法です 最後のユーザー体験の強化はデータの プライバシーとセキュリティに関してです 多くの企業アプリでは 機密情報、財務データ、患者記録、 独自の設計、機密通信などを扱います SharePlay、画面キャプチャと録画 画面ミラーリングなどの機能は 非常に便利ですが こうした機密データを 意図せず公開してしまう可能性があります そこで今日は キャプチャして他のユーザーと共有できる 情報を制御する 新しいAPIをご紹介します

    contentCaptureProtectedという SwiftUIの新しいビューモディファイアです protected-contentエンタイトルメントを 持つアプリでサポートされます これを任意のユーザーインターフェイス要素 またはRealityKitシーン全体に 追加するだけです コンテンツが保護対象の場合 システムは自動的にそのコンテンツを スクリーンキャプチャ、 録画、ミラーリング、共有ビューで隠します ただしデバイスを装着しているユーザーには コンテンツは完全に見えます 一般的な企業ユースケースの 例をご紹介します

    社内文書の中央リポジトリとして 機能するアプリがあり すべての従業員がアクセスできるとします ただし システム内の特定の文書には 機密情報が含まれており 広く共有されるべきではありません 私はこれらの文書を 別のオフィスのチームと共有しています チームは会議の議事録や 来年の計画を見ることができます これらの文書は私も参照することができ チームとも共有されます ただし ご覧のように四半期報告書には 鍵アイコンが付いています

    この報告書は共有すべきではないため チームはリモートディスプレイで これを見ることができません

    保護されたコンテンツの動作を確認したので 次は実装方法を見てみましょう この例では ドキュメントビューがあり その子ビューとして SensitiveDataViewがあります Vision Proでのみ表示する必要がある 情報が含まれています これを保護するには ビューモディファイア contentCaptureProtectedを追加します このコンテンツを共有しようとすると システムによって フィードが非表示になります このコンテンツ保護は Optic IDや企業のシングルサインオンなど 認証フローと統合することもできます

    以上がアプリの2Dコンテンツや 3Dコンテンツを保護する方法です 同じ単純なモディファイアで保護できます

    これらの機能は デジタル空間での体験を向上させます では 環境を視覚化し 現実世界とデジタル世界をつなぐために 設計された機能を見ていきましょう

    まずVision Proカメラへの アクセスを拡大します

    Vision Proでは 洗練されたカメラシステムを使用して 前方のカメラで 装着者の環境を捉えて パススルー体験を提供します

    昨年 デバイスの左メインカメラの ビデオフィードにアクセスする APIをリリースしました 今年はAPIを拡張して 左右の各カメラに直接アクセスできるように また ステレオ処理や分析のために 両方のカメラに アクセスできるようにしました 詳しい方のために言うと ARKitの CameraFrameProvider APIです

    さらにカメラフィードのサポートが イマーシブ空間と共有スペースの 両環境で利用可能になり アプリが他のアプリやウインドウと 連携できるようになりました

    以上が最新のvisionOSで より柔軟にカメラにアクセスできる方法です

    次に 周囲の詳細を視覚化する 新しい方法を紹介します

    多くの作業現場では 特定の情報を監視する必要があります 例えば 技術者は複雑な機械の 小さなゲージを読み取る必要があり 検査官は照明が不十分な場所で 部品を調べる必要があるかもしれません

    これに対処するために 強力な新機能を導入します Vision Proを装着したユーザーは 現実世界のビューで特定の領域を選択し その領域専用のビデオフィードを 個別のウインドウに表示できます

    このフィードは拡大や強調が可能で 重要な詳細を明確にできます

    VisionKitにCameraRegionViewという 新しいSwiftUIビューがあります 視覚的に強調したい領域の上に このウインドウを配置するだけです その後 CameraRegionViewは 独自の位置を使用して 仮想カメラの適切な領域と空間を提供します

    よりきめ細かな制御が必要な場合は CameraRegionProviderという ARKitの新しいAPIを使用できます

    これは直接アクセスを可能にするもので ARKitを既に使用している場合や アンカーに慣れている場合 具体的なUIニーズがある場合に便利です

    私が作成した状態アプリの例を使って どう機能するか実際に見てみましょう

    ご覧のように 先ほどのプロジェクトに戻ってきました 今度は作業中に システムの圧力を監視したいと思います

    状態アプリの ウインドウを開き ゲージの前に配置します

    ご覧のように ゲージのビデオフィードが 状態アプリに表示されます これで 自分の作業をしながら 圧力を見張ることができます

    では SwiftUIとVisionKit APIを使い 数行のコードで アプリにカメラ領域を追加する 方法をご紹介します

    まずVisionKitをインポートします

    標準のSwiftUIビューを定義します InspectorViewという名前にします これにカメラ領域が含まれます このビューのコアがCameraRegionViewです これを isContrastAndVibrancyEnhancementEnabled パラメータで初期化し trueを渡して手ぶれ補正を有効にし コントラストとバイブランスを高めます 先ほどの通り このビューは 個別のウインドウに存在する必要があります ウインドウの位置を使用して パススルーのどの部分を 処理するかを決定するからです では App構造体を見てみましょう

    こちらがApp構造体です 主なアプリコンテンツ用の メインWindowGroupがあります InspectorView用に 2つ目のWindowGroupを作成します

    アプリにカメラ領域を追加するには これで十分です ただし より複雑なアプリの場合 CameraRegionViewでクロージャを使えます そこで このクロージャを使って カメラ画像を 分析するようにコードを変更します さらに後で 画像をファイルに保存する機能も 追加するつもりです

    クロージャを受け入れるように CameraRegionViewを変更し カメラフレームが到着するたびに それを処理できるようにします

    まずカメラフレームをキャプチャするための cameraFeedDeliveryクラスを追加し アプリの残りの部分にフィードを提供します

    クロージャではCameraRegionViewの pixelBufferを使用します ここでエラーをチェックし pixelBufferを cameraFeedDeliveryクラスに渡します このクロージャはnilを返しますが これはpixelBufferを 変更していないことを示します このクロージャは カスタム処理にも使用できます pixelBufferを変更して返すと CameraRegionViewは 調整されたカメラ画像をレンダリングします

    わずか数行のコードで カメラ領域をアプリに追加できました この例では コントラストと バイブランスの向上を有効にしました ただし Camera Region APIには 組み込み処理機能が2つあります 1つ目は手ぶれ補正です これにより 自然に頭が動いているときも コンテンツが固定され 安定した状態が保たれます 2つ目はコントラストと バイブランスの向上で 手ぶれ補正に加えて 明るさと色表現が 最適化されます

    次に ARKitの カメラ領域用APIを見てみましょう 多くのアプリでは 特定の3Dオブジェクトにカメラ領域を 関連付けたいでしょう 環境内の特定のオブジェクトを認識した後 カメラ領域を配置したい場合もあるでしょう アンカーと3Dオブジェクトをこのように きめ細かく制御する必要がある場合 このAPIでは 低レベルのプリミティブを使えます アンカーを定義する必要もあります

    ARKitでは アンカーによって 現実世界への仮想ウインドウを 定義するため その変換とメートル単位での 物理サイズを指定します このウインドウが定義する領域には パススルーカメラフィードの 安定したビューが直接表示されます

    これは物理的な空間に 仮想カメラを置くようなものと 考えることができます この仮想カメラはvisionOSウインドウに 接続する必要はありません Vision Proのカメラの視野内なら どの場所でもフィードを生成できます

    では このAPIを詳しく見てみましょう

    ARKitにCameraRegionProviderという 新しい種類のデータプロバイダがあります カメラ領域の統合は ARKitでおなじみのパターンに従います まず 他のARKit機能の場合と同じように ARKitSessionで データプロバイダを実行します プロバイダが稼働したら 次のステップとして カメラ領域の範囲を正確に指定します それには CameraRegionAnchorを作成し プロバイダに追加します これらのアンカーの役割は 仮想カメラを配置したい 現実世界の正確な領域を指定することです ARKitが実行されると プロバイダはアンカーに更新を送信します 各更新には 新しいpixelBufferが付随します このバッファには その特定の空間領域の 安定したビューが含まれています

    では アンカーを作成する方法を 詳しく見ていきましょう

    CameraRegionAnchorの作成は簡単です 標準的な6自由度変換を使用して ワールド内でのアンカーの 位置と向きを定義します 次に その物理サイズ、幅、高さを メートル単位で指定します これらのパラメータを組み合わせて カメラ領域の現実世界の ウインドウを定義します ウインドウのコントラストを向上させるか 単に安定化させるかも ARKitに指示する必要があります 次に これを CameraRegionProviderに追加します アンカーを追加した後 anchorUpdates(forID:)を呼び出し newAnchorのアンカーIDを渡します これで アンカーで指定した位置に 正確にカメラフィードが表示され コードで更新ごとに提供される pixelBufferを処理できます

    以上がARKitのカメラ領域です 環境内の特定の領域を追跡するのに 非常に便利なツールです ただ この話を終える前に 付け加えておきたい点がいくつかあります CameraRegionViewの パススルーコンテンツは 他のSwiftUIビューと同様に 標準的な手法でズームまたはパンできます これらの変換を実装する場合は 保存またはリモートで送信する カメラフレームにも 適用されるようにしてください 重要な点として 強調アルゴリズムでは 最適な画質を実現するために フレームレートを動的に調整します コントラスト強調ではなく 手ぶれ補正を選択すると 必要な処理能力が少なくなるため フレームレートが高くなります ARKitのカメラ領域は強力で どんなサイズの領域でも使えますが リソース消費量に注意することが重要です カメラ領域が大きいほど必然的に メモリと処理への影響も大きくなります

    最後に 体験を設計する際は 全体的なリソース消費量を評価することを 強くお勧めします 強調を使う大きな領域ではなおさらです 目安として CameraRegionAnchorで パススルーコンテンツを表示する場合は 表示領域全体の 約6分の1以下になるようにしてください

    これらは物理世界とデジタル世界を 橋渡しすることを目的とするトピックで 今年追加された 数多くの企業向け拡張機能の 最後にあたります UVCアクセスや オブジェクトトラッキングといった コア機能の柔軟性向上 さらにはWindow Followモード アプリで保護されたコンテンツ カメラ領域の導入などです これらの新しい機能を アプリに活用する方法は 無数にあると確信しています

    では 簡単なアドバイスで 締めくくりたいと思います

    まず 環境の安全性に配慮してください Vision Proを装着したユーザーが 安全に作業できる 適切な場所にいることを確認してください 現実世界の機器を操作する際は 特に重要です カメラやセンサーなどへの アクセスの強化に伴い 責任も重くなることを忘れないでください アクセスされるデータとその理由について 透明性を確保してください 目的とするタスクに必要な情報のみを 収集するようにアプリを設計し 職場でのユーザーの プライバシーを尊重してください お使いのアプリとユースケースが資格要件を 満たしていることを確認してください 対象となるのは自社の従業員向けに 開発された独自の社内アプリ または他社向けに開発され 非公開で配布されるカスタムB2Bアプリです そして これらの項目を確認した上で 要件を満たしている場合は アプリの特定の機能に必要な エンタープライズエンタイトルメントのみを リクエストしてください

    最後に フィードバックとして ご意見をお聞かせください 私たちにとっては これらの特定のAPIについてだけでなく visionOSで優れた企業アプリを 開発するために必要な将来の機能についても 皆さんのご意見が重要となります

    ご視聴ありがとうございました WWDCをお楽しみください

    • 3:00 - createml on the Mac command line

      xcrun createml objecttracker -s my.usdz -o my.referenceobject
    • 4:28 - VisionEntitlementServices

      import VisionEntitlementServices
      
      func checkLicenseStatus() {
          // Get the shared license details instance
          let license = EnterpriseLicenseDetails.shared
      
          // First, you might check the overall license status
          guard license.licenseStatus == .valid else {
              print("Enterprise license is not valid: \(license.licenseStatus)")
              // Optionally disable enterprise features or alert the user
              return
          }
      
          // Then, check for a specific entitlement before using the feature
          if license.isApproved(for: .mainCameraAccess) {
              // Safe to proceed with using the main camera API
              print("Main Camera Access approved. Enabling feature...")
              // ... enable camera functionality ...
          } else {
              // Feature not approved for this license
              print("Main Camera Access not approved.")
              // ... keep feature disabled, potentially inform user ...
          }
      }
    • 10:04 - SharedCoordinateSpaceModel

      //
      //  SharedCoordinateSpaceModel.swift
      //
      
      import ARKit
      
      class SharedCoordinateSpaceModel {
          let arkitSession = ARKitSession()
          let sharedCoordinateSpace = SharedCoordinateSpaceProvider()
          let worldTracking = WorldTrackingProvider()
      
          func runARKitSession() async {
              do {
                  try await arkitSession.run([sharedCoordinateSpace, worldTracking])
              } catch {
                  reportError("Error: running session: \(error)")
              }
          }
      
          // Push data received from other participants
          func pushCoordinateSpaceData(_ data: Data) {
              if let coordinateSpaceData = SharedCoordinateSpaceProvider.CoordinateSpaceData(data: data) {
                  sharedCoordinateSpace.push(data: coordinateSpaceData)
              }
          }
      
          // Poll data to be sent to other participants
          func pollCoordinateSpaceData() async {
              if let coordinateSpaceData = sharedCoordinateSpace.nextCoordinateSpaceData {
                  // Send my coordinate space data
              }
          }
      
          // Be notified when participants connect or disconnect from the shared coordinate space
          func processEventUpdates() async {
              let participants = [UUID]()
              for await event in sharedCoordinateSpace.eventUpdates {
                  switch event {
                      // Participants changed
                  case .connectedParticipantIdentifiers(participants: participants):
                      // handle change
                      print("Handle change in participants")
                  case .sharingEnabled:
                      print("sharing enabled")
                  case .sharingDisabled:
                      print("sharing disabled")
                  @unknown default:
                      print("handle future events")
                  }
              }
          }
      
          // Be notified when able to add shared world anchors
          func processSharingAvailabilityUpdates() async {
              for await sharingAvailability in worldTracking.worldAnchorSharingAvailability
                  where sharingAvailability == .available {
                  // Able to add anchor
              }
          }
          // Add shared world anchor
          func addWorldAnchor(at transform: simd_float4x4) async throws {
              let anchor = WorldAnchor(originFromAnchorTransform: transform, sharedWithNearbyParticipants: true)
              try await worldTracking.addAnchor(anchor)
          }
      
          // Process shared anchor updates from local session and from other participants
          func processWorldTrackingUpdates() async {
              for await update in worldTracking.anchorUpdates {
                  switch update.event {
                  case .added, .updated, .removed:
                      // Handle anchor updates
                      print("Handle updates to shared world anchors")
                  }
              }
          }
      }
    • 12:50 - contentCaptureProtected

      // Example implementing contentCaptureProtected
      
      struct SecretDocumentView: View {
          var body: some View {
              VStack {
                  Text("Secrets")
                      .font(.largeTitle)
                      .padding()
      
                  SensitiveDataView()
                      .contentCaptureProtected()
              }
              .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
          }
      }
    • 16:48 - CameraRegionView

      //
      //  InspectorView.swift
      //
      
      import SwiftUI
      import VisionKit
      
      struct InspectorView: View {
          @Environment(CameraFeedDelivery.self) private var cameraFeedDelivery: CameraFeedDelivery
      
          var body: some View {
              CameraRegionView(isContrastAndVibrancyEnhancementEnabled: true) { result in
                  var pixelBuffer: CVReadOnlyPixelBuffer?
                  switch result {
                  case .success(let value):
                      pixelBuffer = value.pixelBuffer
                  case .failure(let error):
                      reportError("Failure: \(error.localizedDescription)")
                      cameraFeedDelivery.stopFeed()
                      return nil
                  }
      
                  cameraFeedDelivery.frameUpdate(pixelBuffer: pixelBuffer!)
                  return nil
              }
          }
      }
      
      @main
      struct EnterpriseAssistApp: App {
          var body: some Scene {
              WindowGroup {
                  ContentView()
              }
      
              WindowGroup(id: "InspectorView") {
                  InspectorView()
              }
              .windowResizability(.contentSize)
          }
      }
    • 21:15 - CameraRegionAnchor

      class CameraRegionHandler {
          let arkitSession = ARKitSession()
          var cameraRegionProvider: CameraRegionProvider?
          var cameraRegionAnchor: CameraRegionAnchor?
      
          func setUpNewAnchor(anchor: simd_float4x4, width: Float, height: Float) async {
              let anchor = CameraRegionAnchor(originFromAnchorTransform: anchor,
                                              width: width,
                                              height: height,
                                              cameraEnhancement: .stabilization)
      
              guard let cameraRegionProvider = self.cameraRegionProvider else {
                  reportError("Missing CameraRegionProvider")
                  return
              }
      
              do {
                  try await cameraRegionProvider.addAnchor(anchor)
              } catch {
                  reportError("Error adding anchor: \(error)")
              }
              cameraRegionAnchor = anchor
      
              Task {
                  let updates = cameraRegionProvider.anchorUpdates(forID: anchor.id)
                  for await update in updates {
                      let pixelBuffer = update.anchor.pixelBuffer
                      // handle pixelBuffer
                  }
              }
          }
      
          func removeAnchor() async {
              guard let cameraRegionProvider = self.cameraRegionProvider else {
                  reportError("Missing CameraRegionProvider")
                  return
              }
      
              if let cameraRegionAnchor = self.cameraRegionAnchor {
                  do {
                      try await cameraRegionProvider.removeAnchor(cameraRegionAnchor)
                  } catch {
                      reportError("Error removing anchor: \(error.localizedDescription)")
                      return
                  }
                  self.cameraRegionAnchor = nil
              }
          }
      }
    • 0:04 - イントロダクション
    • Last year, Apple introduced the Enterprise APIs, and this year, there are a host of new features and improvements. These APIs, designed for proprietary in-house apps, require managed entitlements and license files. The updates focus on streamlining development, enhancing user experience, and enabling new environment visualization capabilities.

    • 1:37 - 開発の効率化
    • The latest visionOS enhances developer capabilities by expanding API access. Key improvements include wider API availability, object-tracking enhancements, and simplified enterprise license management. Several APIs introduced last year, such as those for UVC-compatible webcam access and Neural Engine, are now open to all developers without enterprise licenses. You can now train object-tracking models directly from the command line, automating the process and integrating it into existing pipelines. License files are now accessible within the Apple Developer account, renewals are automatic, and a new framework enables developers to easily check license status and app approvals for specific features.

    • 4:54 - ユーザー体験の向上
    • Several new features in visionOS 26 enhance user experiences in spatial applications. One such feature is Window Follow Mode, which allows users to enable a window to move with them as they navigate through a spatial environment. This is particularly useful for tasks that require frequent reference to information while moving. To enable this mode, you need to request and manage a specific licensed entitlement. Spatial computing is also enhanced for collaboration. Shared coordinate spaces enable people who are physically together to share their spatial experiences. Everyone can interact with and discuss the app's content as if it were physically present. You can utilize SharePlay for easy setup, or for more control, a new ARKit API called 'SharedCoordinateSpaceProvider' is available specifically for enterprise customers. This API allows multiple participants to align their coordinate systems and share data over a chosen local network transport, creating a common coordinate system for shared world anchors. Data privacy and security are also of the utmost importance, especially in enterprise applications that handle sensitive information. A new API called 'contentCaptureProtected' allows you to mark specific user interface elements or entire scenes as protected. The system then automatically obscures this protected content in any screen captures, recordings, mirrored views, or shared sessions, ensuring that sensitive data remains visible only to the user wearing the device.

    • 13:37 - 環境の視覚化
    • The latest visionOS enhances Apple Vision Pro's capabilities to bridge the physical and digital worlds. The camera system is expanded, providing you with greater access to the device's cameras through the ARKit 'CameraFrameProvider' API. This capability allows apps to utilize camera feeds in both immersive and shared space environments. A new feature enables people to magnify and enhance specific areas of their real-world view. Using VisionKit's 'CameraRegionView', developers can create windows that display dedicated video feeds of selected regions, making critical details clearer. This feature is particularly useful for professionals, such as technicians and inspectors, who need to monitor small gauges or components in poorly lit areas. You can implement this feature with just a few lines of SwiftUI code, utilizing the 'CameraRegionView' and 'CameraRegionProvider' APIs. These APIs offer built-in processing options like contrast and vibrancy enhancement, and allow for custom image analysis and modification, providing flexibility for various applications. ARKit's Camera Regions feature enhances the pass-through camera feed in Apple Vision Pro, which can be applied to specific areas defined by virtual windows called 'CameraRegionAnchors'. You can create these anchors by specifying their position, orientation, and size in the real world. ARKit then provides stabilized and enhanced pixel buffers for these regions. The feature allows for zooming and panning, and dynamically adjusts frame rate based on the chosen enhancement algorithm. Be sure to consider resource usage, with larger camera regions impacting memory and processing.

    • 24:01 - 次のステップ
    • For best results in Apple Vision Pro enterprise apps, prioritize safety, respect privacy by only collecting necessary data, ensure apps meet eligibility requirements (in-house or custom B2B), and request only the entitlements needed for specific functionality.

Developer Footer

  • ビデオ
  • WWDC25
  • 空間ビジネスアプリの機能強化の詳細
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習とAI
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン