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
相关产品推荐
相关产品推荐

