首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么NSNetServiceBrowser会在iPhone操作系统中找到未发布的服务?

为什么NSNetServiceBrowser会在iPhone操作系统中找到未发布的服务?
EN

Stack Overflow用户
提问于 2009-08-13 17:15:07
回答 1查看 3.7K关注 0票数 3

构建我的移动应用程序的桌面版本,并提供用户在wifi上的同步。在模拟器中,一切都很好--解决网络服务(由桌面应用程序发布)或注意服务变得不可用时没有任何问题。

问题是,当我在电话服务上运行应用程序时,发现并解决了一些问题(有些问题),但NSNetServiceBrowser从未注意到服务何时不可用。当这种情况发生时,网络服务浏览器会不断地找到一个网络服务(不再发布),解析它,但随后无法连接到它。在几次尝试失败后,服务浏览器委托的"didRemoveService“最终被调用,应用程序开始再次正确运行。

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

我发现在关闭wifi的情况下运行WiTap (所以Bonjour使用蓝牙)一切都很好。我找不到任何人抱怨WiTap不工作,也找不到这个问题在网上任何其他地方。任何原因--可能是使用iPhone操作系统或我的无线网络--为什么网络服务浏览器能够找到并正确解析(但无法连接到)不可用的服务?

EN

回答 1

Stack Overflow用户

发布于 2009-10-04 16:53:09

iPhone/iPod上的Bonjour/NSNetServiceBrowser将同时利用Wifi和蓝牙进行服务发现--至少在支持的设备上是这样的。每次你开始浏览服务时,它都会同时搜索WiFi和蓝牙(你可以在iPhone的控制台和组织者中验证这一点)。由于您的模拟器“设备”不能使用蓝牙,您的iPhone发现它通过WiFi。但是,如果您使用NSNetService在您的iPhone上发布,那么您也是通过WiFi和蓝牙发布(如果支持和启用的话)。在支持BT的硬件上运行时,NSNetServiceBrowser将尽职尽责地发现这两个实例,并通过委托回调来报告这两个实例。

蓝牙PAN设置比通过Wifi发布要花费更长的时间,因此在所有基于Wifi的服务都被发现和解决之后,BT发现的服务通常会很好地显示出来。在测试两个真正的设备时,我甚至看到两个服务都出现在我的UI中(通常是在其他电话崩溃之后)。

不过,它确实会导致一些令人沮丧的编码。你最好的选择是利用netService:didNotResolve:(i)重试解析,或者(ii)使netService实例失效,等待另一部手机重新启动他们的应用程序。

另外,还有其他几个方面可能会出错。由于提供给您的NSNetService实例是自动释放的,所以需要保留它。大多数人将其添加到NSMutableArray或NSMutableDictionary中。如果是这样的话,请确保在添加对象之前已经正确地初始化了它。因为到零的消息是完全没有问题的,如果您发送addObject: to nil,看起来一切都很好。但事实并非如此。这经常出现在Bonjour的故障排除中,并且发生在我们中最好的人身上。确保您的NSNetService被调度到一个正在运行的动态运行循环中,并且运行在默认模式或公共模式下。

苹果( Apple )收到了一个公开的bug (截至2009年4月10日),因此,Bonjour的更新通常不会导致委托方法被解雇。我只观察到这种情况发生在3GS上。结果是一个与网络不同步的客户端应用程序。

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

下面是另一个我发现的非常有价值的故障排除技巧。通过终端监视Bonjour在开发计算机上的广播,使用以下命令: dns-sd -B _serviceName。这将让您看到您的本地网络上的所有来来往往的服务。如果您的应用程序退出,但dns-sd没有显示删除事件,那么您的代码需要重新访问。如果dns-sd显示一个删除事件,但是您的其他应用程序没有正确地处理它,您可能会看到上面提到的错误。也可能是因为您的代码没有执行您认为它正在做的事情。记住,这只会帮助您解决Wifi到Wifi服务Bonjour的问题。iPhone模拟器不支持蓝牙到蓝牙。

阅读完整的文章,iPhone的Bonjour网络故障排除,在我的开发博客。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1273368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档