我使用URLSession将很多文件上传到服务器,因为上传的文件可能很大,我使用的是URLSessionConfiguration.background,这样我的上传就可以在后台继续。
我的url会话声明如下:
urlSessionConfiguration = URLSessionConfiguration.background(withIdentifier: UploadQueue.uploadQueueIdentifier)
urlSessionConfiguration.sessionSendsLaunchEvents = true
urlSessionConfiguration.shouldUseExtendedBackgroundIdleMode = true
urlSessionConfiguration.allowsCellularAccess = true
urlSessionConfiguration.sharedContainerIdentifier = appGroup
backgroundUploadSession = URLSession(configuration: urlSessionConfiguration, delegate: self, delegateQueue: nil)URLSessionUploadTask总是在前台创建的(我们只使用后台会话来确保任务能够完成)。
var request = try! URLRequest(url: url, method: .put)
backgroundUploadSession.uploadTask(with: request, fromFile: fileUrl).resume() 当上传~100个文件并保持在前台时,所有必要的委托都会正常实现和调用。然而,当上传大量文件(~1000)时,第一个文件上传正确,但经过一段时间后,会话似乎“卡住”,没有回调。(应用程序仍然在前台)我注意到,如果我只是等待,上传重新启动后~5分钟。
我试着用URLSessionConfiguration.default代替URLSessionConfiguration.default,它在前景中运行得很好。是URLSessionConfiguration.background的错误还是我做错了什么?
发布于 2021-03-04 16:38:15
在调查之后,出现了多个问题:
URLSessionConfiguration.httpMaximumConnectionsPerHost会限制开放连接的数量。然而,当使用http/2或服务器在代理后面时,这个限制似乎没有得到遵守。解决方案:做你自己的连接限制(例如。(用DispatchGroup)
解决方案:这是苹果开发者论坛讨论,这是中的一个bug。已经做了一份错误报告。目前,解决方案就是不要用小文件创建太多的后台会话。
https://stackoverflow.com/questions/66278838
复制相似问题