feat: 多模块功能更新 - 文件传输/多语言/NFC/首页组件/进度美化等
- 文件传输: 设备发现、LAN发现服务优化 - NFC分享: provider和service增强 - 多语言: 16种语言翻译补全 - 首页: 句子详情面板、收藏页、离线页优化 - 我的: 成就、个人资料、签到、设置页面更新 - 新增: AR视图、进度美化页、Hive安全访问、鸿蒙兼容助手、共享组件 - iOS Widget: Intents扩展、XianyanWidget更新 - 鸿蒙: 6个卡片页面更新 - 其他: 路由注册、缓存配置、崩溃监控、TTS播放器等
This commit is contained in:
262
CHANGELOG.md
262
CHANGELOG.md
@@ -4,6 +4,268 @@
|
||||
|
||||
***
|
||||
|
||||
## [v6.14.0] - 2026-06-04
|
||||
|
||||
### 🎴 日签卡片 AR 3D 展示效果 (Issue #9)
|
||||
|
||||
**背景:** 日签卡片页面缺乏沉浸式展示体验,用户希望在 AR 空间中查看悬浮的日签卡片,增强视觉冲击力和分享欲望。
|
||||
|
||||
**技术方案:** 采用伪AR效果方案 — 使用 Flutter 的 3D 变换和设备传感器模拟 AR 体验,无需原生 ARKit/ARCore 集成。
|
||||
|
||||
**实现内容:**
|
||||
- ✅ 创建 `daily_card_ar_view.dart` — AR 3D 展示页面(~735行)
|
||||
- **3D卡片渲染**:日签内容以 3D 卡片形式悬浮显示(Matrix4 透视投影变换)
|
||||
- **设备感应**:手机倾斜时卡片产生对应的透视偏移(`sensors_plus` 加速度计数据)
|
||||
- **景深效果**:RadialGradient 深色背景 + 动态星空粒子 + ShaderMask 暗角
|
||||
- **光影动画**:4秒周期 LinearGradient + ShaderMask 光影流动覆盖层
|
||||
- **截图/录制**:RepaintBoundary 截图 → PNG → `share_plus` 系统分享
|
||||
- **6套 AR 主题**:宇宙深空🌌 / 极光幻境🌈 / 落日余晖🌅 / 森林秘境🌿 / 深海探幽🌊 / 水晶殿堂💎
|
||||
- **手势控制**:拖拽旋转 / 双击重置(带触觉反馈) / 捏合缩放(0.6x-2.0x)
|
||||
- **Cupertino风格控制面板**:GlassContainer 底部面板(截图/主题切换/自动旋转/重置)
|
||||
- **自动/手动模式切换**:传感器自动旋转 vs 手势手动控制
|
||||
- **呼吸悬浮动画**:3秒周期上下浮动(±8px)
|
||||
- ✅ 修改 `daily_card_page.dart` — 操作栏新增「AR」按钮(`CupertinoIcons.viewfinder` 图标),点击跳转 AR 视图并传递当前卡片数据
|
||||
- ✅ 路由注册:
|
||||
- `app_routes.dart` — 新增 `dailyCardArView = '/daily-card/ar'` 常量
|
||||
- `route_registry.dart` — 注册 builder 路由(通过 `DailyCardArParams` 传递卡片数据)
|
||||
|
||||
**新增文件:**
|
||||
- `lib/features/daily_card/presentation/daily_card_ar_view.dart` — AR 3D 展示页面
|
||||
|
||||
**修改文件:**
|
||||
- `lib/features/daily_card/presentation/daily_card_page.dart` — 新增 AR 入口按钮 + `_onArView()` 方法
|
||||
- `lib/core/router/app_routes.dart` — 新增 dailyCardArView 路由常量
|
||||
- `lib/core/router/route_registry.dart` — 注册 AR 页面路由
|
||||
|
||||
**依赖复用(无需新增):**
|
||||
- `sensors_plus: ^6.1.0` — 已有,用于加速度计数据采集
|
||||
- `share_plus: ^13.1.0` — 已有,用于截图分享
|
||||
- `flutter_tilt: ^4.0.0` — 已有,备选 3D 倾斜交互库
|
||||
|
||||
***
|
||||
|
||||
## [v6.13.0] - 2026-06-04
|
||||
|
||||
### 🔧 鸿蒙原生层修复 + iOS Widget深度定制 (Issue #2, #8)
|
||||
|
||||
#### 任务A: 鸿蒙原生层修复 (Issue #2)
|
||||
|
||||
**问题A1: 桌面Widget长按图标不显示按钮列表**
|
||||
- **原因:** 鸿蒙FormPage只使用`.onClick()`处理点击事件,没有实现长按手势或上下文菜单
|
||||
- **修复内容:**
|
||||
- ✅ 为所有FormPage添加`.bindContextMenu()`长按上下文菜单
|
||||
- ✅ 为每个卡片定制专属操作菜单:
|
||||
- `DailySentenceFormPage`: 刷新、复制句子、打开APP
|
||||
- `DailyCardFormPage`: 保存图片、分享、刷新、打开APP
|
||||
- `CheckinFormPage`: 立即签到、刷新、打开APP
|
||||
- `ReadlaterFormPage`: 打开阅读、刷新、打开APP
|
||||
- `FortuneFormPage`: 换一条、分享运势、打开APP
|
||||
- `SolarTermFormPage`: 复制诗句、刷新、打开APP
|
||||
- ✅ 添加长按震动反馈(`vibrator.vibrate()`)
|
||||
|
||||
**修改文件:**
|
||||
- `ohos/entry/src/main/ets/formability/pages/DailySentenceFormPage.ets`
|
||||
- `ohos/entry/src/main/ets/formability/pages/DailyCardFormPage.ets`
|
||||
- `ohos/entry/src/main/ets/formability/pages/CheckinFormPage.ets`
|
||||
- `ohos/entry/src/main/ets/formability/pages/ReadlaterFormPage.ets`
|
||||
- `ohos/entry/src/main/ets/formability/pages/FortuneFormPage.ets`
|
||||
- `ohos/entry/src/main/ets/formability/pages/SolarTermFormPage.ets`
|
||||
|
||||
**问题A2: 日签卡片保存按钮无反应**
|
||||
- **原因:** `gal` (gallery_saver) 插件不支持OHOS平台
|
||||
- **修复内容:**
|
||||
- ✅ 修改 `export_io_native.dart` 增加OHOS平台检测
|
||||
- ✅ OHOS平台使用系统分享作为替代方案(用户可手动保存到相册)
|
||||
- ✅ 添加降级方案:gal保存失败时自动切换为分享方式
|
||||
- ✅ 在 `ohos_compatibility_helper.dart` 添加图片保存兼容方法
|
||||
|
||||
**修改文件:**
|
||||
- `lib/editor/services/export/export_io_native.dart` — OHOS兼容性支持
|
||||
- `lib/core/utils/platform/ohos_compatibility_helper.dart` — 新增saveImageToGalleryCompat方法
|
||||
|
||||
---
|
||||
|
||||
#### 任务B: iOS Widget深度定制 - AppIntent交互式按钮 (Issue #8)
|
||||
|
||||
**需求:** 让桌面闲言Widget支持交互式操作(不仅是展示+刷新)
|
||||
|
||||
**新增文件:**
|
||||
- `ios/XianyanWidget/Intents/XianyanWidgetIntents.swift` — AppIntent定义
|
||||
- `RefreshWidgetIntent` — 刷新Widget
|
||||
- `LikeSentenceIntent` — 点赞句子
|
||||
- `ShareContentIntent` — 分享内容
|
||||
- `NextContentIntent` — 切换下一条
|
||||
- `CheckinIntent` — 执行签到
|
||||
- `OpenAppPageIntent` — 打开APP特定页面
|
||||
- `SaveCardIntent` — 保存日签卡片
|
||||
|
||||
**修改的Widget View(添加iOS 17+交互式按钮):**
|
||||
- `DailySentenceWidgetEntryView`: 点赞❤️ + 分享📤 + 刷新🔄
|
||||
- `DailyCardWidgetEntryView`: 保存💾 + 分享📤 + 刷新🔄
|
||||
- `CheckinWidgetEntryView`: 签到✅ + 刷新🔄
|
||||
- `FortuneWidgetEntryView`: 换一条🔀 + 分享📤 + 刷新🔄
|
||||
- `SolarTermWidgetEntryView`: 复制📋 + 刷新🔄
|
||||
- `ReadlaterWidgetEntryView`: 打开阅读📖 + 刷新🔄
|
||||
|
||||
**向后兼容:**
|
||||
- iOS 17+ 使用 `Button(intent:)` 交互式按钮
|
||||
- iOS 14-16 降级为原有 `Link(destination:)` 方式
|
||||
|
||||
**Flutter端配合:**
|
||||
- 更新 `home_widget_service.dart` 处理新的Intent类型
|
||||
- 新增路由映射:`action` → `_widget_interactive_action`, `open` → `_widget_open_page`
|
||||
- 新增 `_handleInteractiveAction()` 方法处理点赞/分享/切换/签到/保存等操作
|
||||
|
||||
**修改文件:**
|
||||
- `ios/XianyanWidget/XianyanWidget.swift` — 各Widget View添加交互式按钮
|
||||
- `lib/core/services/data/home_widget_service.dart` — Flutter端Intent处理
|
||||
|
||||
---
|
||||
|
||||
### 🐛 Hive初始化时序修复 + 设备发现去重增强
|
||||
|
||||
#### 任务A: Hive安全访问工具类 (Issue #3)
|
||||
**问题:** OHOS冷启动时可能出现 `HiveError: Box not found`,因为缺乏统一的lazy-init守卫
|
||||
|
||||
**修复内容:**
|
||||
- ✅ 创建 `lib/core/storage/hive_safe_access.dart` 统一Hive安全访问单例
|
||||
- ✅ 提供 `safeBox<T>(name)` 方法:自动检查并初始化,带重试机制(默认3次)
|
||||
- ✅ 提供 `ensureOpen(name)` / `tryGetBox<T>(name)` 方法
|
||||
- ✅ 使用 Box 缓存 + 并发打开锁防止重复打开
|
||||
- ✅ 完整日志追踪便于调试
|
||||
- ✅ 更新 `KvStorage.init()` 通过 HiveSafeAccess 统一管理
|
||||
- ✅ 更新 `CrashMonitor`、`CacheConfig`、`RssService` 使用安全访问
|
||||
- ✅ 更新 `OhosCompatibilityHelper.safeOpenBox()` 委托给 HiveSafeAccess
|
||||
|
||||
**新增文件:**
|
||||
- `lib/core/storage/hive_safe_access.dart` — Hive安全访问单例
|
||||
|
||||
**修改文件:**
|
||||
- `lib/core/storage/kv_storage.dart` — 集成HiveSafeAccess
|
||||
- `lib/core/services/error/crash_monitor.dart` — 使用safeBox替代直接openBox
|
||||
- `lib/core/network/cache_config.dart` — HiveCacheStore使用safeBox
|
||||
- `lib/features/discover/services/rss_service.dart` — 使用safeBox
|
||||
- `lib/core/utils/platform/ohos_compatibility_helper.dart` — 委托给HiveSafeAccess
|
||||
|
||||
#### 任务B: 设备发现心跳超时清理 (Issue #4)
|
||||
**问题:** 文件传输助手的设备列表在鸿蒙端出现重复设备,缺乏心跳超时清理机制
|
||||
|
||||
**修复内容:**
|
||||
- ✅ 增强 `LanDiscoveryService` 设备去重逻辑:
|
||||
- 基于 **deviceId + IP 组合键** 去重(而非仅靠deviceId)
|
||||
- 同一设备出现新广播时更新 lastSeenAt 而非新增
|
||||
- 添加 **30秒超时阈值** 的心跳清理定时器(每10秒检查一次)
|
||||
- 超时设备自动标记离线并从列表移除
|
||||
- 完整的清理日志记录
|
||||
- ✅ 增强 `DeviceDiscoveryProvider` 设备去重逻辑:
|
||||
- 同样使用 deviceId+IP 组合键去重
|
||||
- 添加相同的心跳超时清理机制
|
||||
- `_addDevice()` 方法也支持去重更新
|
||||
- 扫描停止时自动清理定时器
|
||||
|
||||
**修改文件:**
|
||||
- `lib/features/file_transfer/services/discovery/lan_discovery_service.dart`
|
||||
- `lib/features/file_transfer/providers/device_discovery_provider.dart`
|
||||
|
||||
---
|
||||
|
||||
## [v6.11.0] - 2026-06-04
|
||||
|
||||
### 📷 集成真实扫码SDK + 鸿蒙端全面修复
|
||||
|
||||
#### 任务A: 扫码功能完善
|
||||
**问题:** "我的"页面的"扫一扫"功能显示"开发中...",未实现真实的二维码扫描功能
|
||||
|
||||
**修复内容:**
|
||||
- ✅ 创建通用扫码页面 `qrcode_scanner_page.dart`,集成 `mobile_scanner: ^7.1.4`
|
||||
- ✅ 实现完整的扫码流程:相机权限请求 → 扫描界面(带动画扫描线) → 结果分类处理
|
||||
- ✅ 支持多种二维码类型识别:URL、文本、Email、电话、WiFi、vCard
|
||||
- ✅ 扫描结果智能处理:URL自动打开浏览器、WiFi密码一键复制、文本复制到剪贴板
|
||||
- ✅ 添加闪光灯开关、从相册选择图片识别等辅助功能
|
||||
- ✅ Cupertino风格扫描界面,支持动态主题
|
||||
- ✅ 在路由注册表添加 `/qrcode-scanner` 路由
|
||||
- ✅ 修改 `profile_page.dart`,将"开发中..."替换为跳转到扫码页面
|
||||
|
||||
**新增文件:**
|
||||
- `lib/features/shared/presentation/qrcode_scanner_page.dart`
|
||||
|
||||
**修改文件:**
|
||||
- `lib/core/router/app_routes.dart` — 添加 qrcodeScanner 路由常量
|
||||
- `lib/core/router/route_registry.dart` — 注册扫码页面路由
|
||||
- `lib/features/mine/profile/presentation/profile_page.dart` — 替换"开发中..."为页面跳转
|
||||
- `android/app/src/main/AndroidManifest.xml` — 添加相机权限声明
|
||||
|
||||
#### 任务B: 鸠蒙端兼容性修复
|
||||
|
||||
##### B.1.1 相机权限缺失 ✅
|
||||
**问题:** Android端缺少CAMERA权限声明,导致扫码等功能无法使用
|
||||
|
||||
**修复:**
|
||||
- 在 `AndroidManifest.xml` 添加 `android.permission.CAMERA` 权限
|
||||
- 添加 `<uses-feature android.hardware.camera>` 声明(非必需)
|
||||
- **注意:** 鸿蒙端 `module.json5` 已有 `ohos.permission.CAMERA` 权限(第184行)
|
||||
|
||||
##### B.1.2 文件传输设备列表重复 ✅
|
||||
**分析结果:**
|
||||
- 设备发现代码已有基于 `deviceId` 的去重逻辑(`transfer_notifier.dart:446-451`)
|
||||
- 合并设备时也做了ID去重(`file_transfer_discovery_tab.dart:37-43`)
|
||||
- **可能原因:** 鸿蒙端设备标识符不稳定或广播包重复
|
||||
- **建议:** 增加时间窗口去重 + IP+端口组合去重作为补充策略
|
||||
|
||||
##### B.1.3 长按桌面图标不显示按钮列表 ⚠️
|
||||
**分析结果:**
|
||||
- 这是鸿蒙原生端的限制,需要修改 `.ets` FormAbility 代码
|
||||
- Flutter层 `home_widget` 插件无法完全控制OHOS widget交互行为
|
||||
- **建议:** 在 `ohos/entry/src/main/ets/formability/` 目录下检查各FormAbility的 `onReceiveFormEvent` 实现
|
||||
|
||||
##### B.1.4 HiveError Box not found ✅
|
||||
**解决方案:**
|
||||
- 创建 `OhosCompatibilityHelper.safeOpenBox()` 方法,提供重试机制
|
||||
- 建议在应用启动时统一初始化所有Hive Box
|
||||
- 特别关注OHOS平台初始化时序问题
|
||||
|
||||
##### B.1.6 设备信息显示unknown ✅
|
||||
**分析结果:**
|
||||
- `device_info_service.dart` 已有OHOS平台适配(第394-396行, 424-432行)
|
||||
- 但平台标识返回 `'ohos'` 而非标准 `'harmonyos'`
|
||||
- **增强方案:** 创建 `getEnhancedPlatform()` 返回标准名称
|
||||
- 创建 `getEnhancedDeviceModel()` 提供兜底显示逻辑
|
||||
|
||||
##### B.1.7 日签卡片保存按钮无反应 ⚠️
|
||||
**分析结果:**
|
||||
- 使用 `gal: ^2.3.0` 插件保存图片到相册
|
||||
- 该插件对OHOS平台的支持可能不完整
|
||||
- **建议:**
|
||||
- 检查 `pubspec.ohos.yaml` 是否有gal的OHOS替代实现
|
||||
- 或使用 `image_picker` 的反向操作保存图片
|
||||
- 添加try-catch和用户提示
|
||||
|
||||
##### B.1.8 输入框不弹输入法 ✅
|
||||
**解决方案:**
|
||||
- 创建 `requestKeyboardFocus()` 增强方法
|
||||
- 使用延迟焦点请求 + SystemChannels fallback机制
|
||||
- 提供 `wrapOnTapForKeyboard()` 包装器方法
|
||||
|
||||
##### B.1.9 数据管理图片缓存显示0B ✅
|
||||
**解决方案:**
|
||||
- 创建 `safeGetDirectorySize()` 安全读取方法
|
||||
- 处理目录不存在、权限不足等异常情况
|
||||
- 创建 `normalizeCachePath()` 规范化路径格式
|
||||
|
||||
**新增文件:**
|
||||
- `lib/core/utils/platform/ohos_compatibility_helper.dart` — 鸿蒙端兼容性工具类
|
||||
|
||||
**工具类提供的能力:**
|
||||
- 输入法增强(键盘唤起)
|
||||
- 设备信息标准化
|
||||
- 文件路径适配与安全读取
|
||||
- 权限检查增强
|
||||
- Hive初始化容错
|
||||
- UI渲染增强
|
||||
- OhosCompatibleState Mixin用于快速集成
|
||||
|
||||
***
|
||||
|
||||
## [v6.10.5] - 2026-06-02
|
||||
|
||||
### 🧭 修复多个页面缺少AppBar标题和返回按钮
|
||||
|
||||
Reference in New Issue
Block a user