# Changelog 所有重要变更均记录于此文件。格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/)。 > 保留最近 14 个版本(v6.101.0 ~ v6.120.0)。更早版本(v6.87.0 ~ v6.100.0)的特性已合并进软件特性功能文档,详见文末归档概览。 *** ## [v6.135.0] - 2026-06-26 ### 🧹 仓库瘦身(历史大文件清理) #### 背景 远程仓库体积膨胀至 598 MB(Gitea 服务端统计),本地 `.git` 277 MB。历史中累积了大量第三方二进制、服务端运行产物与调试截图,导致单次 `git push` 触发 Nginx HTTP 413(请求体过大)。 #### 操作(`git-filter-repo` 改写全部历史) 从所有历史提交中移除以下路径: | 路径 | 类型 | 说明 | |---|---|---| | `windows/local_packages/sqlite3/nuget_test/` | 第三方二进制 | NuGet 测试包(多平台 .so/.dll/.dylib),Flutter 项目不该提交 | | `docs/toolsapi/public/compress/` | 服务端产物 | 图片压缩缓存 | | `docs/toolsapi/public/uploads/` | 用户上传 | 服务端运行时数据,绝对不该入库 | | `docs/toolsapi/public/base64/` | 服务端产物 | base64 编码图片 | | `packages/liquid_glass_easy/showcases/` | 展示资源 | gif 演示文件 | | `debug_*.png`(根目录 6 个) | 调试截图 | 误提交的调试截图 | #### 保留(构建/运行依赖) - `windows/local_packages/sqlite3/prebuilt/sqlite3.dll`(3.1 MB):`windows/CMakeLists.txt:116` 引用,Drift 数据库 Windows 端依赖,已从备份恢复 - `docs/toolsapi/public/qqwry.dat` / `file.json`:服务端运行依赖,本次保留待评估 - `assets/images/empty/rz.png` / iOS AppIcon:建议后续压缩替换,不从历史删除 #### `.gitignore` 新增 - `/docs/toolsapi/public/{compress,uploads,base64}/` - `/debug_*.png`、`/ohos_run_log.txt`、`/build_log.txt` #### 效果 - 本地 `.git`:277 MB → 60 MB(降 78%) - 改写 113 个提交,HEAD 由 `6c8c2e24` → `d01863d0` - 备份:`/tmp/xianyan-backup-20260626-074855.bundle`(164 MB) - ⚠️ 协作者需重新 clone(历史已改写,force push 覆盖远程) --- ## [v6.134.0] - 2026-06-26 ### 🛠 修复(App Store 审核合规 - Guideline 2.4.5(i) / 2.1(a)) #### 背景 App Store 审核驳回 v6.6.25 (2606260),提出 3 项问题: 1. **2.4.5(i)** 三个 entitlement 缺少匹配功能:`files.downloads.read-write` / `files.downloads.read-only` / `network.server` 2. **2.4.5(i)** 沙盒缺少必需 entitlement:`device.camera`(相机功能)/ `personal-information.location`(定位功能) 3. **2.1(a)** 权限管理页点击「相册/存储/麦克风请求」时显示错误(`MissingPluginException`) #### 1. Entitlements 文件修订(macOS 沙盒合规) **`macos/Runner/Release.entitlements` + `DebugProfile.entitlements`**: | 操作 | Entitlement | 说明 | |---|---|---| | ➕ 新增 | `com.apple.security.device.camera` | 相机:扫码/拍照生成卡片/OCR(AVCaptureDevice via PermissionManager.swift) | | ➕ 新增 | `com.apple.security.device.microphone` | 麦克风:语音录制/转文字(AVCaptureDevice via PermissionManager.swift) | | ➕ 新增 | `com.apple.security.personal-information.location` | 定位:permission_handler 依赖链引用 CoreLocation 符号,沙盒需此 entitlement | | ➖ 删除 | `com.apple.security.files.downloads.read-only` | 代码无 `getDownloadsDirectory` 调用,确属冗余 | | ➖ 删除 | `com.apple.security.files.downloads.read-write` | 同上 | | ✅ 保留 | `com.apple.security.network.server` | LocalSend 局域网文件传输实际使用:`HttpServer.bindSecure` / `ServerSocket.bind` | #### 2. Info.plist 补全 Usage Description - 新增 `NSLocationUsageDescription`:声明定位用途(IP 大致区域,不获取精确 GPS) - 已存在:`NSCameraUsageDescription` / `NSMicrophoneUsageDescription` / `NSPhotoLibraryUsageDescription` #### 3. 权限管理 Bug 修复(替代 permission_handler_apple 的 macOS 空实现) **根因**:`permission_handler_apple 9.4.9` 仅支持 iOS,无 macOS 实现,调用 `Permission.camera.status` 等方法时抛出 `MissingPluginException`,UI 显示错误提示。 **修复方案**:新增原生权限管理器,通过 MethodChannel 暴露给 Dart 端。 - **➕ `macos/Runner/PermissionManager.swift`(新文件)** - 支持 4 类权限:`camera` / `microphone` / `photos` / `notification` - 基于 AVFoundation / Photos / UserNotifications framework - 状态字符串与 Dart 侧 `AppPermissionStatus` 枚举对齐:`notDetermined` / `granted` / `permanentlyDenied` / `restricted` - `openSystemSettings` 跳转「隐私与安全性」面板(macOS 无法深链到子页面) - **`macos/Runner/AppDelegate.swift`** - 注册 MethodChannel `apps.xy.xianyan/macos.app` 三个方法: - `checkPermission` → `PermissionManager.checkStatus` - `requestPermission` → `PermissionManager.requestPermission` - `openPermissionSettings` → `PermissionManager.openSystemSettings` - **`macos/Runner.xcodeproj/project.pbxproj`** - 注册 `PermissionManager.swift` 到 Runner target(PBXBuildFile + PBXFileReference + Sources) - **`lib/core/services/auth/permission_service.dart`** - `AppPermission.macosPermissionName` 新增属性:返回原生权限名称字符串 - `AppPermission.localServer` 新增虚拟权限:用于 UI 解释 `network.server` entitlement 对应的 LocalSend 功能 - `AppPermission.isPlatformRelevant` 全平台适配:macOS/Windows/Linux/Web 各自过滤 - `PermissionService.checkStatus` macOS 分支:调用 `MacosPlatformService.checkPermission` - `PermissionService.requestPermission` macOS 分支:调用 `MacosPlatformService.requestPermission` - **`macos/Runner/MainFlutterWindow.swift`** - Impeller 开关修复:setenv 方式已废弃,改为 `FlutterDartProject.commandLineArguments` 传递 `--enable-impeller`/`--no-enable-impeller` #### 4. App Store Connect 回复要点 - `network.server`:LocalSend 局域网文件传输(HttpServer.bindSecure / ServerSocket.bind) - **用户入口路径**:① "我的" → "我的设备" → "文件传输助手"卡片 ② "发现" tab → "文件传输助手"会话(📁 emoji) ③ Spotlight 搜索 "文件传输" → 跳转 ④ 二维码扫描 `xianyan://transfer` scheme - `downloads.read-*`:已删除(无匹配功能) - `device.camera` / `personal-information.location`:已添加 - `device.microphone`:补加(PermissionManager.swift 用到 AVCaptureDevice audio) - Bug 修复:`permission_handler_apple` 无 macOS 实现,已替换为原生 `PermissionManager` #### 5. 防御性决策记录 - **麦克风 entitlement(补加)**:Apple 仅点名 camera,但 `PermissionManager.swift` 同时调用 `AVCaptureDevice.requestAccess(for: .audio)`,没麦克风 entitlement 同样会被 TCC 拒绝。一并加上避免下次因麦克风被拒再次返工。 - **定位 entitlement(防御性添加)**:闲言 APP 实际不用 GPS,仅因 `permission_handler` 二进制含 CoreLocation 符号被 Apple 静态扫描到。更彻底的做法是 fork 该插件移除 location 部分,但成本高,添加 entitlement 是性价比最高的方案。 - **LocalSend 入口路径**:用户可通过 4 个入口触发文件传输功能(详见上方"用户入口路径"),向 Apple 解释 `network.server` 的实际使用场景。 #### 影响范围 - ✅ macOS 端权限管理页面可正常请求相机/麦克风/相册/通知权限 - ✅ 沙盒合规,所有 entitlement 都有匹配功能或代码引用 - ✅ 不影响 iOS / Android / 鸿蒙 / Windows / Linux 端 - ⚠️ 注意:删除 downloads entitlement 后,若未来需要"保存到下载目录"功能需重新添加 *** ## [v6.133.0] - 2026-06-26 ### ✨ 新增(隐私政策多端对齐 + 关于页 DUNS 入口 + GDPR 欧盟代表澄清) #### 背景 v6.132.0 在隐私政策中新增了「主体信息」章节披露 D-U-N-S 编号,但遗留 4 个待办:① 关于页未同步展示 DUNS,多端不一致;② 「十二、国际数据保护」声明已指定欧盟代表但未披露具体身份,违反 GDPR Art.27;③ 网页英文区比中文区少 8 个章节(历史遗留不对齐);④ App 内隐私政策简版(9 章)与网页详版(16+ 章)内容详细程度不一致。本次一次性解决全部 4 项。 #### 1. 任务A:关于页同步展示 D-U-N-S **新增 2 个翻译字段到 `t_about.dart`**: - `entityInfoMenu` / `entityInfoMenuDesc` — 用于关于页「法律信息」区块的新菜单项 - 14 个语言文件全部补全(zh_CN/zh_TW/ja/ko/de/it/es/fr/pt/ru/ar/bn/hi/en) - 法语/意大利语译文含撇号,使用双引号包裹 **`about_page.dart` _LegalSection 新增菜单项**: - 图标 `CupertinoIcons.building_2_fill` — 主体信息入口 - 点击触发 `_showEntityInfoDialog` 弹窗 - 弹窗用 `CupertinoAlertDialog + SingleChildScrollView + Column`,展示 7 个字段(主体名称/DBA/DUNS/统一社会信用代码/注册地址/行业/邮箱),中英对照,底部说明 Dun & Bradstreet 认证 - 所有标签使用 `AppTypography.caption2`,标签 `w600` 加粗,值正常字重,符合 iOS HIG #### 2. 任务B:GDPR 欧盟代表改为"暂无代表" GDPR Art.27 要求非欧盟主体在面向欧盟用户提供服务时须指定 EU 代表。本工作室暂未指定,但原政策声明"已指定欧盟代表"与事实不符,可能被欧盟监管机构质疑。 **修改位置**: - 网页中文区 12.1 GDPR 子章节 — 「我们已指定欧盟代表,联系方式可通过本政策列明的邮箱获取」改为「我们暂未指定欧盟代表(GDPR Art.27 代表)。如有需要,您可通过本政策列明的邮箱与我们联系」 - 网页英文区 XIII. International Data Protection GDPR 子章节同步表述为「We have not yet designated an EU Representative under GDPR Art.27. If needed, you may contact us via the email listed in this policy.」 - App 内隐私政策简版新增「12. 国际数据保护」章节,欧盟代表表述与网页一致 #### 3. 任务C:网页英文区补全 8 个缺失章节 英文区章节由 10 个补齐至 18 个(Zero-XIV),与中文区 17 个章节基本对齐(英文区多「IX. Deceased Person's Information」死者信息章节,是英文区原有保留项)。 | 新增英文章节 | 行号 | 对应中文章节 | |---|---|---| | Zero. Definitions(由 `

` 改为 `

`) | 708 | 零、定义 | | II.5. Business Functions and Personal Information Mapping Table(含 14 行表格) | 805-903 | 二点五、业务功能与个人信息映射表 | | VI. Cookie and Similar Technologies | 1047 | 六、Cookie 及同类技术 | | VII. Third-Party SDKs(含 SDK 表格) | 1049 | 七、第三方SDK | | VII.5. Automated Decision-Making | 1079 | 七点五、自动化决策 | | VIII.5. Personal Information Security Incident Response | 1105 | 八点五、个人信息安全事件处置 | | X.5. Personal Information Protection Impact Assessment | 1142 | 九点五、个人信息保护影响评估 | | XIII. International Data Protection(含 13.1 GDPR/13.2 CCPA/13.3 COPPA) | 1186 | 十二、国际数据保护 | **章节号顺延**:原 VI→VIII、VII→IX、VIII→X、IX→XI、X→XII、XI→XIV,所有子章节号(6.x→8.x、7.x→9.x、8.x→10.x、11.x→14.x)同步顺延。 **翻译质量**:严格保留 HTML 标签结构(`

`/`

`/`

`/`