You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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代码,而非目标文件。

  • 解决方法

    1. 确认自动重定向配置:默认的URLSessionConfiguration.default已开启自动跟随重定向,可手动明确确保配置正确:
      sessionConfig.httpShouldHandleCookies = true
      sessionConfig.httpShouldUsePipelining = true
      
      若仍不生效,检查是否有代理或网络设置阻止了重定向。
    2. 手动处理重定向:在下载回调中检查响应状态码,如果是3xx(如302),从HTTPURLResponse的allHeaderFields中取出Location字段,获取真实文件URL后重新发起下载请求。
    3. 直接使用真实文件URL:把iCloud共享链接粘贴到浏览器,待文件开始下载后,从浏览器下载记录中复制真实的文件URL,用这个URL替换原请求URL,即可正常下载完整文件。

内容的提问来源于stack exchange,提问作者Dan Donaldson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:24:53