View in English

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

クイックリンク

5 クイックリンク

ビデオ

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

その他のビデオ

  • 概要
  • トランスクリプト
  • コード
  • Wi-Fi Awareによるデバイスの接続性の強化

    Wi-Fi Awareを使用して、ピアツーピアネットワーク接続を構築する方法を学びます。リアルタイムでのビデオ共有、大容量ファイルの転送、帯域幅と遅延が改善されたアクセサリの制御についても説明します。さらに、DeviceDiscoveryUI、AccessorySetupKit、Networkフレームワークを使用して、アプリでWi-Fi Awareを使用する方法も紹介します。

    関連する章

    • 0:00 - イントロダクション
    • 1:01 - 概要
    • 7:46 - ペアリング
    • 15:05 - 接続
    • 19:01 - 最適化
    • 22:26 - ガイドライン

    リソース

    • Accessory Design Guidelines
    • Wi-Fi Aware
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC24

    • AccessorySetupKitについて
  • このビデオを検索

    こんにちは Swetankといいます Wi-Fiチームで エンジニアをしています 今日は Wi-Fi Awareフレームワークと これを使って アプリでデバイス間のインタラクションを 強化する方法を紹介します まず Wi-Fi Awareの簡単な概要で 基本を押さえます 次に アプリにWi-Fi Awareを統合する 方法を詳しく説明します

    それから DeviceDiscoveryUIと AccessorySetupKitフレームワークで デバイスを安全に検出して ペアリングする方法を説明します ペアリングの後 Networkフレームワークを 使用して デバイスでWi-Fi Aware接続を 設定する方法について説明します 接続したら Wi-Fi Aware接続の パフォーマンスを監視して 最適化する方法を見ていきます 最後に 大切な次のステップについて いくつか説明します では 概要から始めましょう Wi-Fi Awareを使うと デバイス間で直接通信できます ルーターや中央サーバに依存する 従来のモデルとは違って 純粋なピアツーピアです

    この接続は動的でオンデマンド型です デバイスは 実行時にお互いを見つけ 安全なリンクを作成します ファイル共有やアクセサリ設定などの ローカルでの一時的な 体験に最適です Wi-Fi Awareは 通常のWi-Fi接続と 並行して動作します つまり デバイスはインターネットと ローカルネットワークに接続しつつ Wi-Fi Awareも使用します また Wi-Fi Awareは Wi-Fi Allianceが 管理するグローバルスタンダードです クロスプラットフォームで 相互運用可能で どのデバイスメーカーでも導入可能です Wi-Fi Awareで アプリが 近くのデバイスを シームレスに検出して接続するという 新しい体験ができます 例えば メディアのストリーミング再生 高速ファイル転送 アクセサリ制御 画面共有 また必要なら これらすべてを同時に行えます

    Wi-Fi Awareという 新しい フレームワークを導入することで iPhoneとiPadでこの体験ができます Wi-Fi Awareフレームワークを使用すると アプリは他のAppleデバイスや サードパーティデバイス さらに アクセサリにも接続できます

    Wi-Fi Awareを使用すると 接続はハイレベル認証され Wi-Fiレイヤーで暗号化されます 高スループットと 低レイテンシーをサポートします 近くの他のデバイスへの接続と 共存して 同時実行できます

    Wi-Fi Awareを使用するには アプリで 2つの大まかなフローを処理するだけです 最初のフローは デバイスのペアリングです

    ペアリングは1回限りの設定プロセスで 信頼関係を確立して 安全に通信できるようにします 2番目のフローは ペアリングされた デバイスの接続です システムは自動的に 鍵交換やリンク暗号化などで デバイス間の接続を保護します セキュリティプロトコルを 管理する必要はまったくありません ペアリングが終わると アプリは デバイスが近くにあり アプリが実行されていれば いつでも安全に再接続できます デバイスにシームレス 高速 安全に再接続できます 次に Wi-Fi Awareを使用するための アプリの設定方法を見てみましょう まず Wi-Fi Awareの中心概念である サービスについて説明します サービスは デバイスの 検出と接続に使用されます サービスとは アプリが提供したり 他のデバイスから受け取ったりする 特定の機能のようなものだと 考えてください アプリでのサービスの宣言に移る前に まず サービスの主なルールを いくつか理解しておきましょう

    サービスは名前で識別されます

    サービス名は一意で 文字 数字 ダッシュのみで構成され 15文字以内である必要があります

    完全なサービス名には 2つの部分があります

    一意の名前の後に プロトコルが続きます TCPを使用するサービスの場合はtcp その他のプロトコルを使用する サービスの場合はudpです

    自分のアプリと他のアプリの サービス名が競合するのを 防ぐために IANAに サービス名を登録できます

    次に サービスロールについて説明します Wi-Fi Awareでは特定のサービスに対して 使用可能な 2つのロールがあります 1つ目はパブリッシャーです アプリは サービスをホストし 他のデバイスから 入ってくる接続をリッスンする サーバとして機能します

    2つ目はサブスクライバーです アプリは サービスを使用して 接続先となる デバイスを検索する クライアントとして機能します

    ユースケースで必要なら アプリをパブリッシャーと サブスクライバーの両方として 同時に機能させることができます

    アプリのInfo.plistは 使用するサービスを指定します これを行うには WiFiAwareServicesキーを追加します これは キーがサービス名で 対応する値がそのサービスの 構成になる辞書です この例では アプリは 2つのサービスを宣言します ファイルサービスとドローンサービスです

    各サービスに 構成プロパティの 辞書があります

    サービスを公開可能にするには 公開可能キーを含めます サブスクライブ可能にするには サブスクライブ可能キーを含めます この場合 ファイルサービスは公開可能と サブスクライブ可能の両方と宣言されます これは アプリ間ユースケースを 構築する場合によく見られます

    対照的に ドローンサービスは サブスクライブ可能のみです これはアクセサリと話すアプリを 開発するときの一般的なシナリオです アプリはInfo.plistで宣言されている サービスのみ 公開 サブスクライブできることに 注意してください 次に コードに移って Info.plistで 宣言されたデバイス機能やサービスに アクセスする方法を見てみましょう

    アプリでWi-Fi Awareを使用する前に まず デバイスでサポートされているかを 確認する必要があります そのために WACapabilitiesの supportedFeaturesプロパティを 確認します

    Info.plistで定義された 公開可能なサービスは WAPublishableService経由で 利用可能になります この例では 静的プロパティである fileServiceが 後でサービスに簡単にアクセスできるように 定義されています サブスクライブ可能なサービスには WASubscribableService経由でアクセスします 便宜上 2つの静的プロパティは fileServiceとdroneServiceを参照するように定義されています 後で使用するためです

    Wi-Fi Awareサービスをアプリに 追加する方法がわかったところで Wi-Fi Awareデバイスをペアリングする 方法について説明しましょう まず アプリユーザーには ペアリングフローがどう見えるか 説明します 先ほど述べたように アプリは 使用前に Wi-Fi Awareデバイスをペアリングします アプリは APIを呼び出して システムに ペアリング用のUIを表示させることで ペアリングフローをトリガーできます アプリのユーザーは 簡単なプロセスに従うだけで ペアリングできます

    まず アプリが指定したパラメータに 一致する 近くのデバイスのリストから デバイスを1つ選択するよう求められます

    次に もう一方の デバイスから提供された PINコードを入力して ペアリングを承認します

    最後に システムがペアリングを完了し 成功時に通知します これで アプリでデバイスを 使用できるようになります 一度利用可能になると アプリは再度ペアリングフローを 呼び出さずに オンデマンドで デバイスに接続できます

    デバイスのペアリングに使用できる システムフレームワークは2つあります DeviceDiscoveryUIと AccessorySetupKitです

    DeviceDiscoveryUIは アプリ間の接続と アプリから別の デバイスへの接続を行います Appleデバイスとサードパーティデバイス 両方とのペアリングをサポートします AccessorySetupKitで アクセサリ製造者は アクセサリをすばやくオンボードできます ハードウェアアクセサリ製造者に 推奨されるフレームワークです DeviceDiscoveryUIについて 詳しく見ていきましょう

    DeviceDiscoveryUIを 使用しているユーザーは アプリのUIにあるボタンを押して デバイスを追加または選択します パブリッシャー側では アプリはAPIを呼び出して アドバタイザーの UIを表示します 左側がその様子です もう一方のデバイスでは アプリはAPIを呼び出して デバイスピッカーUIを表示します 右側がその様子です

    ブラウザのUIは Wi-Fi Awareサービスに 一致する近くのデバイスを検索して ユーザーが選べるように提示します ペアリングされていないデバイスを ユーザーが選択した場合 システムは自動的に ペアリングフローを開始します

    ペアリングが必要な場合 受信リクエストと PINコードがパブリッシャー側に表示され サブスクライバー側で入力されます

    ユーザーがPINを確認すると システムはデバイスをペアリングします 完了すると アプリは他のデバイスに 接続できるようになります

    ここまで DeviceDiscoveryUIの フローを見てきました 少しコードを見てみましょう

    リスナー側では アプリが DevicePairingViewを作成します アドバタイズのために それをサービスに渡します

    ブラウザ側では アプリが DevicePickerビューを作成します 検出のために それを サービスに渡します 検出されたデバイスをタップすると DeviceDiscoveryUIは 接続可能なネットワークエンドポイントを アプリにレンダリングします 必要に応じて DeviceDiscoveryUIは ネットワークエンドポイントを 指定する前にペアリングを実行します

    アクセサリ製造者であれば アプリとのペアリングには AccessorySetupKitが推奨されています アクセサリがBluetoothや Wi-Fi Awareなど 複数のトランスポートを使用している場合 AccessorySetupKitは両方を 同時にペアリングして設定します AccessorySetupKitを Wi-Fi Awareと 使用する場合の ペアリングフローを見てみましょう AccessorySetupKitを 使用しているユーザーは アプリUIのボタンを押して開始し デバイスを追加 または選択します アプリは検出記述子を入力し デバイスの検出に使用する サービスとフィルタを指定します 次にAccessorySetupKit UIが 表示されます

    AccessorySetupKitは サービスと 検出フィルタに一致する 近くのデバイスを検出し UIに表示します 次に ユーザーは設定する デバイスを選択します

    設定中に ユーザーはPINを入力して Wi-Fi Awareのペアリングを確認します PINはパブリッシャーに表示され サブスクライバー側で入力されます

    その後 システムはアプリに代わって ペアリングを実行します

    ここまで AccessorySetupKitの フローを見てきました コードを見てみましょう Wi-Fi Awareデバイスを AccessorySetupKitとペアリングするには まず ASDiscoveryDescriptorを 作成してサービス名を指定し モデルやベンダーなどの デバイスプロパティでフィルタリングします 次に ASAccessorySessionを作成して showPickerを呼び出し AccessorySetupKit UIを表示します 検出とペアリングのプロセス処理は システムが行います ペアリングが完了すると 新しくペアリングされたデバイスを表す 新しいASAccessoryが返されます これには ASAccessoryWiFiAwarePairedDeviceIDが 含まれます ペアリングされたデバイスのIDです アプリはこのIDを使用して Wi-Fi Aware経由で 対応する WAPairedDeviceを検索できます このデバイスは Networkフレームワークで 接続を開始するのに使用できます

    AccessorySetupKitの詳細については WWDC24のセッション 「Meet AccessorySetupKit」をご覧ください デバイスのペアリング方法を説明しました アプリがペアデバイスのリストに アクセスする方法を見てみましょう

    Wi-Fi AwareはWAPairedDevice 構造体としてのペアデバイスを表示します デバイスの一覧は WAPairedDeviceの allDevices APIを使用して取得できます ペアリング中に学習した ベンダーやモデル名のような デバイスプロパティにアクセスできます

    APIは すべてのデバイス または指定された フィルタに一致するデバイスを取得できます

    例えば ベンダー名がExample Incに 一致する すべてのデバイスを取得するには 次のようにフィルタを作成します

    アプリのペアリング済みデバイスの リストはいつでも変更できます 例えば 設定からデバイスが 削除された場合 アプリはこれらの変更をリッスンして UIやその他の状態を 適宜更新します フレームワークはWaPairedDevice.allDevicesを 通じて 非同期シーケンスを 提供しており これを簡単に行えます

    注意点として ここで説明したAPIは アプリで利用可能なすべての ペアリング済みデバイスを提供します その時点で到達可能かどうかは 考慮していません 最初の大まかなフローである ペアリングについてお話ししました 次に 2番目のフローに注目しましょう ここで アプリはペアリング済み デバイスとの接続を確立します コードを見る前に まず Wi-Fi Aware接続を行うための 大まかなフローを理解しましょう 接続には2つのデバイスが必要です 1つのデバイスはサービスを パブリッシュして 特定のペアデバイスからの 接続をリッスンします

    もう一方のデバイスは サービスにサブスクライブして 接続先となる特定の ペアデバイスを検索します 電力節約のため リスニングと 検索は ユースケースに 必要な期間のみに制限する必要があります

    ブラウザは 指定されたサービスと デバイスの組み合わせを検出すると 接続可能なネットワークエンドポイントを アプリに提供します 次に アプリはエンドポイントを確認して そのうちの1つ以上との 接続を確立します リスナーは 接続リクエストを受信して アプリに転送し 接続を完了します この時点で データが交換可能になります

    アプリでNetworkフレームワークを 使用して Wi-Fi Aware接続を確立する 方法を見てみましょう パブリッシュまたはサブスクライブする前に アプリは対象となるペアリング済み デバイスを選択する必要があります この例では パブリッシャーは名前がMy Deviceで 始まる デバイスのフィルタを作成します

    同様に サブスクライバーフィルタは ベンダー名がExample Incで始まる デバイスを選択しています

    Networkフレームワークを使用して リスナーとサブスクライバーインスタンスを 開始するのに必要な パラメータがそろいました

    NetworkListenerを構築するには 先ほど作成したサービスオブジェクト およびデバイスフィルタを指定します

    この方法で作成されたNetworkListener は 指定されたフィルタに一致する 特定のサービスとペアデバイスの 接続のみを受け入れます

    Wi-Fi Awareパラメータに加えて アプリはネットワークパラメータを設定して 状態の更新ハンドラを設定できます

    同様に 先ほどのサービスと デバイスのフィルタを使用して NetworkBrowserが作成されます

    ブラウザは サービスをアドバタイズしていて フィルタに一致する ペアリング済みのデバイスのみを検出します

    リスナーとブラウザの作成に成功したら アプリで接続を確立できるようになります リスナーで外部からの接続の 受け入れを開始するには リスナーオブジェクトに対して 実行オペレーションを呼び出します

    リスナーを起動すると 他のデバイスが アプリを検出できるようになります

    ブラウザでサービスの サブスクリプションを開始するには ブラウザオブジェクトに対して 実行オペレーションを呼び出します

    ブラウザを起動すると サービス提供中の 近くのデバイスが検出されます ブラウザは 検出されたデバイスの一覧を ネットワークエンドポイントとして アプリに返します

    その後 アプリは検出された エンドポイントを確認して 対象となるエンドポイントが 存在するか判断します

    NetworkConnection APIを使用して 目的のエンドポイントへの 接続を開始します

    接続が設定されると リスナーは 新しい接続を処理するため コールバックを受信して アプリに提供します アプリはNetworkフレームワークAPIを 使用してデータを交換できるようになりました ワイヤレスリソースと電力を節約するために 必要な接続がすべて確立されたら リスナーとブラウザを停止します

    Wi-Fi Aware接続のために必要な すべての手順を紹介しました 次に 接続パフォーマンスを最適化して 可能な限り最適な体験を 実現する方法を見てみましょう パフォーマンス最適化には スループット 遅延時間 電力消費の バランスを取ることが必要です ほとんどの場合 システムは 妥当なデフォルトを適用します ただし 必要であれば アプリは 特定の接続パラメータを調整できます

    1つは Wi-Fi Awareパフォーマンスモードです Wi-Fi Awareのデューティ比に影響します

    2つ目はトラフィックサービスクラスです パケット送信の優先度を設定します デフォルトでは ベストエフォートですが 対話型ビデオや音声に設定して 遅延時間を短くできます

    優先度の低いデータがある場合は バックグラウンドサービスクラスを利用して 他のトラフィックとの干渉を回避します

    通常 バルクパフォーマンスモードは ベストエフォートまたはバックグラウンド サービスクラスで使用されます この組み合わせで 消費電力は 削減されますが 遅延時間は長くなります

    一方 リアルタイムは対話型音声 またはビデオサービスクラスで使用されます これにより 遅延時間は短くなりますが 消費電力は大きくなります リアルタイムモードの使用を決定する前に ユースケースに必要か慎重に検討してください バッテリー消費にマイナスの 影響が出る可能性があります Wi-Fi Awareフレームワークは 接続パフォーマンスが調整可能な設定を 提供するほか 各ネットワーク接続ごとの オンデマンドのパフォーマンスレポートも 提供します パフォーマンスレポートには 信号の強さ スループット 遅延速度に関する 指標が含まれます このフィードバックを使用して アプリのパフォーマンスを調整します Wi-Fiの接続強度や周囲の干渉 デバイス機能は 実環境で大きく異なるため アプリが 煩雑なWi-Fi環境でどう動作するか 必ずテストしてください さらに TCPなどの ネットワークプロトコルからの 接続フィードバックを アプリに反映させましょう

    いくつかのコードを掘り下げて 調整可能な パラメータの活用方法を見てみましょう 先ほども説明しましたが Wi-Fi Aware接続はデフォルト設定が バルクパフォーマンスモードであることに加え サービスクラスはベストエフォートです プロファイリングで ユースケースに さらに適した別の構成が見つかったら パブリッシャーのパラメータと サブスクライバーの 接続インスタンスを設定して パフォーマンスモード およびサービスクラスを調整します

    この例では パブリッシャーはリアルタイム パフォーマンスモードと 対話型ビデオ トラフィックサービスクラスを 使用するように設定されています

    サブスクライバー側でも アプリが作成したNetworkConnection オブジェクトに対して同じ設定が必要です

    アプリのWi-Fi Aware接続を 監視するには 現在のパスにアクセスして パフォーマンスレポートを見ます その後 アプリはこのレポートに 基づいてアクションを実行し ユーザーの全体的な体験を向上させます

    Wi-Fi Awareを使用したアプリ構築に 必要なことをすべて紹介しました みなさんの新しいアイデアを 楽しみにしています 話を終える前に 大切な次のステップについて お話ししましょう もしWi-Fi Aware対応のデバイスを 開発しているハードウェアメーカーであれば アクセサリのデザインガイドラインを 参照して Appleデバイスとの 相互運用性を確保してください ガイドラインドキュメントは Apple Developer Webサイトで入手できます ガイドに従うことで デバイスが確実に Appleデバイスを検出して ペアリングできるようになり 強固なセキュリティを維持して 接続パフォーマンスを最大化できます このガイドは 一貫性のある高品質の Wi-Fi Aware体験を構築するための 最高のリソースです

    さらに詳細な点については Wi-Fi Awareフレームワークに関する ドキュメントをぜひ確認してみてください サンプルアプリも用意されています Wi-Fi Awareを使用して アプリを構築する方法と パフォーマンス構成の違いが 動作にもたらす影響を理解できます

    最後に もしWi-Fi Awareデバイスを 構築しているなら ユーザーにとって可能な限り 最適な体験を作り出すために 相互運用性ガイドを活用できます

    ご視聴ありがとうございました

    • 6:57 - Access capabilities and services

      import WiFiAware
      
      // Check if Wi-Fi Aware is supported on your device
      guard WACapabilities.supportedFeatures.contains(.wifiAware) else { return }
      
      // Publishable service declared in Info.plist
      extension WAPublishableService {
          public static var fileService: WAPublishableService {
              allServices["_file-service._tcp"]!
          }
      }
      
      // Subscribable services declared in Info.plist
      extension WASubscribableService {
          public static var fileService: WASubscribableService {
              allServices["_file-service._tcp"]!
          }
          public static var droneService: WASubscribableService {
              allServices["_drone-service._udp"]!
          }
      }
    • 10:33 - Pair with DeviceDiscoveryUI

      import DeviceDiscoveryUI
      import WiFiAware
      import SwiftUI
      
      // Listener (Publisher) Device
      // Invoke Listener UI
      DevicePairingView(.wifiAware(.connecting(to: .fileService, from: .selected([])))) {
          // Provide a view to display to user before launching System UI
      } fallback: {
          // Provide a view in case of error
      }
      
      // Browser (Subscriber) Device
      // Invoke Browser UI
      DevicePicker(.wifiAware(.connecting(to: .selected([]), from: .fileService))) { endpoint in
          // Process the paired network endpoint
      } label: {
          // Provide a view to display to user before launching System UI
      } fallback: {
          // Provide a view in case of error
      }
    • 12:29 - Pair with AccessorySetupKit

      import AccessorySetupKit
      
      // Configure ASDiscoveryDescriptor (Subscriber)
      let descriptor = ASDiscoveryDescriptor()
      descriptor.wifiAwareServiceName = "_drone-service._udp"
      descriptor.wifiAwareModelNameMatch = .init(string: "Example Model")
      descriptor.wifiAwareVendorNameMatch = .init(string: "Example Inc", compareOptions: .literal)
      let item = ASPickerDisplayItem(name: "My Drone",
                                     productImage: UIImage(named: "DroneProductImage")!,
                                     descriptor: descriptor)
      
      // Create and activate session
      let session = ASAccessorySession()
      session.activate(on: sessionQueue) { event in
          // Closure will execute when device is added with event: .accessoryAdded
          // ASAccessoryWiFiAwarePairedDeviceID can be used to lookup a WAPairedDevice
      }
      // Present Picker UI
      session.showPicker(for: [item]) { error in
          // Handle error
      }
    • 13:51 - Access paired devices

      import Foundation
      import WiFiAware
      
      // WAPairedDevice
      var device: WAPairedDevice // Get using WAPairedDevice.allDevices
      
      // Access WAPairedDevice properties
      let pairingName = device.pairingInfo?.pairingName
      let vendorName = device.pairingInfo?.vendorName
      let modelName = device.pairingInfo?.modelName
      
      // Create a filter to select devices of interest
      let filter = #Predicate<WAPairedDevice> {
          $0.pairingInfo?.vendorName.starts(with: "Example Inc") ?? false
      }
      
      // Get all paired devices, matching the filter, at the current moment
      // A new snapshot of all paired devices each time a device is added, changed, or removed
      for try await devices in WAPairedDevice.allDevices(matching: filter) {
          // Process new snapshot of all paired devices
      }
    • 16:23 - Filter paired devices

      import Foundation
      import WiFiAware
      
      // Listener (Publisher) Device
      // Specify the paired devices of interest for the use case
      let deviceFilter = #Predicate<WAPairedDevice> {
          $0.name?.starts(with: "My Device") ?? false
      }
      
      // Browser (Subscriber) Device
      // Specify the paired devices of interest for the use case
      let deviceFilter = #Predicate<WAPairedDevice> {
          $0.pairingInfo?.vendorName.starts(with: "Example Inc") ?? false
      }
    • 16:54 - Create listener and browser

      import WiFiAware
      import Network
      
      // Listener (Publisher) Device: Construct a NetworkListener
      let listener = try NetworkListener(for:
              .wifiAware(.connecting(to: .fileService, from: .matching(deviceFilter))),
          using: .parameters {
              TLS()
          })
          .onStateUpdate { listener, state in
              // Process state update
          }
      
      // Browser (Subscriber) Device: Construct a NetworkBrowser
      let browser = NetworkBrowser(for:
              .wifiAware(.connecting(to: .matching(deviceFilter), from: .fileService))
          )
          .onStateUpdate { browser, state in
              // Process state update
          }
    • 17:44 - Establish a connection

      // Listener (Publisher) Device: Start NetworkListener
      try await listener.run { connection in  // Radio resources in use
          // Closure executes for each incoming connection
          connection.onStateUpdate { connection, state in
              // Process state update
          }
      }
      
      // Browser (Subscriber) Device: Start NetworkBrowser
      let endpoint = try await browser.run { waEndpoints in // Radio resources in use
              // Review endpoints, decide whether to return or skip
              if let endpoint = self.endpoint(in: waEndpoints) { return .finish(endpoint) }
              else { return .continue }
          }
      // Create the connection
      let connection = NetworkConnection(to: endpoint, using: .parameters {
              TLS()
          })
          .onStateUpdate { connection, state in
              // Process state update
          }
    • 21:11 - Tune performance

      // Listener (Publisher) Device
      // Configure .realtime + .interactiveVideo on NetworkListener
      let listener = try NetworkListener(for:
              .wifiAware(.connecting(to: .fileService, from: .matching(deviceFilter))),
          using: .parameters {
              TLS()
          }
          .wifiAware { $0.performanceMode = .realtime }
          .serviceClass(.interactiveVideo))
      
      // Browser (Subscriber) Device
      // Configure .realtime + .interactiveVideo on NetworkConnection
      let connection = NetworkConnection(to: endpoint, using: .parameters {
              TLS()
          }
          .wifiAware { $0.performanceMode = .realtime }
          .serviceClass(.interactiveVideo))
      
      // Listener (Publisher) Device & Browser (Subscriber) Device
      // Read performance report
      let performanceReport = try await connection.currentPath?.wifiAware?.performance

Developer Footer

  • ビデオ
  • WWDC25
  • Wi-Fi Awareによるデバイスの接続性の強化
  • メニューを開く メニューを閉じる
    • 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.
    利用規約 プライバシーポリシー 契約とガイドライン