gpt4 book ai didi

iphone - 为什么 NSNetServiceBrowser 在 iPhone OS 中找到未发布的服务?

转载 作者:行者123 更新时间:2023-12-03 19:43:10 25 4
gpt4 key购买 nike

构建我的移动应用程序的桌面版本并为用户提供通过 WiFi 同步的功能。模拟器中的一切都运行良好 - 解决网络服务(由桌面应用程序发布)或注意到服务何时不可用没有问题。

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

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

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

最佳答案

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

蓝牙 PAN 设置比通过 Wifi 发布需要更长的时间,因此 BT 发现的服务通常会在所有基于 Wifi 的服务被发现并解决后才显示出来。在测试两个真实设备时,我什至看到这两个服务都显示在我的 UI 中(通常仅在另一部手机崩溃后)。

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

此外,还有其他一些地方可能会出现问题。由于提供给您的 NSNetService 实例是自动释放的,因此您需要保留它。大多数人将其添加到 NSMutableArray 或 NSMutableDictionary 中。如果是这种情况,请确保在添加对象之前已正确初始化它。由于发送到 nil 的消息完全没问题,因此如果您发送 addObject: 到 nil ,它会显得一切正常。但事实并非如此。这种情况在 Bonjour 故障排除中经常出现,而且发生在我们最优秀的人身上。确保您的 NSNetService 被调度到一个正在运行的运行循环中,并且该运行循环在默认或常见模式下运行。

Apple 提交了一个 Unresolved 错误(截至 2009 年 10 月 4 日),Bonjour 更新经常不会导致委托(delegate)方法被触发。我只在 3GS 上观察到这种情况发生。结果是客户端应用程序与网络不同步。

NSNetServiceBrowser 应在服务离开网络时(在正常条件下)始终发出通知。上面的错误只是间歇性的,并且显然是特定于硬件的。如果您看到它持续发生,那么您的应用程序可能会引发异常。如果您使用后台线程,则可能会发生这种情况,而不会导致整个应用程序崩溃。您可能需要检查 iPhone 控制台和日志中是否有错误消息。确保您已在符号 objc_exception_throw 上设置断点。

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

阅读全文,Troubleshooting Bonjour Networking for the iPhone ,在我的开发博客上。

关于iphone - 为什么 NSNetServiceBrowser 在 iPhone OS 中找到未发布的服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1273368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com