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

SSZipArchive真机解压报Code=-1打开zip失败,模拟器正常如何解决

问题原因
  • 路径格式不兼容:SSZipArchive的unzipFile接口要求传入的atPath和toDestination参数为不带file://前缀的纯路径字符串。absoluteString返回的字符串默认带file://协议头,模拟器对这类格式的容错性更高,但真机沙箱路径校验严格,无法识别带协议头的路径,导致打开文件失败。你之前尝试将参数改为downloadPath.url也无法生效,因为SSZipArchive的接口要求传入String类型的路径参数,传入URL类型本身不符合接口要求。
  • 文件系统大小写差异:iOS模拟器的文件系统默认大小写不敏感,而真机的APFS文件系统大小写敏感,如果传入的文件路径大小写和实际存储的文件路径不一致,真机就会找不到文件。
  • 沙箱权限/文件完整性问题:真机上可能出现zip包未完全下载就触发解压、源文件存储在无读取权限的目录、目标路径无写入权限的情况,这类问题在模拟器上因为权限限制更宽松不会触发。
修复方案

1. 修正路径传参与前置校验

统一使用URL的path属性获取纯路径字符串传入接口,同时添加路径有效性校验,避免吞掉错误:

// 校验源文件是否存在且可读
guard FileManager.default.fileExists(atPath: filePath.path),
      FileManager.default.isReadableFile(atPath: filePath.path) else {
    print("源文件不存在或无读取权限")
    completionHandler(false, [])
    return
}

// 处理目标路径:确保父目录存在且可写
let destPath = downloadPath.path
let destParentDir = (destPath as NSString).deletingLastPathComponent
do {
    try FileManager.default.createDirectory(atPath: destParentDir, withIntermediateDirectories: true)
} catch {
    print("目标目录创建失败:\(error)")
    completionHandler(false, [])
    return
}

do {
    try SSZipArchive.unzipFile(
        atPath: filePath.path,
        toDestination: destPath,
        overwrite: true,
        password: nil,
        progressHandler: { log, info, count, total in
            print("file",log)
            print("info", info)
            print("first", count)
            print("second", total)
        },
        completionHandler: { zipPath,success,error in
            if success {
                print(zipPath)
                let filePaths = FileManager.default.urls(for: downloadPath)
                completionHandler(true, filePaths)
            } else {
                print("解压失败:\(error ?? NSError(domain: "UnzipError", code: -1))")
                completionHandler(false, [])
            }
        }
    )
} catch let err {
    print("解压调用报错:\(err)")
    completionHandler(false, [])
}

2. 补充排查项

  • 校验zip包完整性:解压前打印源文件的大小,和服务端返回的Content-Length对比,确认文件完全下载完成后再调用解压接口。
  • 校验路径大小写:检查传入的filePath的文件名、目录大小写,和实际存储的文件路径完全一致。
  • 确认路径权限:确保源文件存储在App自身的沙箱目录(Documents/Library/tmp)下,目标路径也属于App有权限写入的沙箱范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:15:03