12

我正在为我一直在从事的 iOS 项目开发的应用程序中通过 WiFi 使用 Bonjour(准确地说是 NSNetServiceBrowser)。

然而,尽管注意到为什么 NSNetServiceBrowser 在 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)。

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

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

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

谢谢!

4

1 回答 1

6

好的,我设法解决了它——如果其他人在使用 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 回答