我需要连接到远程主机并使用某种二进制协议交换数据。我正在联系:
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(在另一个应用程序中)时,错误信息非常友好,所以我想得到类似的东西。
答案 0 :(得分:2)
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
返回的字符串,即”操作无法完成。[...]“
答案 1 :(得分:1)
我认为本地化错误描述的配置必须在框架级别进行。换句话说,Foundation框架开发人员提供了更多有用的消息,并且本地化人员对它们进行了翻译等。根据您的描述判断,CoreFoundation层在这方面没有受到太多关注。
您是否可以使用此处使用的Foundation API?
答案 2 :(得分:-1)
您是否认为更容易捕获错误,检查其类型并显示自定义错误消息?让我比重写代码更容易,只是为了制作好消息。额外奖励:这样您可以完全控制并可以添加更长的描述...