从iCloud下载文件被截断,其他来源正常的技术咨询
从iCloud下载文件仅生成209字节文件的问题排查
我使用的是经过轻微修改的在线教程代码,理解各部分逻辑,但运行后虽显示下载完成且无错误提示,然而生成的文件仅209字节(实际应大得多)。
func dl( request: URL, dest: URL) { let sessionConfig = URLSessionConfiguration.default let session = URLSession(configuration: sessionConfig) let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in if let tempLocalUrl = tempLocalUrl, error == nil { // Success if let statusCode = (response as? HTTPURLResponse)?.statusCode { print("Successfully downloaded. Status code: \(statusCode)") } do { try FileManager.default.copyItem(at: tempLocalUrl, to: dest) } catch (let writeError) { print("Error creating file \(dest) : \(writeError)") } } else { print("Error while downloading. Error : %@", error?.localizedDescription); } } task.resume() }
源文件存储在我的iCloud中,已设置为“任何人可通过链接访问”权限。使用其他站点的URL下载时一切正常。
我未能找到可靠的最新相关指南,想咨询从iCloud下载时我遗漏了什么?
问题原因及解决方案
核心问题:iCloud共享链接是跳转链接
你使用的iCloud公开共享链接并非直接指向文件的真实地址,而是一个引导跳转的页面URL。URLSession请求这个链接时,返回的209字节内容其实是跳转页面的HTML代码,而非目标文件。解决方法
- 确认自动重定向配置:默认的
URLSessionConfiguration.default已开启自动跟随重定向,可手动明确确保配置正确:
若仍不生效,检查是否有代理或网络设置阻止了重定向。sessionConfig.httpShouldHandleCookies = true sessionConfig.httpShouldUsePipelining = true - 手动处理重定向:在下载回调中检查响应状态码,如果是3xx(如302),从
HTTPURLResponse的allHeaderFields中取出Location字段,获取真实文件URL后重新发起下载请求。 - 直接使用真实文件URL:把iCloud共享链接粘贴到浏览器,待文件开始下载后,从浏览器下载记录中复制真实的文件URL,用这个URL替换原请求URL,即可正常下载完整文件。
- 确认自动重定向配置:默认的
内容的提问来源于stack exchange,提问作者Dan Donaldson
相关产品推荐
相关产品推荐

