我需要连接到远程主机并使用某种二进制协议(protocol)交换数据。我正在与:

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"whatever.host.com",
           port, &readStream, &writeStream);

一切都很好,除了错误处理。我是
  • 在我的流的委托(delegate)
  • 中处理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设备上。

    为了提供更多有趣的错误信息,您将需要检查CFErrorNSError对象的域和代码并返回一些信息。 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/

    10-10 03:58