我正在为我一直在从事的 iOS 项目开发的应用程序中通过 WiFi 使用 Bonjour(准确地说是 NSNetServiceBrowser)。
然而,尽管注意到为什么 NSNetServiceBrowser 在 iPhone OS 中找到未发布的服务?我在使用 NSNetSericeBrowser 时仍然遇到很多困难。
我的设置如下:
- 使用运行 iOS 4.5.3 的 iPad。
- 使用 AirPort Express 作为接入点/路由器。
- 在连接到网络的 Mac 上运行 dns-sd -B _serviceName 工作正常——也就是说,所有发布和停止的调用都会立即反映在桌面上。
但是,我遇到了以下问题:-
- 发布了很长时间(大约 15 分钟+)的服务往往不会在客户端上被删除,即使它们从 Mac 上消失了!(即 didRemoveService 不会被调用)。
- 有时网络上的其他人看不到已发布的服务,即使它们出现在 Mac 上!(即没有调用 didFindService)——这可能与下面的第 3/4 点有关......如果应用程序在 iPad 连接到网络之前开始运行(和搜索),那么它不会搜索新网络适当地。
- 如果设备在发布服务后更改网络会发生什么?我发现 Bonjour 不会在新网络上重新发布服务 - 怎么能强迫这种情况发生?
- 如果设备在搜索服务时更改网络会发生什么?我发现这也会导致问题,并且往往会导致找不到会话(未调用 didFindService)。
我遇到的问题很奇怪,因为 Bonjour 90% 的时间都在工作……只是那 10% 的时间破坏了我的应用程序的可靠性!令人讨厌的是,上述所有问题都可以通过双击主页按钮并强制关闭应用程序,然后重新运行来解决。再次运行后,它总能找到正确的会话或正确发布。
回避此问题的一种方法是在无线网络发生更改时拆除并重新启动 NSNetServiceBrowser ......但这似乎非常混乱且不必要。令人沮丧的是,Bonjour 是一个高级 API,没有任何实际的调整和测试选项。
有什么想法可以解决问题 1-4?
谢谢!