2011-10-04 89 views
11

我正在为我正在开发的iOS项目开发的应用中使用Bonjour(NSNetServiceBrowser,准确地说)通过WiFi进行应用。iOS上的NSNetServiceBrowser/Bonjour问题

但是,尽管注意到在Why does NSNetServiceBrowser find unpublished services in iPhone OS?的优秀响应中提出的问题,但我仍然遇到了NSNetSericeBrowser的一些困难。

我的设置是如下:

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

不过,我已经经历了以下几个问题: - (约15分钟+)已公布了半天

  1. 服务往往得不到客户端上删除,即使他们从消失苹果电脑!(即didRemoveService不会被调用)。
  2. 有时候,发布的服务不会被网络上的其他人看到,即使它们出现在Mac上也是如此(即didFindService未调用) - 这可能与下面的3/4点有关...因此,如果应用程序在iPad连接到网络之前开始运行(并搜索),则它不会搜索新的网络正常。
  3. 如果设备在发布服务后更改网络会发生什么情况?我发现Bonjour 不是在新网络上重新发布服务 - 如何强制这种情况发生?
  4. 如果设备更改网络会发生什么,而正在搜索服务?我发现这也会导致问题,并且往往会导致找不到会话(didFindService未被调用)。

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

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

任何想法,我可能会解决问题1-4?

谢谢!

+4

不明白为什么这个问题没有收到更多的关注,我也有类似的问题,它非常刺激。 – jbat100

回答

6

OK,我设法解决它 - 如果任何人遇到这类使用Bonjour/NSNetServiceBrowser可靠性问题,这是我的解决方案:

1。计划你的NSNetService和NSNetServiceBrowsers既如下:

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

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

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

+0

作为后续工作,似乎Bonjour已经在iOS 5中进行了大修,所以现在可能会考虑一些不同的问题。 –

+0

这太棒了。谢谢。这正是我需要的 –

+2

谢谢,实际上我发现'netServiceBrowser:didNotSearch:'每次从背景回来时都会触发。所以我所做的只是在没有任何'UIAlertView'的情况下再次开始浏览。几个月来一直这样运行它,目前没有任何不良影响... –