diff --git a/CHANGELOG.md b/CHANGELOG.md index ee3d0916..0c74ccfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,442 @@ *** +## [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 标签结构(`

`/`

`/`

`/`