我在App Store中有一个颇受欢迎的基于Bonjour的应用程序。它工作得很好,但是大约0.2%的用户报告了一个奇怪的错误:“屏幕边缘没有箭头,所以我无法与其他人分享内容!”。毋庸置疑,显示这些箭头与浏览本地域上的特定Bonjour服务有关。
问题是,Apple审核小组似乎间歇性地在这个0.2%。正如您可能想象的那样,这对于审核结果并不好。无论我尝试多少,我都无法重现这个错误。
从我的几个日志中,看起来我的应用程序运行正常,只是没有接收NSNetServiceBrowser
委托调用。是什么导致这种情况?
我尝试过的事情:
@"local."
而不是@""
上发布(也就是去寻找默认注册域名)。无论如何,我的应用程序在广域网上毫无用处。我没有尝试的事情:定期重新启动浏览机器。 (我有两个浏览器,一个寻找旧的更长的名称,一个用于新的更短的名称。)
怎么办?
答案 0 :(得分:0)
有许多方面可能出现问题。由于提供给您的委托方法的NSNetService实例是自动释放的,因此如果您计划将其重新用于该方法的范围,则需要保留它。大多数人会将它添加到NSMutableArray或NSMutableDictionary中,以便它自动保留,并且只有在从集合中删除时才会自动释放。如果您的代码属于这种情况,请确保在添加对象之前已正确初始化了集合。由于到nil的消息完全没问题,您可能会将addObject:netService消息发送到nil。你不会得到一个明显的迹象表明你从未初始化你的数组或字典,它看起来好像一切正常......除了当对等体改变状态,当你尝试连接时,“神秘地”委托消息不会触发在Bonjour故障排除中经常出现这种问题,我建议将其作为开始排除故障的第一步。它发生在我们最好的人身上。
在后台线程上运行网络代码的应用程序容易遗漏一个问题:在该线程上抛出未处理的异常。由于Cocoa / Unix的线程规则,这可以在不破坏整个应用程序的情况下发生。如果您的网络代码“只是无缘无故地停止工作”,那么您可能需要检查您的iPhone控制台和日志以查找错误消息。确保在objc_exception_throw符号上设置了断点。
有关详情,请参阅我的开发博客上的完整文章"Troubleshooting Bonjour Networking for the iPhone"。