如何解决URLSession遭遇SSL错误-9816后无法恢复与服务器通信的问题?
如何解决URLSession遭遇SSL错误-9816后无法恢复与服务器通信的问题?
问题背景
我们的App在遭遇SSL错误-9816后,会进入无法与服务器域名通信的状态,这个问题已经存在多年了。
第三方错误日志工具(运行在不同端点域名上)记录到的错误信息如下:
NSUnderlyingError": Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9816, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9816, _NSURLErrorNWPathKey=satisfied (Path is satisfied), viable, interface: pdp_ip0[lte], ipv4, dns, expensive, uses cell}, "_NSURLErrorFailingURLSessionTaskErrorKey": LocalDataTask <DEDBFA4D-810D-4438-A6A0-95E3B9668B9E>.<308>, "_kCFStreamErrorDomainKey": 3, "_NSURLErrorRelatedURLSessionTaskErrorKey": <__NSSingleObjectArrayI 0x301f82e60>( LocalDataTask <DEDBFA4D-810D-4438-A6A0-95E3B9668B9E>.<308> )
"NSLocalizedDescription": An SSL error has occurred and a secure connection to the server cannot be made., "NSLocalizedRecoverySuggestion": Would you like to connect to the server anyway?
我们曾在Apple开发者论坛发帖求助,尝试了Apple工程师给出的建议后仍未收到后续回复。
问题特征
- 我们认为这是iOS系统针对App的某种管理机制导致的,因为目前能可靠退出锁定状态的方法只有:
- 删除并重新安装App
- 更新App到新版本
- 等待几天时间
- 设备和App连接其他域名没有问题(比如记录错误的第三方服务),设备上的其他App也能正常联网
- 当我们的App出现这个错误时,其他App连接我们的域名是正常的
- 问题大多出现在移动蜂窝网络环境下:切换到WiFi可以解决,但切回蜂窝网络后问题会立即重现;不过也有少数WiFi环境下出现问题的案例
- 这个SSL错误最常发生在服务器宕机之后。我们的服务器工程师尽了最大努力,但始终无法按需复现这个问题,因此无法满足Apple代码级支持请求中“提供能复现问题的聚焦测试项目”的要求
当前已尝试的方案
- URLSession配置:我们在App中使用了一个共享的URLSession实例,避免多实例带来的问题,配置如下:
let config = URLSessionConfiguration.default config.timeoutIntervalForResource = 22 config.timeoutIntervalForRequest = 20 config.requestCachePolicy = .reloadIgnoringLocalCacheData config.urlCache = nil
- 重置URLSession:当检测到SSL错误时,我们会调用URLSession的
reset()方法,之后再重试请求,但后续请求仍然会返回-9816错误 - 修改缓存策略:按照Apple工程师的建议,将请求的缓存策略改为
.reloadIgnoringLocalAndRemoteCacheData,但没有任何效果
备注:内容来源于stack exchange,提问作者Kpalser
相关产品推荐
相关产品推荐

