2009-08-13 90 views
3

构建我的移动应用程序的桌面版本,并提供用户通过WiFi同步。在模拟器中一切都很好 - 解决网络服务(由桌面应用程序发布)时没有问题,或在服务不可用时发现问题。为什么NSNetServiceBrowser在iPhone OS中查找未发布的服务?

问题是当我在电话上运行应用程序时发现并解决了问题,但NSNetServiceBrowser在服务不可用时从未发现。当发生这种情况时,网络服务浏览器会不断发现网络服务(不再发布)解析它,但无法连接到它。经过多次失败尝试后,服务浏览器委托的“didRemoveService”终于被调用,并且应用程序开始再次正确运行。

我会发布我的代码,但我发现苹果的WiTap示例中发生了同样的问题。服务被发布和发现,但一旦它们变得不可用,运行服务浏览器的客户端不会更新 - 并且反复尝试解析“不应该”存在的服务。

我发现运行WiTap与WiFi关闭(所以Bonjour使用蓝牙)一切工作正常。我无法找到任何抱怨WiTap无法工作的人,并且无法在其他任何地方在网上找到此问题。任何原因 - 可能与iPhone OS或我的无线网络 - 为什么网络服务浏览器可以找到并正确解决(但无法连接到)不可用的服务?

回答

4

iPhone/iPod Touch上的Bonjour/NSNetServiceBrowser将利用Wifi和蓝牙进行服务发现 - 至少在支持的设备上。每次您开始浏览服务时,它都会搜索WiFi和蓝牙(您可以在iPhone的控制台,管理器中进行验证)。由于您的模拟器“设备”无法使用蓝牙,因此您的iPhone通过WiFi发现它。但是,如果您使用NSNetService在iPhone上进行发布,则您同时通过WiFi 蓝牙发布(如果支持并启用)。 NSNetServiceBrowser在具有BT功能的硬件上运行时,将尽职地发现两个实例,并通过代理回调报告。

蓝牙PAN设置比通过Wifi发布需要更长的时间,所以在发现并解决所有基于Wifi的服务后,BT发现的服务通常会显示出来。当测试两个真实设备时,我甚至看到两种服务都出现在我的用户界面中(通常只有在其他手机崩溃之后)。尽管如此,它确实使一些令人沮丧的编码。你最好的选择是利用netService:didNotResolve:(i)重试解析,或者(ii)使netService实例无效,并等待另一个电话重新启动他们的应用程序。

此外,还有一些其他方面可能出错的地方。由于提供给您的NSNetService实例是自动发布的,因此您需要保留它。大多数人将它添加到NSMutableArray或NSMutableDictionary。如果是这种情况,请确保在添加对象之前已经正确初始化了它。由于消息到零是完全正确的,如果你发送addObject:到零,它会显示好像一切工作正常。除了它不是。这在Bonjour故障排除中经常出现,而且发生在我们身上。确保你的NSNetService被安排到一个主动运行的runloop中,并且一个运行在默认或通用模式下。

Apple提供了一个开放的bug(截至2009年10月4日),每隔一段时间,Bonjour更新都不会导致委托方法被解雇。我只观察到这发生在3GS上。结果是客户端应用程序与网络不同步。

NSNetServiceBrowser应始终通知服务何时离开网络(在名义条件下)。上面的错误只是一个间歇性错误,显然,硬件特定。如果您发现它一直在发生,那么您的应用很可能会抛出异常。如果您正在使用后台线程,则可能发生这种情况,而不会导致整个应用程序崩溃。您可能需要检查您的iPhones控制台并记录错误消息。确保你已经在符号objc_exception_throw上设置了断点。

这是我发现的另一个故障诊断技巧,非常宝贵。使用以下命令通过终端在您的开发机器上监听Bonjour广播:dns-sd -B _serviceName。这样可以让您查看本地网络上的所有出入事件,以便为您提供服务。如果您的应用退出,但dns-sd不显示Remove事件,那么您的代码需要重新访问。如果dns-sd显示删除事件,但其他应用程序没有正确处理它,则可能会看到上述错误。也可能是你的代码没有做你认为正在做的事情。请记住,这只会帮助您解决Wifi-to-Wifi服务Bonjour问题。 iPhone Simulator不支持蓝牙到蓝牙。

阅读完整的文章,Troubleshooting Bonjour Networking for the iPhone,在我的开发博客。

+1

我还会补充一点,iPhone OS 3.x似乎在保持其dns-sd缓存与网络同步方面存在问题。因此,它有时会“错过”服务删除事件,从而产生陈旧的条目。我通常可以通过关闭WiFi来解决此问题,然后重新启动并重新启动我的应用。 – Zack 2010-01-20 15:56:19

相关问题