Files
xianyan/lib/core/services/post_agreement_initializer.dart
Developer 544f77c0ce chore: 完成v2.4.7版本迭代更新
本次更新包含多项功能优化与兼容性修复:
1. iOS/鸿蒙端添加加密出口合规配置,跳过App Store审核问卷
2. 新增学习计划设置页路由与国际化支持
3. 修复鸿蒙端剪贴板粘贴不工作问题,安装标准剪贴板拦截器
4. 优化收藏功能:兼容复合ID、添加状态同步与触觉反馈
5. 修复鸿蒙端相册保存兼容性,统一使用系统分享降级方案
6. 优化搜索快捷方式跳转逻辑,避免白屏问题
7. 更新本地化资源,新增闲情逸致、学习计划等模块翻译
8. 修复节气日期表排序与跨年边界问题
9. 优化设备信息页面显示,新增系统版本号展示
10. 重构文件传输二维码逻辑,使用纯URL提升兼容性
11. 优化设置项布局,避免文本溢出问题
12. 修复登录页记住账户功能,新增隐私协议守卫
13. 更新macOS依赖库,替换flutter_secure_storage为darwin版本
2026-06-17 08:45:34 +08:00

178 lines
5.6 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ============================================================
// 闲言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;
}
}