我需要连接到远程主机并使用某种二进制协议交换数据.我正在联系:
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"whatever.host.com",
port, &readStream, &writeStream);
一切都很好,除了错误处理.我
>在我的流的委托中处理NSStreamEventErrorOccurred
>使用Error = [stream streamError]检索错误;
>尝试使用[the localized localizedDescription]获取用户友好的错误文本.
这是问题所在:而不是很好的错误消息,比如’未找到主机’,我得到“操作无法完成.(NSUnknownErrorDomain error 8.)”
或者,当设备处于飞行模式时,我得到“操作无法完成.(kCFErrorDomainCFNetwork error 2.)”
问题:如何获得套接字连接,我可以在哪里检索正确的错误消息?当我使用NSURLConnection(在另一个应用程序中)时,错误信息非常友好,所以我想得到类似的东西.
最佳答案 Apple没有提供有关iOS错误情况的正确说明.这不是您的代码或他们的错误 – 这些字符串根本不存在于iOS设备上.
为了提供更有趣的错误信息,您需要检查CFError和NSError对象的域和代码并返回一些内容. Apple网站上提供了kCFErrorDomainCFNetwork的错误说明列表here.像这样的代码会有所帮助 – 在构建错误演示UI时调用它:
NSString *GetUsefulErrorDescription(NSError *e) {
NSString *codeString = [NSString stringWithFormat: @"%li", (long)[e code]];
NSString *localized = NSLocalizedStringInTable(codeString, [e domain], nil);
if (!localized || [localized isEqual: codeString])
return [e localizedDescription];
else
return localized;
}
这将在您的应用程序包中名为“kCFErrorDomainCFNetwork.strings”的文件中查找字符串,例如“100”(对于kCFSOCKSErrorUnknownClientVersion,其值可以提供为“SOCKS服务器拒绝访问,因为它不支持与请求的SOCKS版本的连接.)如果没有这样的错误描述可用,它会使用NSError返回的字符串,即“操作无法完成.[…]”