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:
186
CHANGELOG.md
186
CHANGELOG.md
@@ -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`在协议前注册敏感插件。
|
||||
|
||||
**启动流程变更**:
|
||||
```
|
||||
旧流程:点击图标 → MainActivity(Flutter引擎启动 → 插件注册 → 传感器读取)→ 引导页协议
|
||||
新流程:点击图标 → SplashActivity(原生协议对话框)→ 同意 → MainActivity(Flutter引擎启动)→ 引导页
|
||||
```
|
||||
|
||||
**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端"搜索附近设备"卡死/崩溃
|
||||
|
||||
Reference in New Issue
Block a user