refactor(init): 优化应用初始化流程,将权限请求延迟到引导完成后
- 将服务初始化拆分为基础服务和权限相关服务两个阶段 - 基础服务(用户数据、HealthKit初始化、快捷动作等)在应用启动时立即执行 - 权限相关服务(通知、HealthKit权限请求)仅在用户完成引导流程后才执行 - 在Redux store中添加onboardingCompleted状态管理 - 引导页面完成时通过Redux更新状态而非直接操作AsyncStorage - 启动页面从预加载数据中读取引导完成状态,避免重复读取存储 - 使用ref防止权限服务重复初始化
This commit is contained in:
@@ -6,9 +6,6 @@ import { preloadUserData } from '@/store/userSlice';
|
||||
import { router } from 'expo-router';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { ActivityIndicator, View } from 'react-native';
|
||||
import AsyncStorage from '@/utils/kvStore';
|
||||
import { STORAGE_KEYS } from '@/services/api';
|
||||
const ONBOARDING_COMPLETED_KEY = STORAGE_KEYS.onboardingCompleted;
|
||||
|
||||
export default function SplashScreen() {
|
||||
const backgroundColor = useThemeColor({}, 'background');
|
||||
@@ -22,27 +19,28 @@ export default function SplashScreen() {
|
||||
|
||||
const checkOnboardingStatus = async () => {
|
||||
try {
|
||||
// 先预加载用户数据,这样进入应用时就有正确的 token 状态
|
||||
console.log('开始预加载用户数据...');
|
||||
await preloadUserData();
|
||||
console.log('用户数据预加载完成');
|
||||
// 先预加载用户数据,包括 onboarding 状态
|
||||
console.log('开始预加载用户数据(包含 onboarding 状态)...');
|
||||
const userData = await preloadUserData();
|
||||
console.log('用户数据预加载完成,onboarding 状态:', userData.onboardingCompleted);
|
||||
|
||||
// 初始化推送通知(不阻塞应用启动)
|
||||
console.log('开始初始化推送通知...');
|
||||
// 初始化推送通知(不阻塞应用启动,且不会请求权限)
|
||||
console.log('开始初始化推送通知基础服务...');
|
||||
initializePushNotifications().catch((error) => {
|
||||
console.warn('推送通知初始化失败,但不影响应用正常使用:', error);
|
||||
});
|
||||
|
||||
const onboardingCompleted = await AsyncStorage.getItem(ONBOARDING_COMPLETED_KEY);
|
||||
|
||||
if (onboardingCompleted === 'true') {
|
||||
// 根据预加载的状态决定跳转
|
||||
if (userData.onboardingCompleted) {
|
||||
console.log('用户已完成引导,跳转到统计页面');
|
||||
router.replace(ROUTES.TAB_STATISTICS);
|
||||
} else {
|
||||
console.log('用户未完成引导,跳转到引导页面');
|
||||
router.replace(ROUTES.ONBOARDING);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('检查引导状态或预加载用户数据失败:', error);
|
||||
// 如果出现错误,仍然进入应用,但可能会有状态更新
|
||||
// 如果出现错误,默认进入主应用(假设已完成引导)
|
||||
router.replace(ROUTES.TAB_STATISTICS);
|
||||
}
|
||||
setIsLoading(false);
|
||||
|
||||
Reference in New Issue
Block a user