为什么NSNetServiceBrowser发现在iPhone OS中未公开的服务?(Why doe

2019-08-01 04:11发布

建立我的移动应用程序的桌面版本,并提供通过WiFi用户同步。 一切正常,在模拟器伟大的 - 没有任何问题解决网服务(这是由桌面应用程序发布),或注意到当服务变得不可用。

问题是,当我运行的应用程序对手机服务的发现和解决(sometiems),但从未NSNetServiceBrowser通知当服务变得不可用。 当这种情况发生的网络服务浏览器不断发现一个网络服务(即不再出版)解决,但随后无法连接到它。 几次失败的尝试后,在服务的浏览器代理的“didRemoveService”终于打来电话,应用程序再次开始正常运行。

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

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

Answer 1:

卓悦/ NSNetServiceBrowser上的iPhone / iPod Touch将利用WiFi和蓝牙服务发现 - 至少在支持的设备。 每次开始浏览的服务的时候,它会搜索WiFi和蓝牙(您可以在iPhone的控制台验证,在主办单位)。 由于您的模拟器“设备”不能使用蓝牙,您的iPhone发现它通过WiFi。 但是,如果你正在使用NSNetService到你的iPhone上发布,那么你发布了WiFi 蓝牙,以及(如果支持并启用)。 NSNetServiceBrowser,对BT功能的硬件上运行时,会忠实地发现,这两种情况下,并报告都通过委托回调。

蓝牙PAN设置时间比通过Wifi发布时间越长,所以BT-发现的服务经常出现以及所有基于WiFi的服务已经发现并解决了。 当测试两个真正的设备,我甚至看到两种服务在我的UI显示(通常只有其他手机崩溃后)。

它确实让一些令人沮丧的编码,虽然。 最好的办法是利用netService:didNotResolve:要么(一)重试分辨率,或(ii)无效netService实例,并等待对方手机重新启动他们的应用程序。

此外,还有一些其他领域的事情都可能出错。 由于提供给您的NSNetService情况下会被自动释放,你需要保留它。 大多数人把它添加到一个NSMutableArray或的NSMutableDictionary。 如果是这样的话,请确保你已经添加对象之前正确初始化它。 由于消息到零是完全OK,如果你发送ADDOBJECT:到零,仿佛一切正常,将出现。 但它不是。 这往往作物起来卓悦排除故障,发生在我们最好的。 请确保您的NSNetService被调度到一个正在运行runloop,和一个在默认或普通模式下运行。

有与苹果(截至09年10月4日)提交的开放的bug,从而每隔一段时间,Bonjour地更新将不会导致委托方法被解雇。 我只看到这发生在一个3GS。 其结果是一个客户端应用程序是不与网络同步。

当服务离开网络(额定条件下)NSNetServiceBrowser应该始终通知。 上述缺陷仅是间歇性之一,并且很显然,特定的硬件。 如果你看到它发生的持续,那么很可能是你的应用程序被抛出异常。 如果您使用的后台线程,这样可以在不引起你的整个应用程序崩溃发生。 您可能要检查你的iPhone控制台和日志中的错误消息。 确保您已设置的符号objc_exception_throw一个断点。

下面是我找到了宝贵的另一个故障排除提示。 使用以下命令监视通过终端的开发计算机上的Bonjour广播:DNS-SD -B _serviceName。 这将让你看到你的本地网络上的所有送往迎来为您服务。 如果您的应用程序退出,但DNS-SD不显示删除事件,那么你的代码需要重新审视。 如果DNS-SD显示remove事件,但你的其他应用程序不能正确地处理它,你可能会看到上述错误。 这也可能是你的代码是没有做什么你认为它做的情况。 请记住,这只会帮助您解决无线上网到WiFi服务的Bonjour。 蓝牙蓝牙是不是从iPhone模拟器支持。

阅读完整的文章, 故障排除卓悦网络的iPhone ,在我的dev博客。



文章来源: Why does NSNetServiceBrowser find unpublished services in iPhone OS?