提供有意义的错误信息:来自 NSUrlConnection didReceiveAuthenticationChallenge

5
我正在使用OWASP的证书和公钥固定示例。该示例使用random.org,而random.org最近获得了新的证书。这意味着connection:didReceiveAuthenticationChallenge:失败了。这是预期的,也是好的 :)
然而,失败显示为"NSURLErrorDomain",代码为-1012。这并不是很有帮助,用户将无法做出任何有意义的操作:

enter image description here

更好的做法是提供一条类似于“警告:网站的公钥已更改...”的文本消息。

另一个小问题:在connection:didFailWithError:中,我无法确定-1012是由于固定失败还是其他网络错误。因此,我只想为证书失败提供消息,而不是其他-1012错误。

如何向[[challenge sender] cancelAuthenticationChallenge: challenge]的调用提供“丰富的错误信息”(当connection:didReceiveAuthenticationChallenge:失败时调用)。NSURLConnectionDelegate 协议参考NSURLAuthenticationChallengeSender 协议参考没有提到如何这样做。


非常好的问题,有一段时间我也遇到了完全相同的问题,但是无法检索到比-1012更多的信息。我选择了通用消息,告诉用户证书不匹配。 - lawicko
嗨,lawicko。我在考虑尝试使用丰富的错误信息抛出异常。据我所知,Objective C 异常与其他语言的异常不同。你在这种情况下尝试过 Objective C 异常吗? - jww
据我理解,这里的问题是如何获取有关错误的其他信息,而不是如何在之后处理它。因此,您只会得到诅咒的-1012,而不知道其根本原因,基于此,您无法确定它是由于证书失败还是其他问题引起的,或者至少我无法检索到该信息。我不太明白在那个点抛出异常如何帮助解决原始问题? - lawicko
Jeff,你有没有找到一种方法来区分cancelAuthenticateChallenge错误和其他类型的-1012 NSURLErrorDomain错误在connection:didFailWithError中?我很困惑。 - Nate Cook
Nate - 不,我还没有尝试过(忙于其他事情)。让我把它放在待办事项清单上。 - jww
在Cocoa中,强烈建议仅在程序员错误时抛出异常。这里不是编程错误;您无法更改代码以避免错误。通常情况下,异常除了由运行循环捕获外,不会被捕获,其中它们被记录并终止应用程序。当您收到异常时,请修复代码。 - gnasher729
1个回答

0

尝试使用

NSString * alertMessage = [challenge.error localizedFailureReason];

获取可读的错误信息。

请参阅 NSErrorNSURLAuthenticationChallenge 的文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接