本页目录

产品文档 / 历史记录与验收范围以文中日期为准

新工程迁移说明(2026-10-01):本文记录旧版设计或旧工程历史状态。当前实现以 ZipHarbor/ZipHarbor.xcodeproj 为准,参见 迁移映射、新架构 和 最终验收报告。

压缩解压缩 iOS App 技术方案文档

文档版本:v1.0
目标:在一个完整版本中交付稳定、可维护、隐私优先的压缩解压缩工具。
推荐技术栈:Swift、SwiftUI、必要位置使用 UIKit、Swift Concurrency、Document Picker 和 File Provider。建议最低支持 iOS/iPadOS 17,以覆盖所需的 SwiftUI 导航、照片选择、Shortcuts 和多窗口能力,并降低系统兼容分支数量。

1. 技术目标与约束

技术目标

关键约束

2. 总体架构

采用分层架构,UI、任务编排、文件系统和压缩引擎相互隔离:

推荐模块:

2.1 模块职责

AppShell

ArchiveUI / FileBrowser

ArchiveApplication

提供用户用例:

每个用例负责参数校验、权限生命周期、任务创建和结果映射,不负责具体压缩算法。

ArchiveDomain

定义与具体库无关的模型和规则。例如:

2.2 归档引擎适配层

通过 ArchiveEngine 协议隔离第三方库。协议负责检查归档、异步列出条目、解压、创建和校验。每种库通过 Adapter 实现统一接口。

ZIP 可优先评估 AppleArchive、ZIPFoundation 或 minizip;TAR/GZIP/BZ2 可评估 libarchive;7z 和 RAR 需额外审核组件许可证与商用分发约束。

UI 和业务用例不依赖具体引擎实现。替换或升级库时,归档目录模型和任务界面保持稳定。

2.3 FileAccess

统一处理:

所有 File URL 进入领域层前转换为 FileReference,避免把失效的裸路径传到任务中。

2.4 Persistence

建议使用 SQLite 或 Core Data 保存:

不保存压缩包密码明文、文件内容或完整文件名和路径的分析副本。

密码如用户明确启用“保存密码”,使用 Keychain,并按源文件安全标识加密关联。

3. 任务执行设计

3.1 状态机

状态依次为:

创建 → 排队 → 获取输入 → 检查归档 → 准备处理 → 处理中 → 校验 → 完成/部分完成/失败/取消。

需要密码时进入等待密码状态;暂停后可恢复到处理中。任务状态必须持久化。App 被系统杀死后,根据检查点恢复或安全标记为“需要重试”。

3.2 并发策略

3.3 进度计算

同时维护已处理字节/总字节、已完成条目/总条目、当前速度和滑动平均速度、预计剩余时间。

未知展开大小时显示已处理条目和字节,不伪造百分比。压缩包索引无法提供可靠大小时,使用“正在处理”而不是跳动的错误进度。

3.4 取消和恢复

3.5 后台执行

4. 文件和归档安全

4.1 路径安全

解压前对每个条目进行:

  1. Unicode 规范化。
  2. 分隔符和点路径清理。
  3. 生成目标 URL 后验证其标准化路径仍位于目标目录内。
  4. 拒绝绝对路径、路径穿越、危险符号链接和设备文件。
  5. 对过长文件名和非法字符采用明确的安全重命名,并记录结果。

路径验证必须使用标准化后的文件 URL 及文件系统组件比较,不能只用字符串前缀判断(例如 /safe 和 /safe-evil 的前缀关系)。

4.2 解压炸弹和资源限制

设置可配置的安全阈值:

超过限制时先提示用户;只有用户明确确认且磁盘空间足够才继续。对可疑归档采取保守默认值,避免因极高压缩比占满设备。

4.3 密码和加密

4.4 不可信解析

5. iOS 系统集成

5.1 Files 和 Document Picker

5.2 分享面板

实现 Share Extension 或标准 UIActivityViewController 集成:

5.3 照片选择

5.4 iPad

5.5 App Intents 和 Shortcuts

6. 预览系统

预览层独立于压缩引擎:

  1. 引擎以流或临时文件提供条目内容。
  2. Preview Provider 根据 UTType 选择 Quick Look、系统 PDF、图片或媒体播放器。
  3. 大文件优先流式预览,不默认复制完整文件。
  4. 无法预览时提供“导出到其他 App”,不显示空白页。

支持图片、PDF、TXT、RTF、Office 常见格式以及常见音视频的只读预览。预览失败不应影响条目导出。

7. 错误模型

定义稳定的领域错误,不直接把底层错误字符串展示给用户:

每个错误映射到用户能理解的标题、原因说明、一个首选下一步动作,以及可选的技术详情(仅用于用户主动反馈和调试)。

8. 性能方案

建议基准场景:

场景 目标
100 MB ZIP 目录展示 5 秒内显示首屏条目
1 GB ZIP 解压 内存不随总文件大小线性增长
10,000 条目目录 列表滚动无明显卡顿
100 张照片压缩 UI 可操作,任务可取消
云端占位文件 下载、解压、输出状态清晰

9. 测试方案

9.1 单元测试

9.2 集成测试

9.3 归档兼容测试

建立固定 fixture 集合:

每个 fixture 验证目录、文件大小、校验和、权限、错误类型和 UI 结果。

9.4 安全测试

9.5 UI 自动化和可用性测试

验证分享面板到解压完成、多选照片到 ZIP 完成、密码错误、重名、空间不足、网络断开、取消和恢复等完整流程,并覆盖 iPhone 小屏、iPad 横屏、深色模式、Dynamic Type 和 VoiceOver。

首次使用测试目标:用户在 60 秒内完成打开 ZIP 并保存文件。

10. 隐私、日志和可观测性

隐私原则

日志原则

11. 依赖、许可证和发布

在引入压缩库前完成:

  1. 对 ZIP、RAR、7z、TAR/GZIP 的覆盖率评估。
  2. 商用分发和 App Store 的许可证审核。
  3. 静态链接、动态链接和第三方声明页面确认。
  4. 库升级策略和安全通告订阅。
  5. 二进制大小、启动时间和隐私清单审核。

发布前检查:

12. 推荐目录结构

ZipApp/ - App/ - Features/ - Files/ - ArchiveDetail/ - CreateArchive/ - TaskCenter/ - Settings/ - Domain/ - Models/ - Errors/ - Policies/ - Application/ - UseCases/ - TaskCoordinator/ - Infrastructure/ - ArchiveEngine/ - FileAccess/ - Persistence/ - Preview/ - Security/ - ShareExtension/ - Resources/ - Localizations/ - Fixtures/ - Tests/ - UnitTests/ - IntegrationTests/ - ArchiveFixtureTests/ - SecurityTests/ - UITests/

13. 最终技术决策

  1. 产品采用本地优先架构,不建设文件上传后端。
  2. 所有压缩库通过 ArchiveEngine 适配层接入,避免 UI 和第三方库耦合。
  3. 所有任务使用持久化状态机、流式 I/O 和原子输出。
  4. 所有外部文件通过 Files、Share、Photos 系统入口获得,不扫描用户整个设备。
  5. 先保证 ZIP、RAR、7z 的稳定性,再扩展更多格式;不为了格式数量牺牲安全和可靠性。
  6. 通过功能边界控制复杂度,OCR、PDF 编辑、视频转换、浏览器和自建云盘不进入产品。

14. 本次实现对齐说明

当前工程位于 app/,产品名称为 ZipHarbor,最低支持 iOS 17,使用 SwiftUI、SwiftData 和 libarchive.xcframework。

已实现的主链路(运行验证状态见验收报告):

有意保持边界的能力:RAR/7z 归档创建以 libarchive 支持为准;不把密码写入历史;暂停/系统杀死后的检查点恢复、通知、快捷指令、回收站和完整的文件管理器仍需要单独补齐,不能从当前版本的界面开关推断为已交付。

14.1 验证记录(2026-09-30)

模拟器 ZipHarborTests 7/7、ZipHarborUITests 1/1 已通过;simctl 安装并启动应用成功,截图保存在 docs/iphone14-home-final.png。测试期间出现过 iOS 26.5 Accessibility 运行时警告,但最终 UI 流程完成。

实体 iPhone 14(UDID IPHONE14_UDID)已完成安装、启动和 ZipHarborTests 7/7 真机验证,截图保存在 docs/iphone14-real-home-final.png。真机 UI runner 在开启自动化模式时超时,报 Timed out while enabling automation mode,需要稳定的设备自动化环境后补跑 UI 页面断言。