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

Swift中用Alamofire下载AWS S3资产压缩包并解压保存求助

解决AWS S3压缩包下载并解压的问题

你的现有代码已经实现了基础的下载逻辑,但缺少解压处理和completionHandler的正确回调,同时可以优化错误处理的细致度。以下是完善后的代码方案:

完善后的完整代码

import Alamofire

func downloadAndUnzipAssets(from url: URL, completionHandler: @escaping (Error?) -> Void) {
    // 定义下载目标路径
    let destination: DownloadRequest.Destination = { _, _ in
        let documentsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
        let zipFileURL = documentsDir.appendingPathComponent("Assets.zip")
        return (zipFileURL, [.removePreviousFile, .createIntermediateDirectories])
    }
    
    AF.download(url, to: destination)
        .responseDownload { response in
            switch response.result {
            case .success(let zipFileURL):
                print("下载完成,开始解压")
                
                // 定义解压目标目录(比如Documents下的Assets文件夹)
                let unzipDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
                    .appendingPathComponent("Assets")
                
                do {
                    // iOS14+/macOS11+ 系统原生解压API
                    try FileManager.default.unzipItem(at: zipFileURL, to: unzipDir)
                    print("解压成功,文件已保存到 \(unzipDir.path)")
                    // 可选:删除下载的zip包以节省空间
                    try FileManager.default.removeItem(at: zipFileURL)
                    completionHandler(nil)
                } catch {
                    print("解压失败:\(error.localizedDescription)")
                    completionHandler(error)
                }
                
            case .failure(let error):
                print("下载失败:\(error.localizedDescription)")
                completionHandler(error)
            }
        }
}

关键改进点说明

  • 修正回调逻辑:原代码未调用传入的completionHandler,上层无法感知任务完成状态。现在下载/解压成功或失败时都会触发回调,传递错误信息(成功则为nil)。
  • 添加解压流程:利用iOS14+系统原生的FileManager.unzipItem(at:to:)方法完成解压,无需额外第三方库。如果需要兼容iOS13及以下版本,可以引入第三方库如Zip,替换解压部分代码为:
    try Zip.unzipFile(zipFileURL, destination: unzipDir, overwrite: true, password: nil)
    
  • 优化错误处理:分别捕获下载错误和解压错误,明确输出错误信息,便于调试。
  • 可选清理:解压完成后可以删除原zip包,节省本地存储空间。

使用示例

// 替换为你的AWS S3资产包URL
let s3AssetURL = URL(string: "https://your-bucket.s3.amazonaws.com/Assets.zip")!
downloadAndUnzipAssets(from: s3AssetURL) { error in
    if let error = error {
        // 处理错误
        print("任务失败:\(error)")
    } else {
        // 处理成功后的逻辑,比如加载解压后的资源
        print("资源下载并解压完成")
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:05:21