chore: 发布v6.36.1版本,鸿蒙适配+隐私合规收尾

### 变更详情
1.  **多语言国际化**:新增`rejectAndExit`翻译键,覆盖14种语言的拒绝退出文案
2.  **鸿蒙端适配**:
    - 修复USB事件监听报错,仅Android端启用原生USB监听
    - 调整小部件管理页交互,鸿蒙端跳过Beta弹窗并显示"敬请期待"提示
    - 适配通用设置页和功能检查的鸿蒙端toast替代弹窗逻辑
    - 调整句子详情页"编辑"按钮的鸿蒙端交互
3.  **隐私合规优化**:
    - 移除剪贴板定时轮询,改为被动触发模式,仅在用户主动进入稍后读页面时检查剪贴板
    - 移除Android端非核心权限,精简权限声明
    - 新增启动页SplashActivity作为协议守门人,从根本上阻止敏感插件在协议前初始化
    - 为Android端引导页新增双按钮布局,优化未勾选协议时的用户操作引导
4.  **依赖与代码清理**:
    - 修复macOS端flutter_secure_storage插件导入路径
    - 简化字体导入逻辑,移除冗余的readAsBytes降级逻辑
    - 更新CHANGELOG文档,记录版本变更细节
This commit is contained in:
Developer
2026-06-11 01:23:32 +08:00
parent 3a38c69521
commit b36b9bcf9e
38 changed files with 1422 additions and 542 deletions

View File

@@ -4,6 +4,192 @@
***
## [v6.36.1] - 2026-06-11
### 📱 鸿蒙端适配 — UI交互优化 + USB事件修复
#### 变更内容
**1. 主页"编辑此句"鸿蒙端交互调整**
| 变更 | 说明 |
|---|---|
| 鸿蒙端点击"编辑此句"弹出toast"敬请期待" | 编辑器功能暂未适配鸿蒙平台 |
**2. "实现中的功能"弹窗鸿蒙端适配**
| 变更 | 说明 |
|---|---|
| `FeatureFlagService.check()` 鸿蒙端改为toast提示 | 不再弹出CupertinoAlertDialog改为轻量toast |
| `general_settings_page.dart` 鸿蒙端设置项弹窗改为toast | 保持交互一致性 |
**3. "我的"页面鸿蒙端隐藏Beta入口**
| 变更 | 说明 |
|---|---|
| 鸿蒙端不显示"实验性功能"按钮 | 实验性功能页面暂不适配鸿蒙 |
**4. 桌面小部件页面鸿蒙端适配**
| 变更 | 说明 |
|---|---|
| 鸿蒙端不显示Beta弹窗 | 跳过开发中提示弹窗 |
| 鸿蒙端点击"添加"弹出toast"敬请期待" | 小部件添加功能暂未适配 |
**5. 修复文件传输页面USB事件报错**
| 变更 | 说明 |
|---|---|
| 鸿蒙端跳过原生USB事件监听 | 原生插件未实现`xianyan/usb_events`,避免`MissingPluginException` |
#### 涉及文件
- `lib/features/home/presentation/panels/sentence_detail_actions.dart`
- `lib/core/services/feature/feature_flag_service.dart`
- `lib/features/mine/settings/presentation/general/general_settings_page.dart`
- `lib/features/mine/profile/presentation/profile_page.dart`
- `lib/features/widget/presentation/widget_management_page.dart`
- `lib/features/file_transfer/services/discovery/usb_discovery_service.dart`
***
## [v6.36.0] - 2026-06-10
### 🔒 隐私合规 — 剪贴板读取改为被动触发 + Android引导页双按钮
#### 问题描述
1. 用户同意隐私协议后,`ClipboardMonitorService`立即以3秒定时轮询读取剪贴板违反"非对应场景不得读取剪贴板"的合规要求
2. Android端引导页仍使用勾选框方式与原生隐私协议对话框的双按钮风格不一致
堆栈证据:
```
java.lang.Exception
at android.content.ClipboardManager.getPrimaryClipDescription(Native Method)
at A.e.onMethodCall(Unknown Source:312)
```
#### 修复内容
**1. ClipboardMonitorService改为被动触发核心修复**
| 变更 | 说明 |
|---|---|
| 移除`Timer.periodic`3秒轮询 | 不再主动定时读取剪贴板 |
| 新增`checkClipboardOnce()`方法 | 仅在用户主动操作时调用(被动触发) |
| `initFromStore()`仅恢复启用标志 | 不再自动启动定时器 |
| 5秒防抖机制 | 防止短时间内重复读取 |
**2. 移除自动初始化入口**
| 文件 | 变更 |
|---|---|
| `PostAgreementInitializer` | 移除`ClipboardMonitorService`初始化,不再协议同意后自动启动 |
| `AppLifecycleGate` | 移除前后台切换时自动恢复剪贴板监控 |
**3. 添加被动触发点**
| 场景 | 触发方式 |
|---|---|
| 用户打开稍后读页面 | `ReadLaterPage.initState()``checkClipboardOnce()` |
| 用户点击"从剪贴板粘贴"按钮 | 已有逻辑,无需修改 |
| 用户点击"查看剪贴板"操作表 | 已有逻辑,无需修改 |
**4. Android引导页双按钮**
| 变更 | 说明 |
|---|---|
| `agreement_page.dart` | Android端移除勾选框改为"同意并继续"+"拒绝并退出"双按钮 |
| 其他平台 | 保持原有勾选框逻辑不变 |
***
## [v6.35.0] - 2026-06-10
### 🔒 隐私合规 — 协议前禁止传感器读取SplashActivity守门策略
#### 问题描述
v6.34.0的"先注册再移除"策略无法从根本上阻止传感器读取:
- `super.configureFlutterEngine()`调用`GeneratedPluginRegistrant.registerWith()`
- `SensorsPlugin.onAttachedToActivity()`已被触发并调用`SensorManager.getSensorList()`
- 移除插件发生在传感器读取之后,为时已晚
堆栈证据:
```
java.lang.Exception
at android.hardware.SensorManager.getSensorList(Native Method)
at E7.v.onAttachedToActivity(Unknown Source:168)
at io.flutter.plugins.GeneratedPluginRegistrant.registerWith(Unknown Source:485)
at apps.xy.xianyan.MainActivity.onCreate(Unknown Source:0)
```
#### 修复方案SplashActivity守门策略
**核心思路**在Flutter引擎启动前完成隐私协议确认从根本上阻止`GeneratedPluginRegistrant`在协议前注册敏感插件。
**启动流程变更**
```
旧流程:点击图标 → MainActivityFlutter引擎启动 → 插件注册 → 传感器读取)→ 引导页协议
新流程:点击图标 → SplashActivity原生协议对话框→ 同意 → MainActivityFlutter引擎启动→ 引导页
```
**1. 新增SplashActivity核心修复**
| 文件 | 作用 |
|---|---|
| `SplashActivity.kt` | 应用LAUNCHER入口协议守门人 |
| `SplashActivity.kt` | 检查`agreement_accepted`标志已同意直接启动MainActivity |
| `SplashActivity.kt` | 老用户自动迁移检测Flutter数据目录存在即视为已同意 |
| `SplashActivity.kt` | 新用户显示原生隐私协议对话框(含权限说明+协议链接) |
| `SplashActivity.kt` | 用户同意后持久化状态并启动MainActivity拒绝则退出应用 |
| `dialog_privacy_agreement.xml` | 原生隐私协议对话框布局Material3风格 |
**2. AndroidManifest.xml变更**
| 变更 | 说明 |
|---|---|
| 新增`SplashActivity`为LAUNCHER | 应用启动入口从MainActivity改为SplashActivity |
| `MainActivity`移除LAUNCHER intent-filter | 不再直接启动由SplashActivity守门 |
| `MainActivity`设为`exported=false` | 防止外部直接启动绕过协议 |
**3. MainActivity.kt调整**
| 变更 | 说明 |
|---|---|
| 插件移除/恢复逻辑保留为安全网 | 防Shortcut/DeepLink绕过SplashActivity的异常场景 |
| 更新注释说明守门策略 | 明确正常流程由SplashActivity保证协议同意 |
***
## [v6.34.0] - 2026-06-10
### 🔒 隐私合规 — 协议前禁止权限 + 引导页按钮优化 + Android权限精简
> ⚠️ 此版本的"先注册再移除"策略无法阻止传感器读取已在v6.35.0中修复
#### 问题描述
1. 安卓端未同意隐私声明前,`sensors_plus`等插件在`onAttachedToActivity`时已读取传感器,违反隐私合规要求
2. 引导页未勾选协议时按钮显示不明确,用户无法直观感知"拒绝"操作
3. AndroidManifest.xml声明了多个非核心权限增加隐私审查风险
#### 修复内容
**1. 原生端插件注册管控(核心修复)**
| 文件 | 修复 |
|---|---|
| `MainActivity.kt` | 重写`configureFlutterEngine`:协议未同意时仅注册非敏感插件(跳过传感器/麦克风/位置/WiFi/通知/相机/相册/生物识别/视频播放等11个插件 |
| `MainActivity.kt` | 新增`AGREEMENT_CHANNEL`Flutter端协议同意后通知原生端补充注册敏感插件 |
| `MainActivity.kt` | 使用原生`SharedPreferences`持久化协议同意状态独立于Hive原生端启动时可读 |
| `MainActivity.kt` | 通过反射动态注册插件,依赖变更时仅需更新类名列表 |
**2. 引导页按钮优化**
| 文件 | 修复 |
|---|---|
| `agreement_page.dart` | 未勾选协议时显示红色"拒绝并退出"按钮,点击退出应用 |
| `agreement_page.dart` | 勾选两个协议后显示"同意并继续"按钮,点击进入下一页 |
| `onboarding_provider.dart` | `completeOnboarding()`新增`_notifyNativeAgreementAccepted()`通知原生端 |
| `main.dart` | 老用户升级后自动通知原生端注册敏感插件 |
**3. Android权限精简**
| 权限 | 操作 | 原因 |
|---|---|---|
| `CHANGE_WIFI_MULTICAST_STATE` | 移除 | 非核心功能LocalSend可走其他发现方式 |
| `RECORD_AUDIO` | 移除 | 语音输入非闲言主要功能 |
| `READ_CALENDAR` / `WRITE_CALENDAR` | 移除 | 闲言不依赖日历读写 |
| `ACCESS_FINE_LOCATION` | 移除 | 粗略定位已满足天气城市级需求 |
| `android.hardware.usb.host` | 移除 | 闲言不依赖USB主机模式 |
**4. 多语言支持**
- 新增`rejectAndExit`翻译键14种语言全部覆盖
***
## [v6.33.0] - 2026-06-10
### 🐛 文件传输助手 — 修复iOS端"搜索附近设备"卡死/崩溃