私が取り組んでいるiOSプロジェクト用に開発しているアプリで、WiFi経由でBonjour(正確にはNSNetServiceBrowser)を使用しています。
ただし、 「NSNetServiceBrowser が iPhone OS で公開されていないサービスを見つけるのはなぜですか?」の優れた応答で提起された問題に注意しているにもかかわらず 私はまだ NSNetSericeBrowser で多くの問題に直面しています。
私のセットアップは次のとおりです。
- iOS 4.5.3 を実行している iPad での作業。
- AirMac Express をアクセス ポイント/ルーターとして使用する。
- ネットワークに接続された Mac で dns-sd -B _serviceName を実行すると、正常に動作します。つまり、すべての公開と停止の呼び出しがデスクトップにすぐに反映されます。
ただし、次の問題が発生しました。
- 長時間 (約 15 分以上) 公開されているサービスは、Mac から消えても、クライアントから削除されない傾向があります。(つまり、didRemoveService は呼び出されません)。
- 公開されているサービスが、Mac に表示されていても、ネットワーク上の他のユーザーには表示されないことがあります。(つまり didFindService が呼び出されない) -- これはおそらく以下の 3/4 のポイントに関連しています... iPad がネットワークに接続される前にアプリが実行 (および検索) を開始すると、新しいネットワークは検索されません。ちゃんと。
- サービスの公開後にデバイスがネットワークを変更するとどうなりますか? Bonjour は新しいネットワーク上でサービスを再公開しないことがわかりました。どうすればこれを強制的に実行できますか?
- サービスの検索中にデバイスがネットワークを変更するとどうなりますか? これも問題を引き起こし、セッションが見つからない (didFindService が呼び出されない) 傾向があることがわかりました。
Bonjour は 90% の確率で動作するため、私が抱えていた問題は奇妙です... 私のアプリの信頼性を台無しにしているのは、その 10% だけです! 厄介なのは、上記の問題はすべて、ホーム ボタンを 2 回押してアプリを強制終了し、再実行することで解決できることです。再度実行すると、常に正しいセッションが検出されるか、適切に公開されます。
この問題を回避する 1 つの方法は、ワイヤレス ネットワークが変更されるたびに NSNetServiceBrowser を破棄して再起動することですが、これは非常に面倒で不必要に思えます。苛立たしいのは、Bonjour が高レベルの API であり、微調整やテストを行うための実際のオプションがないことです。
問題1〜4を整理する方法はありますか?
ありがとう!