本次更新包含多项功能优化与兼容性修复: 1. iOS/鸿蒙端添加加密出口合规配置,跳过App Store审核问卷 2. 新增学习计划设置页路由与国际化支持 3. 修复鸿蒙端剪贴板粘贴不工作问题,安装标准剪贴板拦截器 4. 优化收藏功能:兼容复合ID、添加状态同步与触觉反馈 5. 修复鸿蒙端相册保存兼容性,统一使用系统分享降级方案 6. 优化搜索快捷方式跳转逻辑,避免白屏问题 7. 更新本地化资源,新增闲情逸致、学习计划等模块翻译 8. 修复节气日期表排序与跨年边界问题 9. 优化设备信息页面显示,新增系统版本号展示 10. 重构文件传输二维码逻辑,使用纯URL提升兼容性 11. 优化设置项布局,避免文本溢出问题 12. 修复登录页记住账户功能,新增隐私协议守卫 13. 更新macOS依赖库,替换flutter_secure_storage为darwin版本
178 lines
5.6 KiB
Dart
178 lines
5.6 KiB
Dart
// ============================================================
|
||
// 闲言APP — 协议同意后初始化器
|
||
// 创建时间: 2026-05-30
|
||
// 更新时间: 2026-06-16
|
||
// 作用: 将权限敏感的服务初始化延迟到用户同意协议后执行
|
||
// 上次更新: 新增HapticService初始化(Vibrate.canVibrate触发原生插件),
|
||
// 确保未同意协议前不触发震动/传感器等原生插件
|
||
// ============================================================
|
||
|
||
import 'dart:io';
|
||
|
||
import 'package:app_tracking_transparency/app_tracking_transparency.dart';
|
||
|
||
import '../storage/kv_storage.dart';
|
||
import '../utils/logger.dart';
|
||
import '../utils/platform/platform_utils.dart' as pu;
|
||
import '../router/app_router.dart' show rootNavigatorKey;
|
||
import 'auth/token_refresh_watcher.dart';
|
||
import 'auth/permission_service.dart';
|
||
import 'device/haptic_service.dart';
|
||
import 'network/connectivity_service.dart';
|
||
import 'background/background_task_service.dart';
|
||
import 'notification/local_notification_service.dart';
|
||
import 'device/screen_wake_service.dart';
|
||
import 'device/battery_optimization_service.dart';
|
||
import 'notification/readlater_reminder_service.dart';
|
||
import 'data/home_widget_service.dart';
|
||
import 'readlater/sharing_receiver_service.dart';
|
||
import '../../features/discover/services/chat_migration_service.dart';
|
||
import '../../features/template/services/wallpaper_health_service.dart';
|
||
|
||
class PostAgreementInitializer {
|
||
PostAgreementInitializer._();
|
||
|
||
static bool _initialized = false;
|
||
|
||
static bool get isInitialized => _initialized;
|
||
|
||
static Future<void> init() async {
|
||
if (_initialized) return;
|
||
|
||
Log.i('PostAgreementInitializer: 开始初始化权限敏感服务...');
|
||
|
||
// 触觉反馈服务初始化(Vibrate.canVibrate会触发flutter_vibrate原生插件)
|
||
try {
|
||
await HapticService.init();
|
||
Log.i('触觉反馈服务初始化完成');
|
||
} catch (e, st) {
|
||
Log.e('触觉反馈服务初始化失败', e, st);
|
||
}
|
||
|
||
// iOS ATT授权请求(必须在协议同意后、其他服务初始化前请求)
|
||
// 先检查当前授权状态,仅在未决定时请求,避免Info.plist缺少描述时原生崩溃
|
||
if (Platform.isIOS) {
|
||
try {
|
||
final status =
|
||
await AppTrackingTransparency.trackingAuthorizationStatus;
|
||
if (status == TrackingStatus.notDetermined) {
|
||
final authorized =
|
||
await PermissionService.requestTrackingPermission();
|
||
Log.i('iOS ATT授权结果: ${authorized ? "已授权" : "未授权"}');
|
||
} else {
|
||
Log.i('iOS ATT已授权状态: $status,跳过请求');
|
||
}
|
||
} catch (e, st) {
|
||
Log.e('iOS ATT授权请求失败', e, st);
|
||
}
|
||
}
|
||
|
||
if (!pu.isWeb) {
|
||
try {
|
||
SharingReceiverService().init();
|
||
SharingReceiverService().setNavigatorKey(rootNavigatorKey);
|
||
Log.i('分享接收服务初始化完成');
|
||
} catch (e, st) {
|
||
Log.e('分享接收服务初始化失败', e, st);
|
||
}
|
||
}
|
||
|
||
if (!pu.isWeb) {
|
||
try {
|
||
await LocalNotificationService.init();
|
||
Log.i('本地通知服务初始化完成');
|
||
} catch (e, st) {
|
||
Log.e('本地通知服务初始化失败', e, st);
|
||
}
|
||
}
|
||
|
||
if (!pu.isWeb) {
|
||
try {
|
||
await ScreenWakeService.init();
|
||
Log.i('屏幕常亮服务初始化完成');
|
||
} catch (e, st) {
|
||
Log.e('屏幕常亮服务初始化失败', e, st);
|
||
}
|
||
}
|
||
|
||
if (!pu.isWeb) {
|
||
try {
|
||
await BatteryOptimizationService.init();
|
||
Log.i('电池优化服务初始化完成');
|
||
} catch (e, st) {
|
||
Log.e('电池优化服务初始化失败', e, st);
|
||
}
|
||
}
|
||
|
||
if (!pu.isWeb) {
|
||
try {
|
||
await ReadlaterReminderService.startMonitoring();
|
||
Log.i('稍后读提醒服务初始化完成');
|
||
} catch (e, st) {
|
||
Log.e('稍后读提醒服务初始化失败', e, st);
|
||
}
|
||
}
|
||
|
||
try {
|
||
await ChatMigrationService.migrateIfNeeded();
|
||
Log.i('聊天数据迁移检查完成');
|
||
} catch (e, st) {
|
||
Log.e('聊天数据迁移检查失败', e, st);
|
||
}
|
||
|
||
if (!pu.isWeb) {
|
||
try {
|
||
await HomeWidgetService.instance.init();
|
||
Log.i('桌面小组件服务初始化完成');
|
||
} catch (e, st) {
|
||
Log.e('桌面小组件服务初始化失败', e, st);
|
||
}
|
||
}
|
||
|
||
// 剪贴板监控服务已改为被动触发模式,不在此初始化
|
||
// 仅在用户主动操作时(如打开稍后读页面)才检查剪贴板
|
||
|
||
if (!pu.isWeb) {
|
||
try {
|
||
await ConnectivityService.init();
|
||
Log.i('网络状态检测服务初始化完成');
|
||
} catch (e, st) {
|
||
Log.e('网络状态检测服务初始化失败', e, st);
|
||
}
|
||
}
|
||
|
||
// Token续期监听器(依赖ConnectivityService,必须在其之后启动)
|
||
try {
|
||
TokenRefreshWatcher.startWatching();
|
||
Log.i('Token续期监听器启动完成');
|
||
} catch (e, st) {
|
||
Log.e('Token续期监听器启动失败', e, st);
|
||
}
|
||
|
||
if (!pu.isWeb) {
|
||
try {
|
||
await BackgroundTaskService.instance.init();
|
||
Log.i('后台任务服务初始化完成');
|
||
} catch (e, st) {
|
||
Log.e('后台任务服务初始化失败', e, st);
|
||
}
|
||
}
|
||
|
||
try {
|
||
if (WallpaperHealthService.shouldCheck()) {
|
||
await WallpaperHealthService.checkAllSources();
|
||
Log.i('壁纸源健康检测完成');
|
||
}
|
||
} catch (e, st) {
|
||
Log.e('壁纸源健康检测启动检查失败', e, st);
|
||
}
|
||
|
||
_initialized = true;
|
||
Log.i('PostAgreementInitializer: 所有权限敏感服务初始化完成 ✓');
|
||
}
|
||
|
||
static bool shouldInit() {
|
||
return KvStorage.isOnboardingCompleted && !_initialized;
|
||
}
|
||
}
|