iOS上的NSNetServiceBrowser / Bonjour问题

我正在使用Bonjour(NSNetServiceBrowser,准确地说)通过WiFi在我正在开发的一个iOS项目开发的应用程序。

但是,尽pipe注意到NSNetServiceBrowser为什么在iPhone OS中find未发布的服务的优秀响应中提出的问题? 我仍然遇到与NSNetSericeBrowser的一些困难。

我的设置如下:

  • 使用运行iOS 4.5.3的iPad。
  • 使用AirPort Express作为接入点/路由器。
  • 在连接到networking的Mac上运行dns-sd -B _serviceName可以正常工作 – 也就是说,所有发布和停止的调用都立即反映在桌面上。

但是,我遇到以下问题:

  1. 长时间发布的服务(大约15分钟+)往往不会被客户端删除, 即使它们从Mac上消失! (即didRemoveService不会被调用)。
  2. 有时,发布的服务在networking上不会被其他人看到, 即使它们出现在Mac上也是如此! (即didFindService未调用) – 这可能与下面3/4点有关…因此,如果应用程序在iPad连接到networking之前开始运行(并search),则它不search新networking正常。
  3. 如果设备在发布服务后更改networking,会发生什么情况? 我发现Bonjour不会在新的networking上重新发布服务 – 如何才能迫使这种情况发生呢?
  4. 如果设备在search服务时更换networking会发生什么情况? 我发现这也会导致问题,并且往往会导致找不到会话(didFindService未被调用)。

我遇到的问题很奇怪,因为Bonjour 90%的时间工作…只是10%,这是破坏我的应用程序的可靠性! 烦人的是,所有上述问题都可以通过双击主页button并强制closures应用程序,然后重新运行来解决。 再次运行后,它总是find正确的会话或正确发布。

避免这个问题的一个方法是拆卸并重新启动NSNetServiceBrowser,只要无线networking改变了…但是这看起来很混乱,没有必要。 令人沮丧的是,Bonjour是一个高级API,没有任何实际的选项来进行调整和testing。

任何想法我怎么能解决问题1-4?

谢谢!

好的,我设法解决了这个问题,如果其他人遇到了Bonjour / NSNetServiceBrowser的这些可靠性问题,这里是我的解决scheme:

1.按如下方式安排您的NSNetService和NSNetServiceBrowsers:

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

2.确保你从NSNetServiceBrowserDelegate实现了netServiceBrowser:didNotSearch:方法。

当NSNetService无法发布时(无论出于何种原因),这将被解雇。 我所做的是把一个UIAlertView在那里显示一条消息给用户说,search不能完成,他们应该检查他们的networking连接。 浏览似乎自动重新启动后,一旦它能够这样做(但我需要看看这个,也许在我的代码中的东西正在使它发生…)