本次更新包含多项功能优化与兼容性修复: 1. iOS/鸿蒙端添加加密出口合规配置,跳过App Store审核问卷 2. 新增学习计划设置页路由与国际化支持 3. 修复鸿蒙端剪贴板粘贴不工作问题,安装标准剪贴板拦截器 4. 优化收藏功能:兼容复合ID、添加状态同步与触觉反馈 5. 修复鸿蒙端相册保存兼容性,统一使用系统分享降级方案 6. 优化搜索快捷方式跳转逻辑,避免白屏问题 7. 更新本地化资源,新增闲情逸致、学习计划等模块翻译 8. 修复节气日期表排序与跨年边界问题 9. 优化设备信息页面显示,新增系统版本号展示 10. 重构文件传输二维码逻辑,使用纯URL提升兼容性 11. 优化设置项布局,避免文本溢出问题 12. 修复登录页记住账户功能,新增隐私协议守卫 13. 更新macOS依赖库,替换flutter_secure_storage为darwin版本
25 KiB
25 KiB
Changelog
所有重要变更均记录于此文件。格式基于 Keep a Changelog。
保留最近 10 个版本(v6.79.0 ~ v6.88.0)。更早版本已归档至软件特性功能文档。
[v6.88.0] - 2026-06-17
✨ 闲情逸致价格档位扩展 + 纠错历史本地缓存 + 学习计划详情页
1. 价格档位从单一"平价"扩展为"平价/中等/高档"三档
- 需求: 原价格仅"平价/付费/商业/未知"四档,无法精准区分中等与高档消费
- 实现:
LeisurePriceType枚举从 4 值扩展为 6 值:budget(平价🆓) /mid(中等💰) /premium(高档💎) /paid(付费💳) /commercial(商业🏪) /unknown(未知❓)- 新增
fromIdCompat静态方法,将旧freeID 兼容映射为budget,保证存量数据可读 label字段改为labelKey(翻译键),避免硬编码中文priceLabel/heatLabel标记 deprecated,新增priceLabelKey/heatLabelKey
- 影响:
leisure_card.dart、leisure_card_row.dart、leisure_card_detail_sheet.dart、leisure_bottom_filter.dart
2. 价格筛选联动数量统计
- 需求: 筛选时用户无法预知各档位有多少卡片匹配
- 实现:
leisure_bottom_filter.dart新增_computeFilterCounts方法,从leisureTimelineProvider遍历所有节点卡片- 9 个筛选项(花期/美食/高海拔/风险/平价/中等/高档/日出/观海)均显示匹配数量角标
- 数量为 0 时不显示角标,避免视觉噪音
- 修复
node.foodCards/node.playCards不存在的 bug,改用node.allCards扩展 getter
3. 闲情逸致全模块多语言支持
- 需求: "平价"等价格标签仍为硬编码中文,未接入翻译系统
- 实现:
- 新建
t_leisure.dart翻译类型,包含 25 个字段(价格档位/筛选标签/热度等级/重构提示) - 接入
t_root.dart、t.dart、translation_io_service.dart - 14 种语言文件全部补充
leisure节点翻译 leisure_card.dart的_buildPriceBadge使用TLeisure翻译leisure_card_detail_sheet.dart新增_priceLabel方法替代priceType.labelleisure_bottom_filter.dart使用_FilterDef+labelGetter从TLeisure获取多语言文案
- 新建
4. 纠错历史本地缓存(drift)
- 需求: 纠错历史每次打开都实时请求服务器,无离线查看能力
- 实现:
app_database.dart新增CorrectionRecords表(15 列:type/sourceType/sourceId/content/username/email/sourceUrl/switchVal/isLocal/isAnonymous/isSynced/createtime/localCreatedAt/updatedAt)- schemaVersion 从 19 升至 20,新增
_migrateToV20迁移方法(建表 + 时间倒序索引) AppDatabase新增 7 个 CRUD 方法:insertCorrectionRecord/insertCorrectionRecords/getCorrectionRecords/deleteCorrectionRecord/clearCorrectionRecords/getCorrectionRecordCount/replaceCorrectionRecordscorrection_provider.dart重构:- 新增
CorrectionItem视图模型,统一本地与服务端字段(fromServerMap/fromDb/toCompanion) CorrectionState新增isLoadingFromCache/isSyncing状态build()启动时异步加载本地缓存loadCorrections()改为"先读本地 → 立即渲染 → 再请求服务器 → 全量替换本地"submitCorrection()成功后写入本地;网络异常时也写入本地(标记isSynced=false)- 新增
clearLocalCache()方法
- 新增
correction_page.dart的_buildRecordItem改用CorrectionItem强类型- 因项目
dart_style/freezed与analyzer 12.1.0不兼容导致build_runner无法运行,手动编写app_database.g.dart中的$CorrectionRecordsTable/CorrectionRecord/CorrectionRecordsCompanion三个类
5. 学习计划预告弹窗"了解详情"详情页
- 需求: 预告弹窗仅文字提示,用户无法了解具体变更内容
- 实现:
t_study_plan.dart新增 3 个翻译字段:restructureDetails/restructureDetailsTitle/restructureDetailsBody- 14 种语言文件全部补充 studyPlan 的 3 个新字段
discover_page.dart弹窗新增"了解详情"按钮(三按钮布局:不再提醒/了解详情/确定)- 新增
_showStudyPlanRestructureDetails方法:底部弹窗展示详情标题、正文、提示卡片 - 详情页使用
CupertinoButton.filled确认按钮,毛玻璃风格容器
修改文件
| 文件 | 变更 |
|---|---|
features/tool_center/leisure/models/leisure_card.dart |
价格枚举扩展为 6 值,label→labelKey,新增 fromIdCompat |
features/tool_center/leisure/presentation/widgets/leisure_bottom_filter.dart |
接入 TLeisure 翻译,新增 9 筛选项 + 数量统计,修复 allCards bug |
features/tool_center/leisure/presentation/widgets/leisure_card_row.dart |
筛选逻辑适配新价格键,兼容旧中文键 |
features/tool_center/leisure/presentation/widgets/leisure_card.dart |
_buildPriceBadge 使用 TLeisure,新增 _priceLabel |
features/tool_center/leisure/presentation/widgets/leisure_card_detail_sheet.dart |
新增 _priceLabel 方法替代 priceType.label |
core/storage/database/app_database.dart |
新增 CorrectionRecords 表 + V20 迁移 + 7 个 CRUD 方法 |
core/storage/database/app_database.g.dart |
手动添加 CorrectionRecords 相关 drift 生成代码 |
features/correction/correction_provider.dart |
重构:新增 CorrectionItem + 本地缓存逻辑 |
features/correction/presentation/correction_page.dart |
_buildRecordItem 改用 CorrectionItem 强类型 |
l10n/types/t_leisure.dart |
新建:闲情逸致翻译类型(25 字段) |
l10n/types/t_study_plan.dart |
新增 3 个重构详情翻译字段 |
l10n/types/t_root.dart |
接入 TLeisure |
l10n/types/t.dart |
导出 t_leisure.dart |
l10n/translation_io_service.dart |
接入 leisure 节点导入导出 |
l10n/languages/*.dart (14 个语言文件) |
补充 leisure 节点 + studyPlan 的 3 个新字段 |
features/discover/presentation/pages/home/discover_page.dart |
弹窗新增"了解详情"按钮 + _showStudyPlanRestructureDetails 方法 |
[v6.87.0] - 2026-06-17
✨ 多平台应用商店统一服务 + 多处交互优化 + 纠错页多语言
1. AppStore 地区不支持问题修复
- 根因: iOS端"我的→给个好评"直接拼接固定URL,未根据当前语言地区生成正确的App Store链接,导致部分用户看到"所在地区不支持"错误
- 修复: 新建
AppStoreService统一应用商店服务,根据Locale.countryCode生成对应地区的App Store URL- iOS:
https://apps.apple.com/{region}/app/id6771828376(应用ID: 6771828376) - Android:
market://details?id=apps.xy.xianyan或 Play Store 网页回退 - 鸿蒙: 华为应用市场
- Windows:
https://apps.microsoft.com/detail/9nqcv5gz10wnb?hl={lang}-{region}(Product ID: 9nqcv5gz10wnb) - macOS: 与iOS相同逻辑
- iOS:
- 影响: profile_page.dart、about_page.dart 的"给个好评"入口统一使用
AppStoreService.getStoreUrlByLocale()
2. 发现页下拉提示文案优化
- 问题: iOS端发现页下拉刷新时提示"松手打开",语义不准确
- 修复: 新增翻译键
releaseToRefresh,iOS端下拉提示改为"松手刷新",覆盖14种语言
3. 学习计划重构预告弹窗
- 需求: 学习计划将在下个版本重构改名为"生活计划",需提前告知用户
- 实现:
- 发现页点击"学习计划"入口时弹出
CupertinoAlertDialog - 内容: "学习计划 将在下个版本重构改名为 生活计划 部分功能有变更"
- 两个按钮: "确定" / "不再提醒"
- "不再提醒"使用
KvStorage持久化标记app.study_plan.restructure_dont_remind,下次不再弹出 - 新增4个翻译键:
restructureTitle/restructureMessage/restructureConfirm/restructureDontRemind
- 发现页点击"学习计划"入口时弹出
4. 管理学习计划页面无法返回修复
- 问题: 学习计划→管理学习计划页面无appbar,iOS端无法右滑返回
- 根因: 使用
context.appGo()跳转,go()会替换路由栈导致无法返回 - 修复: 改为
context.appPush()使用push入栈,支持iOS右滑返回手势
5. 闲情逸致"免费"标签改为"平价"
- 问题: 闲情逸致食物标签显示"免费"二字不符合实际语义
- 修复:
LeisurePriceType.free的label从"免费"改为"平价",同步修改筛选底部弹窗和卡片行筛选逻辑
6. 内容纠错页面全面多语言支持
- 需求: 纠错页面所有硬编码中文需支持多语言
- 实现:
- 新建
t_correction.dart翻译类型,包含48个字段(页面标题、类型标签、状态、来源、验证码、记录等) - 接入
t_root.dart、t.dart、translation_io_service.dart - 14种语言文件全部补充
correction节点翻译 correction_page.dart所有硬编码中文替换为翻译调用:- 类型选项/内容类型选项使用key映射 +
_contentTypeLabel/_correctionTypeLabel辅助方法 - 提交校验、空内容、无效ID、提交成功/失败提示
- 数学验证码弹窗(安全验证、提示、占位符、取消、确认、错误)
- 纠错记录弹窗(标题、空状态、联系邮箱反馈)
- 记录卡片(类型、内容类型、状态:待处理/已处理/已拒绝/未知、来源:本地/管理员)
- 类型选项/内容类型选项使用key映射 +
- 修复记录卡片在长文本时的溢出问题(Text改用Flexible+ellipsis)
- 新建
修改文件
| 文件 | 变更 |
|---|---|
core/services/app_store_service.dart |
新建:统一应用商店跳转服务,支持iOS/Android/鸿蒙/Windows/macOS多平台多地区 |
features/profile/presentation/profile_page.dart |
_launchAppStore 改用 AppStoreService |
features/profile/presentation/about_page.dart |
_onRateApp 增加 WidgetRef 参数,改用 AppStoreService |
features/discover/presentation/pages/home/discover_page.dart |
下拉提示改用 releaseToRefresh;新增 _showStudyPlanRestructureDialog |
features/study_plan/presentation/study_plan_page.dart |
appGo 改为 appPush 修复返回导航 |
features/tool_center/leisure/models/leisure_card.dart |
free label 从"免费"改为"平价" |
features/tool_center/leisure/presentation/widgets/leisure_bottom_filter.dart |
筛选项"免费"改为"平价" |
features/tool_center/leisure/presentation/widgets/leisure_card_row.dart |
筛选逻辑"免费"改为"平价" |
features/correction/presentation/correction_page.dart |
全页面硬编码中文替换为翻译调用 |
l10n/types/t_correction.dart |
新建:纠错页翻译类型(48字段) |
l10n/types/t_root.dart |
接入 TCorrection |
l10n/types/t.dart |
导出 t_correction.dart |
l10n/types/t_discover_base.dart |
新增 releaseToRefresh 字段 |
l10n/types/t_study_plan.dart |
新增4个重构预告翻译字段 |
l10n/translation_io_service.dart |
接入 correction 节点导入导出 |
l10n/languages/*.dart (14个语言文件) |
补充 releaseToRefresh、4个重构预告字段、correction 节点完整翻译 |
[v6.86.0] - 2026-06-17
🐛 修复安卓桌面搜索快捷方式白屏问题
Bug: 在闲言其他页面点击桌面"搜索"快捷方式后白屏,只显示底栏,搜索框不弹出
- 根因:
QuickActionsService._resolveRoute('action_search')返回/profile?action=search,app.dart回调执行appRouter.push('/profile')/profile是StatefulShellRoute的 branch 路由(底栏 Tab),push会在 shell 之外创建新的 ProfilePage 实例,导致白屏只显示底栏ProfilePage.pendingSearch是 static 变量,但 ProfilePage 的initState只在首次构建时触发。底栏使用indexedStack会预构建 ProfilePage,热启动时initState不会再触发,pendingSearch标记永远不会被消费,搜索框不弹出
- 修复:
QuickActionsService._resolveRoute('action_search')改为返回特殊标记action:search,不再返回带参数路由app.dart新增_handleSearchShortcut()方法:使用appRouter.go('/profile')切换到 profile Tab(而非 push),延迟 500ms 后直接在 root context 弹出SpotlightSearchOverlay- 兼容冷启动和热启动:冷启动时 go 切换 Tab 后直接弹搜索框;热启动时同样直接弹搜索框,不依赖 ProfilePage 的 initState
- 鸿蒙端:
OhosNavBridge.push切换页面后延迟 600ms 弹出搜索浮层
修改文件
| 文件 | 变更 |
|---|---|
core/services/device/quick_actions_service.dart |
_resolveRoute('action_search') 返回 action:search 标记;更新文件头注释 |
app/app.dart |
新增 _handleSearchShortcut() 方法;搜索快捷方式不再 push 路由,改用 go 切换 Tab + 直接弹 SpotlightSearchOverlay;移除未使用的 ProfilePage import,新增 SpotlightSearchOverlay import |
[v6.85.0] - 2026-06-17
✨ 新增Token过期智能续期提示功能
- TokenRefreshWatcher: 监听网络恢复事件,自动尝试Token续期,续期失败则弹窗引导重新登录
- 监听
ConnectivityService.onTypeChange,当从离线恢复到在线时自动触发Token检查 - 调用
TokenService.checkToken()检测Token有效性,无效时自动调用TokenService.refreshToken()续期 - 续期失败弹出Cupertino风格弹窗,提供"稍后"和"重新登录"两个选项
- 使用
_dialogShowing+KvStorage双重标记防止重复弹窗 - 在
PostAgreementInitializer中ConnectivityService.init()之后启动,确保依赖就绪
- 监听
修改文件
| 文件 | 变更 |
|---|---|
core/services/auth/token_refresh_watcher.dart |
新建Token续期监听器服务 |
core/services/post_agreement_initializer.dart |
在ConnectivityService初始化后启动TokenRefreshWatcher |
[v6.84.0] - 2026-06-17
🐛 修复鸿蒙端6个核心Bug:认证失败 + 保存相册 + 粘贴不工作
Bug1-4: 鸿蒙端所有需要认证的接口返回401未授权
- 根因:
SecureStorage._useSharedPreferences仅判断 macOS/Windows,鸿蒙端使用flutter_secure_storage但其原生 MethodChannel 未实现,导致 Token 无法读写。所有需要认证的接口(修改密码、密保问题、注销账号、删除设备)均返回401 - 修复:
_useSharedPreferences增加pu.isOhos判断,鸿蒙端降级使用SharedPreferences存储 Token;deleteAll()补充user_id键名匹配
Bug5: 鸿蒙端保存到相册报错
- 根因: 多处代码直接调用
Gal.putImageBytes/Gal.putVideo,但鸿蒙端 gal 插件不支持,调用即崩溃 - 修复: 所有
Gal调用点增加鸿蒙端判断,使用OhosCompatibilityHelper.saveImageToGalleryCompat/saveVideoToGalleryCompat通过系统分享降级 - 影响文件:
share_sheet.dart、leisure_share_sheet.dart、progress_share_card.dart、china_colors_page.dart、chat_video_bubble.dart
Bug6: 鸿蒙端任意输入框粘贴无反应
- 根因: Flutter 标准 TextInputPlugin 长按粘贴使用
flutter/platform通道的Clipboard.getData方法,鸿蒙端 Flutter 引擎 C++ 层未实现此方法,导致粘贴操作静默失败 - 修复: 在原生端
EntryAbility.ets注册flutter/platform通道的剪贴板方法拦截器,将Clipboard.getData/setData/hasStrings路由到鸿蒙原生 pasteboard API;非剪贴板方法调用result.notImplemented()交由引擎默认处理;Dart 端ClipboardBridge新增installOhosClipboardInterceptor()和setData()方法
修改文件
| 文件 | 变更 |
|---|---|
core/storage/secure_storage.dart |
_useSharedPreferences 增加 pu.isOhos 判断;deleteAll() 补充 user_id 键名 |
core/utils/platform/clipboard_bridge.dart |
新增 installOhosClipboardInterceptor() 和 setData() 方法 |
core/utils/platform/ohos_compatibility_helper.dart |
新增 saveVideoToGalleryCompat() 视频保存兼容方法 |
shared/widgets/feedback/share_sheet.dart |
_saveToGallery() 鸿蒙端使用 OhosCompatibilityHelper 降级 |
features/tool_center/leisure/.../leisure_share_sheet.dart |
_saveToAlbum() 鸿蒙端使用 OhosCompatibilityHelper 降级 |
features/progress/.../progress_share_card.dart |
保存相册鸿蒙端使用 OhosCompatibilityHelper 降级 |
features/discover/.../china_colors_page.dart |
保存色卡鸿蒙端使用 OhosCompatibilityHelper 降级 |
features/discover/.../chat_video_bubble.dart |
保存视频鸿蒙端使用 OhosCompatibilityHelper 降级 |
main.dart |
新增 ClipboardBridge.installOhosClipboardInterceptor() 调用 |
ohos/.../EntryAbility.ets |
注册 flutter/platform 通道剪贴板方法拦截器;新增 Clipboard.setData 方法;新增平台通道剪贴板方法(返回Flutter期望格式) |
[v6.83.0] - 2026-06-17
🐛 修复收藏功能两个核心Bug:主页收藏后收藏页不显示 + 取消收藏后数据残留
Bug1: 主页句子卡片收藏后,我的收藏页面不显示
- 根因1:
getFavoriteCount()从translateFavorites表计数,而非sentences表的isFavorite=true,导致收藏页面_totalFavCount为0,显示空状态而非本地收藏列表 - 根因2:
HomeSentence.fromDb将row.isFavorite错误赋值给isLiked而非isFavorited,导致从DB加载的句子收藏状态丢失 - 修复: 新增
getSentenceFavoriteCount()从sentences表统计;修复fromDb字段映射isLiked: row.isLiked, isFavorited: row.isFavorite
Bug2: 我的收藏取消收藏后数据仍在(本地DB和UI未同步更新)
- 根因:
setFavoriteFlag(targetId.toString(), false)传入纯数字ID(如"123"),但sentences表存复合ID(如"feed_123"),导致UPDATE匹配0行 - 修复: 新增
setFavoriteFlagForTarget(targetType, targetId, value)方法,同时尝试复合ID和纯数字ID两种格式;3处调用点全部替换
增强: 收藏页面取消收藏后主页句子状态同步
- 问题: 收藏页面取消收藏后,主页句子卡片的收藏图标不更新
- 修复:
FavoriteNotifier.toggleFavorite成功后调用notifyFavoriteRefresh();HomeNotifier监听favoriteRefreshStream,收到事件后从DB批量同步句子isFavorited状态
修改文件
| 文件 | 变更 |
|---|---|
core/storage/database/app_database.dart |
新增 setFavoriteFlagForTarget() 兼容复合ID和数字ID;新增 getSentenceFavoriteCount() 从sentences表统计收藏数 |
features/home/favorite_repository.dart |
toggleFavorite() 中 setFavoriteFlag → setFavoriteFlagForTarget |
features/home/presentation/favorite/favorite_actions_mixin.dart |
removeFavorite() 和 deleteSelected() 中 setFavoriteFlag → setFavoriteFlagForTarget;loadLocalStats() 改用 getSentenceFavoriteCount() |
features/home/providers/home_sentence_model.dart |
fromDb 修复字段映射:isLiked: row.isLiked, isFavorited: row.isFavorite(原 isLiked: row.isFavorite) |
features/home/providers/favorite_provider.dart |
toggleFavorite() 成功后调用 notifyFavoriteRefresh() 通知主页 |
features/home/providers/home_provider.dart |
新增 _favoriteRefreshSub 监听收藏刷新事件;新增 _syncFavoriteStateFromDb() 批量同步句子收藏状态 |
[v6.82.0] - 2026-06-17
🐛 修复拾光栏配置开启后不实时更新 + 节气日历与实际日期不一致
Bug修复
- 拾光栏配置不实时更新:
_DisplayItemsSheet从StatelessWidget改为ConsumerWidget,内部直接ref.watch(dateDisplayProvider)监听配置变化,确保在子Sheet中切换开关后UI立即同步更新(之前子Sheet通过构造函数接收config快照,Provider更新后子Sheet无法感知) - 节气日期表排序错误:2025/2026年节气数据中小寒(1月)、大寒(1月)排在列表末尾,导致
getCurrentTerm()遍历时1月日期覆盖6月日期,6月17日错误返回大寒而非芒种。已将数据按年内时间顺序重排(小寒→大寒→立春→…→冬至) - 2026年雨水日期修正:2月18日 → 2月19日
- getCurrentTerm跨年边界:年初(1月1-4日)未到小寒时,取上一年最后一个节气(冬至),避免返回null
修改文件
| 文件 | 变更 |
|---|---|
features/solar_term/solar_term_core.dart |
节气日期表按时间顺序重排(小寒大寒移至年初);修正2026雨水日期(18→19);getCurrentTerm() 增加跨年边界处理 |
features/home/presentation/date_config_sheet.dart |
_DisplayItemsSheet 改为 ConsumerWidget,内部watch Provider实时更新;_showDisplayItemsSheet() 简化参数 |
[v6.81.0] - 2026-06-17
📱 软件信息页面 — 设备类型卡片增加系统版本号显示
功能描述
- 在软件信息页面的「设备信息」卡片中,设备类型后增加括号显示系统版本号
- 例如:桌面端 (macOS 15.0)、移动端 (Android 14)、移动端 (iOS 18.0)、桌面端 (Windows 10 (23H2))、移动端 (鸿蒙 5.0)、桌面端 (Linux 6.1)
- Web 端不显示系统版本(保持原有行为)
修改文件
| 文件 | 变更 |
|---|---|
core/services/device/device_info_service.dart |
新增 getSystemVersion() 异步方法,支持 Android/iOS/macOS/Windows/Linux/鸿蒙各平台系统版本获取;新增 _extractOhosVersion() 和 _extractKernelVersion() 辅助方法 |
features/profile/presentation/app_info_sections.dart |
DeviceInfoSection 新增 _systemVersion 状态和 _loadSystemVersion() 方法;设备类型 GridInfoItem 的 value 改为 $deviceType ($_systemVersion) 格式 |
[v6.80.0] - 2026-06-17
✨ 登录页新增「记住账户」功能
功能描述
- 登录页面密码登录模式下,新增「记住账户」复选框,勾选后登录成功会保存账户名
- 下次打开登录页时自动填充已保存的账户名并勾选「记住账户」
- 取消勾选后登录成功会清除已保存的账户信息
修改文件
| 文件 | 变更 |
|---|---|
l10n/types/t_auth.dart |
新增 rememberAccount 翻译键字段 |
l10n/languages/zh_cn.dart |
新增中文翻译:记住账户 |
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)
问题描述
- 应用商店审核发现:
androidx.glance.appwidgetSDK 在应用退出后触发自启动(1次/秒),无隐私文本覆盖 - 审核依据:《个人信息保护法》要求 APP 未向用户明示且未经用户同意,不得存在频繁自启动行为
- 根因:
home_widget包引入了androidx.glance:glance-appwidget:1.1.1依赖,项目未使用 Glance Widget 但该库被打包进 APK,其内部GlanceAppWidgetReceiver/GlanceAppWidgetService被系统广播触发导致自启动 - 次要问题: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协议守门机制形成完整闭环