我需要连接到远程主机并使用某种二进制协议(protocol)交换数据。我正在与:
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"whatever.host.com",
port, &readStream, &writeStream);
一切都很好,除了错误处理。我是
NSStreamEventErrorOccurred
theError = [stream streamError];
检索错误[theError localizedDescription]
获取用户友好的错误文本。 这是的问题:我得到了
"Operation could not be completed. (NSUnknownErrorDomain error 8.)"
而不是漂亮的错误消息,例如“找不到主机”,或者,当设备处于飞行模式时,我得到
"The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 2.)"
问题:如何获得套接字连接,在哪里可以检索适当的错误消息?当我使用NSURLConnection(在另一个应用程序中)时,错误消息很好且很友好,因此我想得到类似的东西。
最佳答案
Apple未提供有关iOS上错误情况的正确描述。这不是您的代码或其代码中的错误-字符串根本不存在于iOS设备上。
为了提供更多有趣的错误信息,您将需要检查CFError
和NSError
对象的域和代码并返回一些信息。 Apple网站上的here提供了kCFErrorDomainCFNetwork
中的错误描述列表。像这样的代码会有所帮助-在构建错误演示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;
}
这会在您的应用程序 bundle 包中名为“kCFErrorDomainCFNetwork.strings”的文件中查找诸如“100”的字符串(对于kCFSOCKSErrorUnknownClientVersion,您可以将其值提供为“SOCKS服务器拒绝访问,因为它不支持与请求的SOCKS版本的连接。“)如果没有此类错误描述,它将使用
NSError
返回的字符串,该字符串将为“操作无法完成。[...]”关于iphone - CFStream : User-friendly errors,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3596789/