alamofire - 错误域=NSPOSIXErrorDomain 代码=28 “No space left on device” UserInfo={_kCFStreamErrorCodeKey=28, _kCFStreamErrorDomainKey=1}

标签 alamofire

最近从我们的 iOS 设备发出的 Alamofire 的大量网络请求失败并出现以下错误:

Error Domain=NSPOSIXErrorDomain Code=28 "No space left on device" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask .<3>, _kCFStreamErrorDomainKey=1, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask .<3>" ), _kCFStreamErrorCodeKey=28}

如果用户移动了 +- 10 米,我们的应用程序会发送网络请求。这是每 5 秒检查一次,因此理论上每五秒可以进行一次调用。网络请求偶尔失败并显示此消息,不返回任何状态代码和上述错误。

该消息暗示错误与设备上的可用磁盘/内存空间有关。但是,在检查两者之后,由于有足够的可用空间,因此找不到链接。此外,该错误发生在多台设备上,所有设备都运行 iOS 14.4 或更高版本。

是否有关于错误代码 28 的信息以及 iOS 设备上的错误原因是什么?更好;如何避免此错误?

最佳答案

回答错误本身的发生:

NSPOSIXErrorDomain Code=28 "No space left on device"

在 Xcode 终端中记录:

2021-05-07 15:56:50.873428+0200 MYAPP[21757:7406020] [] nw_path_evaluator_create_flow_inner NECP_CLIENT_ACTION_ADD_FLOW 05CD829A-810D-412F-B86E-7524369359E8 [28: No space left on device]

2021-05-07 15:56:50.877243+0200 MYAPP[21757:7400322] Task <5504BCDF-7DFE-4045-BD4B-E75054636D5B>.<1> finished with error [28] Error Domain=NSPOSIXErrorDomain Code=28 "No space left on device" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=LocalUploadTask <5504BCDF-7DFE-4045-BD4B-E75054636D5B>.<1>, _kCFStreamErrorDomainKey=1, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalUploadTask <5504BCDF-7DFE-4045-BD4B-E75054636D5B>.<1>" ), _kCFStreamErrorCodeKey=28}

当创建的 NSURLSession 太多时,它似乎会被调用,达到(在我们的测试中)600-700 个 session 的限制,这些 session 未正确维护或关闭。该错误从 iOS 14 开始出现,因此看看是否引入了限制很有趣。

Linked 是一个 github 问题,提出了 JetBrains 在 ktor 微服务框架上的相同问题,指向相同的方向,并提到 session 无效以防止此问题: https://github.com/ktorio/ktor/issues/1341

在我们自己的项目中,问题的根源原来是我们对 StarScream websocket 库的实现。这可能与其他人遇到的问题无关,但无论如何都要进行解释以创建问题的完整图片。这是我们特定情况的起因和修复。

起初我们假设它与 Alamofire(使用的网络库)创建的 URLSession 有关,因为 POST 请求开始被取消,并且关闭应用程序似乎是再次发出请求的唯一解决方案。

但是,我们也使用 StarScream 库的 websocket 连接,它会尝试连接到套接字,如果失败,则每两秒重试一次,最长连接时间为两小时。这意味着在两个小时内,每两秒,我们连接到套接字 -> 收到连接失败 -> 断开套接字 -> 再次连接。使用套接字的单例被认为不可能创建多个 URLSession,因为套接字仅启动一次。然而,再次调用连接到套接字每次都会创建一个新的 nw_connection 对象,因为库没有正确处理断开连接。

image of NWConcrete_nw_connection objects generated in socket connection

验证方法是使用仪器应用程序检查是否创建了新的 nw_connection 对象。在那里记录为“内存泄漏”,nw_connection 对象的创建被记录下来,解决方案是确保我们在再次连接之前正确断开套接字(使 session 无效)。

我希望能在这里回答大部分问题,我会将我自己的问题标记为已回答,因为这是手头问题的解决方案。我认为 Apple 应该考虑准确报告所创建对象的数量是有限的,而不是给出错误“设备上没有剩余空间”。

关于alamofire - 错误域=NSPOSIXErrorDomain 代码=28 “No space left on device” UserInfo={_kCFStreamErrorCodeKey=28, _kCFStreamErrorDomainKey=1},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67318867/

相关文章:

swift - Alamofire http post - 注册用户 Swift 3

ios - 无法将 JSON 响应添加到 Realm

ios - 如何使用 Alamofire 更改全局变量?

ios - Alamofire Web 服务管理器在 viewController 中返回 nil

swift - 在 Alamofire Swift 3 中将数组作为参数发送

ios - 多个请求完成后Alamofire回调

ios - Swift 4 Alamofire 分段上传不起作用

swift - 本地开发站点上的 Alamofire SSL 错误

swift - Alamofire 返回错误的编码

ios,alamofire 5 : need an equivalent of curl --key foo. key --cert foo,pem --location --request GET 'https://bar.baz/foo"