스플래쉬 스크린과 자동로그인을 작업하던 와중에 스플래쉬 스크린에서 행이 걸려서 로그인이 안되는 일이 발생했다.
이 문제는 랜덤하게 발생했는데 찾아보니,
앱이 로드가 되지 않았는데 async function 을 사용하면 행이 걸린다는 것을 알게되었다.
dispatch_group_wait 에서 경고가 발생하며 앱이 로드 되지않고 roop를 타게 되면서 행이 발생한다.
해결방법은 async function 을 React native app 이 로드가 되었는지 확인을 한 후 로드를 했더니 해결되었다.
앱이 로드가 되었는지 확인하는 방법은 다음과 같다.
React native가 마운트 되었을 때 AppState를 사용하여 ApState.currentState 가 ‘active’인 경우 로그인 펑션을 작동 시켰더니 정상적으로 로드가 되었다.
import { createNavigationContainerRef, StackActions } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { useEffect } from 'react';
import { AppState } from 'react-native';
import { login, logout } from './services/Login';
import { getData } from './utils/AsyncService';
import LottieSplashScreen from 'react-native-lottie-splash-screen';
export const RootNavigator = ({children}) => {
....
const loginSuccessCallback = (responseUserInfo) => {
setTimeout(() => {
if(responseUserInfo.profileImage == 'undefined'){
navigate('RegisterUser', {screen:'RegisterUserNickname'});
}else{
replace('Home');
}
LottieSplashScreen.hide();
}, 1500);
};
///이메일 로그인 마무리 (애플로그인//구글로그인 회원가입 탈퇴까지)
const loginErrorCallback = () =>{
setTimeout(() => {
logout();
LottieSplashScreen.hide();
},1500);
};
const checkAuth = async () =>{
const auth = await getData('@auth');
if (auth != null){
login(auth, loginSuccessCallback, loginErrorCallback);
return;
}
setTimeout(() => {
LottieSplashScreen.hide();
}, 1500);
};
useEffect(() => {
if (AppState.currentState == 'active'){
checkAuth();
}
}, []);
....
}
지금은 코드가 appState를 참조하지 않고 로그인 기능이 완료 되었을 시점에 로띠스플래시스크린을 종료하는 방식으로 변경, 이유는 로딩 시간이 길어지기 때문.