0

我在 App Store 中有一个相当流行的基于 Bonjour 的应用程序。它运行良好,但大约 0.2% 的用户报告了一个奇怪的错误:“屏幕边缘没有出现箭头,所以我无法与其他人分享内容!”。不用说,显示这些箭头与浏览本地域上的特定 Bonjour 服务有关。

问题是,苹果审核团队似乎间歇性地恰好在这 0.2% 之内。正如您可能想象的那样,这对审核结果不利。无论我如何尝试,我都无法重现此错误。

从我拥有的少数日志来看,我的应用程序运行正常,只是没有收到NSNetServiceBrowser委托调用。什么会导致这种情况?

我尝试过的事情:

  • 具有较短的服务名称 < 14 个字符的长度符合规范。
  • 发布@"local."而不是@""(又名去寻找默认注册域)。无论如何,我的应用程序在广域网上毫无用处。

我没有尝试过的事情:定期重新启动浏览器。(不过,我有两种浏览器,一种寻找旧的较长名称,一种寻找新的较短名称。)

该怎么办?

4

1 回答 1

0

有很多地方可能会出错。由于提供给您的委托方法的 NSNetService 实例是自动释放的,因此如果您计划在该方法的范围之外重用它,则需要保留它。大多数人会将它添加到 NSMutableArray 或 NSMutableDictionary 中,以便它自动保留,并且仅在从集合中删除时自动释放。如果您的代码是这种情况,请确保在添加对象之前已正确初始化集合。由于发送到 nil 的消息完全没问题,您可能会将 addObject:netService 消息发送到 nil。您将不会收到一个明显的指示,表明您从未初始化过数组或字典,并且看起来一切正常……除了当对等方更改状态时“神秘地”委托消息不会触发,当您尝试连接到一个时,等等。这在 Bonjour 故障排除中经常出现,我建议将其作为开始故障排除的第一个地方。它发生在我们最好的人身上。

对于在后台线程上运行网络代码的应用程序来说,一个容易被忽略的问题是:在该线程上抛出一个未处理的异常。由于 Cocoa/Unix 的线程规则,这可以在不使整个应用程序崩溃的情况下发生。如果您的网络代码“无缘无故停止工作”,那么您可能需要检查您的 iPhone 控制台并记录错误消息。确保已在 objc_exception_throw 符号上设置断点。

有关更多信息,请阅读我的开发博客上的完整文章“iPhone 的 Bonjour 网络故障排除” 。

于 2010-01-18T00:50:44.207 回答