iOS上的NSNetServiceBrowser / Bonjour问题

时间:2011-10-04 09:11:32

标签: iphone ios bonjour nsnetservice nsnetservicebrowser

我正在为我正在开发的iOS项目开发的应用程序中使用Bonjour(确切地说是NSNetServiceBrowser)而不是WiFi。

然而,尽管注意到在Why does NSNetServiceBrowser find unpublished services in iPhone OS?的出色回应中提出的问题,我仍然遇到了一些与NSNetSericeBrowser有关的困难。

我的设置如下:

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

但是,我遇到了以下问题: -

  1. 长时间发布的服务(大约15分钟+)往往不会被客户删除,即使它们从Mac上消失了!(即不会调用didRemoveService)。
  2. 有时网络上的其他人看不到发布的服务,即使它们出现在Mac上!(即未调用didFindService) - 这可能与点3/4有关如果应用程序在iPad连接到网络之前开始运行(和搜索),那么它就无法正常搜索新网络。
  3. 如果设备在发布服务后更改网络会怎样?我发现Bonjour 在新网络上重新发布服务 - 如何强制这种情况发生呢?
  4. 如果设备在搜索服务时更改网络会怎样?我发现这也会导致问题,并且往往会导致找不到会话(未调用didFindService)。
  5. 我遇到的问题很奇怪,因为Bonjour 90%的时间都在工作......只有10%会破坏我的应用程序的可靠性!令人讨厌的是,通过双击主页按钮并强制关闭应用程序,然后重新运行它,可以解决上述所有问题。再次运行后,它总是找到正确的会话或正确发布。

    避免这个问题的一种方法是在无线网络发生变化时拆除并重新启动NSNetServiceBrowser ......但这似乎非常混乱和不必要。令人沮丧的是,Bonjour是一个高级API,没有任何实际的调整和测试选项。

    我有什么想法可以解决问题1-4?

    谢谢!

1 个答案:

答案 0 :(得分:6)

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

<强> 1。按如下方式安排NSNetService和NSNetServiceBrowsers:

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

<强> 2。确保从NSNetServiceBrowserDelegate实现netServiceBrowser:didNotSearch:方法。

当NSNetService无法发布时(无论出于何种原因),这将被触发。我所做的是在其中放置一个UIAlertView,向用户显示一条消息,说无法完成搜索并且应该检查他们的网络连接。浏览似乎一旦能够这样做就会自动重启(但我需要研究一下,也许我的代码中有些东西会让它发生......)