5

NSNetServiceNSNetServiceBrowserを使用して、ネットワーク上の Bonjour サービスを公開およびスキャンしています。実装は正常に機能しており、サービスはネットワーク上で検出され、通信可能です。私は現在、フレームワークのライフサイクルとこれまでに得たものを理解しようとしています:

// Scanning
netServiceBrowserWillSearch:
netServiceBrowser:didFindService:moreComing: // The device finds itself

// Advertising
netServiceWillPublish:
netServiceDidPublish:

これは、アダプターをオンにしてサービスを開始すると発生します。ここで、サービスがネットワーク上でアクティブにアドバタイズされているかどうかを常に把握する必要があります。つまり、他のデバイスがそれを見つけることができるかどうかです。そこで、Wi-Fi アダプターをオフにしてテストします。

netServiceBrowser:didRemoveService:moreComing:
netServiceBrowser:didFindService:moreComing: // The device finds itself again, even after the adapter is turned off

次に、アダプターをオンに戻します。

netServiceBrowser:didRemoveService:moreComing:
netServiceBrowser:didFindService:moreComing: // Yet again

問題は、アダプターのオンとオフの違いがまったくないため、パターンを探すことができないことです。これらのイベントをキャッチできる他の方法はありますか?

編集:最悪になります。両方のアダプターをオフ (機内モード) にしてサービスを開始しても、netServiceDidPublish:が呼び出されます。これまでのところ、netServiceDidNotPublish:は、同じサービスを 2 回登録しようとしたときにのみ呼び出されるようです。これは私にとって非常に直感的ではありません。サービスがネットワークではなくアダプターに公開された可能性があるため、これらのコールバックは非常に誤解を招く可能性があります。この時点で、サービスがネットワーク上で表示されているかどうかを知る方法はありません。

4

1 に答える 1

0

今後の参考のために、回避策を使用してこれを解決する必要がありました。問題は、Bonjour がそのサービスをプロトコル スタックに発行するため、アダプターが状態を照会されないことです。Bonjour はマルチトランスポート プロトコルであるため、これは理にかなっています。これを解決するために、Apple の到達可能性フレームワークを適応させてインフラストラクチャ Wi-Fi のアダプター状態の変化をリッスンし、その時点で Wi-Fi ダイレクト サポート用の adwl0 インターフェイスの存在をアダプターに問い合わせました。重要な注意: その記事は、一般的な Wi-Fi 接続のサポートを見つけると主張していますが、これは真実ではありません; awdl0 インターフェイスは Wi-Fi Direct インターフェイスであるため、iPhone 4/4S などのデバイスでは失敗します。これらのデバイスは Wi-Fi Direct をサポートしていないため、これで問題ありません。Bonjour は Bluetooth でも動作するため、CoreBluetoothを使用して Bluetooth アダプターの状態変化をリッスンします。このフレームワークは Bluetooth Low Energy を対象としていますが、Bluetooth アダプターがオンになっていることで、Bonjour サービスがネットワーク上で可視化されていることが確実に保証されると思います。Apple が回避策なしでこれを行うことを許可していないのは少し残念ですが、それが私たちが得たものだと思います。

于 2016-02-09T15:57:27.420 に答える