Xcode 9 iOS 11 BoringSSL SSL_ERROR_ZERO_RETURN

60

我在iOS上有一个简单的HelloWorld程序。相同的代码已经很长时间以来一直运行良好。最近,当我将iPad连接到我的Macbook上的Xcode 9时,注意到程序运行时会出现以下BoringSSL错误。当我在模拟器中运行程序时,没有看到此错误。 iOS版本为11.2。Xcode版本为9.2。

我的代码没有涉及到BoringSSL。但是,它确实使用NSMutableURLRequest向服务器发出https调用。调用工作正常,除了BoringSSL消息之外,一切似乎都正常。

有什么方法可以调试出现消息的原因吗?HellowWorld [466:85961],这两个数字代表什么意思?

消息的含义是什么,如何避免它?

2017-12-13 15:41:13.486047-0500 HellowWorld[466:85961] [BoringSSL] Function boringssl_session_errorlog: line 2871 [boringssl_session_read] SSL_ERROR_ZERO_RETURN(6): operation failed because the connection was cleanly shut down with a close_notify alert
2017-12-13 15:41:13.486363-0500 HellowWorld[466:85961] [BoringSSL] Function boringssl_session_errorlog: line 2871 [boringssl_session_read] SSL_ERROR_ZERO_RETURN(6): operation failed because the connection was cleanly shut down with a close_notify alert

添加了屏幕截图


这里在SO上有一个类似的问题,列出了可能的解释:https://github.com/Homebrew/homebrew-core/issues/14418#issuecomment-308850249 - Stephen
1
也遇到了同样的问题。 - Jimbo
2
我有同样的问题。 - Francesco
1
SSL_ERROR_ZERO_RETURN: TLS/SSL连接已关闭。如果协议版本为SSL 3.0或更高版本,则仅在协议中发生关闭警报,即连接已干净地关闭时,才返回此结果代码。请注意,在这种情况下,SSL_ERROR_ZERO_RETURN并不一定表示底层传输已关闭。 - lgarbo
1
请问你找到解决方法了吗? - Ne AS
显示剩余7条评论
4个回答

21

有没有一种方法可以调试为什么会出现这个消息?

确实有,我有点惊讶为什么还没有被提到过。

CFNetwork 处理 Foundation 的网络类的核心 - 它也具有(常常被忽视的)通过CFNETWORK_DIAGNOSTICS 环境变量进行详细记录的能力。

通过编程方式启用 CFNetwork 诊断日志记录:

setenv("CFNETWORK_DIAGNOSTICS", "3", 1);
它应该被设置为0到3之间的整数值,其中0表示关闭日志记录,较高的数字会逐渐给出更多日志记录。在平常开发过程中,您可以通过Xcode的方案编辑器来设置此环境变量。当应用程序从Xcode运行时,CFNetwork日志条目将出现在调试控制台区域(如果不可见,请选择View>Debug Area> Show Debug Area)。
环境变量应该放置在应用程序启动序列的开头。通常将其放置在main的开头就足够了,但是如果您有使用CFNetwork的C++静态初始化程序,则必须将其放在那些代码之前。
备注:在Swift中,此代码应放在main.swift中。默认情况下,Swift应用程序没有main.swift;“The Swift Programming Language”解释了如何添加一个。 *还要注意,在Swift中删除setenv末尾的分号。 上述设置环境变量肯定有助于确定问题所在,或者至少为您开始诊断有点模糊的错误消息提供了起点。
CFNetwork诊断日志记录

5
实际上我尝试了 ´setenv("CFNETWORK_DIAGNOSTICS", "3", 1);´ 这个命令,结果导致我的 iPhone 6+ 变砖了。所以我要提醒大家:只能通过 Xcode 方案编辑器设置此项......而且要从较小的值开始,比如 "1"。 - Jorma Rebane

0
我通过在info.plist中添加“App Transport Security Settings”键来解决了这个问题。确保“Allow Arbitrary Loads”设置为“Yes”。

1
“Allow Arbitrary Loads”属性已设置为“Yes”。但我仍然收到这些错误。由于某种混乱的原因,当我的应用程序尝试将数据上传到使用HTTPS地址的服务器时,它会失败,并且任何后续的导航或下拉刷新操作都会使应用程序冻结。有什么想法吗? - Nexus
也许如果我在 plist 文件中将我的服务器地址(https://my-server.com)加入白名单,它就能正常工作了..? - Nexus

0

对于那些上述方法无效的人,这是我的问题所在:

我使用Alamofire发送了一个带有JSON 请求体GET请求。我将其更改为包含参数的GET请求,将参数作为查询参数出现在URL中(类似于GET https://your-api.com/v1/request?param=value)。然后它就完美地工作了。


-1

当我尝试使用NSLog发布一个非常长的列表时,我收到了类似的消息,因为它会在调试控制台上发布很长一段时间的列表,然后是列表的部分,接着是几个...,以显示控制台中没有打印的更多内容。我用OBJ-C解决了这个问题,并将这个#define添加到我的VC.m中。

#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

也许你可以在你的Swift项目中使用类似的东西。

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