iOS上的NSNetServiceBrowser/Bonjour问题

Jon*_*lis 12 iphone bonjour nsnetservice ios nsnetservicebrowser

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

然而,尽管注意到为什么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. 如果设备在发布服务后更改网络会发生什么?我发现,卓悦并没有重新发布该服务的新网络上-一个人如何可以强制这种情况发生?
  4. 如果设备在搜索服务时更改网络会发生什么?我发现这也会导致问题,并且往往会导致找不到会话(未调用didFindService).

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

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

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

谢谢!

Jon*_*lis 6

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

1.按如下方式安排NSNetService和NSNetServiceBrowsers:

[netService scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[netServiceBrowser scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
Run Code Online (Sandbox Code Playgroud)

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

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

  • 谢谢,实际上我发现`netServiceBrowser:didNotSearch:`每次应用程序从后台返回时都会触发.因此我在该方法中所做的只是在没有任何"UIAlertView"的情况下再次开始浏览.几个月来一直在运行它,到目前为止没有任何不良影响...... (2认同)