12

私が取り組んでいるiOSプロジェクト用に開発しているアプリで、WiFi経由でBonjour(正確にはNSNetServiceBrowser)を使用しています。

ただし、 「NSNetServiceBrowser が iPhone OS で公開されていないサービスを見つけるのはなぜですか?」の優れた応答で提起された問題に注意しているにもかかわらず 私はまだ NSNetSericeBrowser で多くの問題に直面しています。

私のセットアップは次のとおりです。

  • iOS 4.5.3 を実行している iPad での作業。
  • AirMac Express をアクセス ポイント/ルーターとして使用する。
  • ネットワークに接続された Mac で dns-sd -B _serviceName を実行すると、正常に動作します。つまり、すべての公開と停止の呼び出しがデスクトップにすぐに反映されます。

ただし、次の問題が発生しました。

  1. 長時間 (約 15 分以上) 公開されているサービスは、Mac から消えても、クライアントから削除されない傾向があります。(つまり、didRemoveService は呼び出されません)。
  2. 公開されているサービスが、Mac に表示されていても、ネットワーク上の他のユーザーには表示されないことがあります。(つまり didFindService が呼び出されない) -- これはおそらく以下の 3/4 のポイントに関連しています... iPad がネットワークに接続される前にアプリが実行 (および検索) を開始すると、新しいネットワークは検索されません。ちゃんと。
  3. サービスの公開後にデバイスがネットワークを変更するとどうなりますか? Bonjour は新しいネットワーク上でサービスを再公開しないことがわかりました。どうすればこれを強制的に実行できますか?
  4. サービスの検索中にデバイスがネットワークを変更するとどうなりますか? これも問題を引き起こし、セッションが見つからない (didFindService が呼び出されない) 傾向があることがわかりました。

Bonjour は 90% の確率で動作するため、私が抱えていた問題は奇妙です... 私のアプリの信頼性を台無しにしているのは、その 10% だけです! 厄介なのは、上記の問題はすべて、ホーム ボタンを 2 回押してアプリを強制終了し、再実行することで解決できることです。再度実行すると、常に正しいセッションが検出されるか、適切に公開されます。

この問題を回避する 1 つの方法は、ワイヤレス ネットワークが変更されるたびに NSNetServiceBrowser を破棄して再起動することですが、これは非常に面倒で不必要に思えます。苛立たしいのは、Bonjour が高レベルの API であり、微調整やテストを行うための実際のオプションがないことです。

問題1〜4を整理する方法はありますか?

ありがとう!

4

1 に答える 1

6

OK、私はなんとかそれを解決しました-そして他の誰かがBonjour / NSNetServiceBrowserでこの種の信頼性の問題を経験している場合、これが私の解決策です:

1.NSNetServiceとNSNetServiceBrowsersの両方を次のようにスケジュールします。

[netService scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[netServiceBrowser scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

2. NSNetServiceBrowserDelegateからnetServiceBrowser:didNotSearch:メソッドを実装していることを確認してください。

これは、NSNetServiceが(何らかの理由で)公開できなかった場合に発生します。私が行ったのは、UIAlertViewをそこに配置して、検索を完了できなかったため、ネットワーク接続を確認する必要があるというメッセージをユーザーに表示することでした。ブラウジングが可能になると、自動的に再開するようです(ただし、これを調べる必要があります。コード内の何かがそれを引き起こしている可能性があります...)

于 2011-10-06T10:43:31.163 に答える