鸿蒙端提交
This commit is contained in:
86
CHANGELOG.md
86
CHANGELOG.md
@@ -2,7 +2,45 @@
|
||||
|
||||
所有重要变更均记录于此文件。格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/)。
|
||||
|
||||
> 保留最近 10 个版本(v6.79.0 ~ v6.88.0)。更早版本已归档至软件特性功能文档。
|
||||
> 保留最近 10 个版本(v6.80.0 ~ v6.89.0)。更早版本已归档至软件特性功能文档。
|
||||
|
||||
***
|
||||
|
||||
## [v6.89.0] - 2026-06-17
|
||||
|
||||
### 🛠 评分弹窗商店名称多语言 + Beta问卷按钮隐藏跨平台修复
|
||||
|
||||
#### 1. "给个好评"弹窗商店名称由硬编码"Google Play"改为多语言"应用商店"
|
||||
- **需求**: Android 端点击"给个好评"后,跳转确认弹窗显示硬编码英文"Google Play",未接入多语言系统,风格不统一
|
||||
- **实现**:
|
||||
- `t_about.dart` 新增 `appStore` 翻译字段(构造函数 + 字段定义 + toMap + fromMap)
|
||||
- 14 种语言文件全部补充 `appStore` 翻译:
|
||||
- zh_cn: 应用商店 / zh_tw: 應用商店 / en: App Store / ru: Магазин приложений
|
||||
- pt: Loja de aplicativos / ko: 앱 스토어 / ja: アプリストア / it: App Store
|
||||
- hi: ऐप स्टोर / fr: App Store / es: Tienda de aplicaciones / de: App Store
|
||||
- bn: অ্যাপ স্টোর / ar: متجر التطبيقات
|
||||
- `app_store_service.dart` 的 `getStoreName` 方法:Android 分支由 `return 'Google Play'` 改为 `return t.about.appStore`
|
||||
- **影响**: `profile_page.dart` 和 `about_page.dart` 的"给个好评"/"评价应用"入口弹窗文案自动跟随系统语言
|
||||
|
||||
#### 2. Beta 页面"填写问卷"按钮提交后隐藏逻辑跨平台生效
|
||||
- **问题**: 问卷提交后按钮只在 iOS 端隐藏,Android 等端不隐藏
|
||||
- **根因**:
|
||||
1. `_QuestionnaireSheet` 不符合条件关闭时调用 `_markQuestionnaireSubmitted()` 未 `await`,`Navigator.pop` 可能在 SharedPreferences 写入完成前执行
|
||||
2. Sheet 关闭后仅依赖 `_loadQuestionnaireSubmitted()` 异步重读 SharedPreferences 更新 UI,跨平台存在时序差异(iOS NSUserDefaults 内存同步快,Android SharedPreferences.apply 异步落盘)
|
||||
- **修复**:
|
||||
- `_QuestionnaireSheet` 的两处关闭按钮改为 `Navigator.pop(context, true)` 返回已提交标记
|
||||
- `_showQuestionnaire` 接收 Sheet 返回值,`submitted == true` 时立即 `setState` 更新 `_questionnaireSubmitted`,不再依赖 SharedPreferences 时序
|
||||
- 不符合条件关闭分支改为 `async` + `await _markQuestionnaireSubmitted()`,并在 await 前获取 `Navigator.of(context)` 避免 `use_build_context_synchronously`
|
||||
- 保留 `_loadQuestionnaireSubmitted()` 作为兜底,确保与持久化状态最终一致
|
||||
- **效果**: 所有平台(iOS/Android/Windows/macOS)问卷提交后按钮立即隐藏
|
||||
|
||||
#### 修改文件
|
||||
| 文件 | 变更 |
|
||||
|---|---|
|
||||
| `l10n/types/t_about.dart` | 新增 `appStore` 字段(构造/定义/toMap/fromMap) |
|
||||
| `l10n/languages/*.dart` (14 个) | 补充 `appStore` 多语言翻译 |
|
||||
| `core/services/app_store_service.dart` | Android 端商店名称改用 `t.about.appStore` |
|
||||
| `features/settings/presentation/experimental_features_page.dart` | 问卷 Sheet 返回值即时更新 UI + await 修复时序 |
|
||||
|
||||
***
|
||||
|
||||
@@ -312,49 +350,3 @@
|
||||
| `l10n/languages/en.dart` | 新增英文翻译:Remember Account |
|
||||
| `features/auth/presentation/login_form_sections.dart` | `PasswordFormSection` 新增 `isRemembered`/`onToggleRemember` 参数,将忘记密码按钮改为 Row 布局(左:记住账户复选框,右:忘记密码) |
|
||||
| `features/auth/presentation/login_page.dart` | 新增 `_rememberAccount` 状态、`_saveRememberAccount()` 方法;`_loadLastLoginAccount()` 读取 `remember_account` 偏好;`_handlePasswordLogin()` 登录成功后保存/清除账户 |
|
||||
|
||||
***
|
||||
|
||||
## [v6.79.0] - 2026-06-17
|
||||
|
||||
### 🔒 隐私合规 — 修复安卓端自启动问题(androidx.glance.appwidget)
|
||||
|
||||
#### 问题描述
|
||||
1. 应用商店审核发现:`androidx.glance.appwidget` SDK 在应用退出后触发自启动(1次/秒),无隐私文本覆盖
|
||||
2. 审核依据:《个人信息保护法》要求 APP 未向用户明示且未经用户同意,不得存在频繁自启动行为
|
||||
3. 根因:`home_widget` 包引入了 `androidx.glance:glance-appwidget:1.1.1` 依赖,项目未使用 Glance Widget 但该库被打包进 APK,其内部 `GlanceAppWidgetReceiver`/`GlanceAppWidgetService` 被系统广播触发导致自启动
|
||||
4. 次要问题:8个桌面小部件 Provider 在系统定时 `APPWIDGET_UPDATE` 广播触发时,未检查隐私协议状态即执行数据读取
|
||||
|
||||
#### 修复内容
|
||||
|
||||
**1. 彻底移除 androidx.glance.appwidget 依赖**
|
||||
| 文件 | 变更 |
|
||||
|---|---|
|
||||
| `packages/home_widget/android/build.gradle` | 移除 `implementation "androidx.glance:glance-appwidget:1.1.1"` 依赖 |
|
||||
| `HomeWidgetGlanceWidgetReceiver.kt` | 删除未使用的 Glance Receiver 源文件 |
|
||||
| `HomeWidgetGlanceState.kt` | 删除未使用的 Glance State 源文件 |
|
||||
|
||||
**2. AndroidManifest 排除 Glance 组件合并**
|
||||
| 文件 | 变更 |
|
||||
|---|---|
|
||||
| `AndroidManifest.xml` | 新增 `tools:node="remove"` 移除 `GlanceAppWidgetReceiver` 和 `GlanceAppWidgetService`,防止残留库通过 manifest merge 注入 |
|
||||
|
||||
**3. 所有 Widget Provider 增加隐私协议守门**
|
||||
| 文件 | 变更 |
|
||||
|---|---|
|
||||
| `PrivacyAwareHomeWidgetProvider.kt` | 新建基类,在 `onUpdate` 中检查 `agreement_accepted` 标志,未同意时显示占位视图不读取任何业务数据 |
|
||||
| `widget_privacy_placeholder.xml` | 新建隐私占位布局,提示"请先同意隐私政策" |
|
||||
| `DailySentenceProvider.kt` | 改为继承 `PrivacyAwareHomeWidgetProvider`,`onUpdate` → `onUpdateWithAgreement` |
|
||||
| `ReadlaterProvider.kt` | 同上 |
|
||||
| `DailyCardProvider.kt` | 同上 |
|
||||
| `FortuneProvider.kt` | 同上 |
|
||||
| `CountdownProvider.kt` | 同上 |
|
||||
| `PomodoroProvider.kt` | 同上 |
|
||||
| `SolarTermProvider.kt` | 同上 |
|
||||
| `CheckinProvider.kt` | 同上 |
|
||||
| `CtcLatestNoteProvider.kt` | 同上 |
|
||||
|
||||
#### 合规影响
|
||||
- `androidx.glance.appwidget` 自启动行为彻底消除(依赖移除 + Manifest 排除 + 源文件删除三重防护)
|
||||
- Widget Provider 在用户未同意隐私政策前不执行任何数据操作,仅显示占位提示
|
||||
- 与现有 `SplashActivity` 协议守门机制形成完整闭环
|
||||
|
||||
Reference in New Issue
Block a user