2015-12-21 4 views
5

私はNSNetServiceNSNetServiceBrowserを使って、ネットワーク上でBonjourサービスを公開してスキャンしています。実装はうまくいきます、サービスはネットワーク上で見つけられ、彼らは通信することができます。私は現在、フレームワークのライフサイクルを理解しようとしていると、この私がこれまで持っているもの: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:が呼び出されます。これまでのところ、同じサービスを2回登録しようとすると、netServiceDidNotPublish:が呼び出されたようです。これは私には直感的ではありません。多分サービスはアダプタに公開されましたが、ネットワークには公開されていない可能性があります。そのため、これらのコールバックは非常に誤解を招きます。この時点で、サービスがネットワーク上で見えるかどうかわかりません。

+0

同じ問題が発生しました。あなたはこれに対する解決策を見つけましたか? – Mark

+0

@マーク、ちょうど答えを掲載しました。運が良かった! –

答えて

0

将来的には、これを解決するために回避策を使用する必要がありました。問題は、Bonjourがプロトコルスタックにサービスを公開しているため、アダプターが状態のために照会されることがないことです。 Bonjourはマルチトランスポートプロトコルなので、これは理にかなっています。これを解決するために、アップルのreachabilityフレームワークの適応を使用して、インフラストラクチャWi-Fiのアダプター状態の変更を聞きました。この時点で、Wi-Fiダイレクトサポート用にquery the adapter for the presence of the adwl0 interfaceが使用されています。重要な注意:その記事は、一般的なWi-Fi接続のサポートを見つけると主張していますが、これは真実ではありません。; awdl0インターフェイスはWi-Fi Directインターフェイスです。これがiPhone 4/4Sなどのデバイスでは失敗する理由です。これらのデバイスはWi-Fi Directをサポートしていないため、これは問題ありません。 BonjourもBluetoothで動作するので、私はCoreBluetoothを使ってBluetoothアダプタの状態の変化を聞きます。このフレームワークはBluetooth Low Energy向けですが、Bluetoothアダプターがオンになっていると、Bonjourサービスがネットワーク上に表示されることを強く確信しています。 Appleが回避策なしでこれを行うことを許可していないことは少し残念だが、それは私たちが得るものだと思う。

関連する問題