我使用Bonjour (NSNetServiceBrowser,准确地说)通过WiFi在一个应用程序,我正在开发一个iOS项目,我一直在工作。
然而,尽管注意到为什么NSNetServiceBrowser在iPhone OS中发现未发布的服务中提出的问题?我在使用nsnetservicebrowser时仍然遇到一些困难。
我的设置如下:
- 适用于运行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%破坏了我的应用的可靠性!恼人的是,上述所有问题都可以通过双击home键并强制关闭应用程序,然后重新运行它来解决。在再次运行它之后,它总是找到正确的会话或正确发布。
避免这个问题的一种方法是拆除并重新启动NSNetServiceBrowser,每当无线网络改变…但这看起来非常混乱和不必要。令人沮丧的是,Bonjour是一个高级API,没有任何真正的选项来调整和测试。有任何想法我可能能够整理问题1-4?
谢谢!
好的,我设法解决了它-如果其他人在使用Bonjour/NSNetServiceBrowser时遇到这些类型的可靠性问题,以下是我的解决方案:
1。按如下方式安排NSNetService和nsnetservicebrowser:
[netService scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[netServiceBrowser scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
2。确保你从NSNetServiceBrowserDelegate中实现了netServiceBrowser:didNotSearch:方法。
当NSNetService不能发布时(不管什么原因),这个将被触发。我做的是放一个UIAlertView在那里显示一条消息给用户说搜索不能完成他们应该检查他们的网络连接。浏览似乎一旦能够这样做,就会自动重新开始(但我需要研究一下,也许我的代码中的某些东西正在使它发生…)