구글 로그인 관련 트러블 슈팅
- 구글 로그인 구현하다 iOS 시뮬레이터에서 Google 로그인이 되지 않고 비정상적인 오류로 시뮬레이터가 종료되는 현상이 있었음.
- 위의 오류 해결하고서 로그인 성공시 바로 홈 화면으로 넘어가지않고 로그인 페이지에서 로그인을 한번 더 눌러야 넘어가지는 현상 수정.
1. iOS에서 Google 로그인이 되지 않던 문제
1. 증상
- 앱이 예기치 않게 종료되거나 콘솔에 별다른 에러 없이 실패
- Google 로그인 버튼을 눌러도 아무 반응이 없음
2. 원인
- Info.plist 파일에 URL scheme 등록 누락
- Xcode Clean Build 미실행으로 이전 빌드 캐시가 남아 있었음
- GoogleService-Info.plist가 제대로 포함되지 않거나 Bundle Identifier 불일치
3. 시도한 해결 방법
GoogleService-Info.plist를 Xcode 프로젝트에 직접 추가하고 Target > Build Phases > Copy Bundle Resources에 포함되었는지 확인
- Firebase 콘솔에 등록된 iOS Bundle ID가 실제 프로젝트와 일치하는지 확인
- Info.plist에 아래와 같은 항목을 추가
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>com.googleusercontent.apps.xxxxxxxxxxxx</string>
</array>
</dict>
</array>
- 위의 문자열은 GoogleService-Info.plist 파일의
REVERSED_CLIENT_ID 값을 그대로 사용함
- Xcode에서 Product > Clean Build Folder 실행 (
Shift + Command + K)
- 시뮬레이터에서 앱 삭제 후 재설치 및 실행
4. 최종 해결
- Info.plist에 올바른 URL scheme 추가
- Clean Build 후 실행
- Google 로그인이 정상적으로 동작함
2. Google 로그인 후 자동으로 홈 화면으로 이동하지 않는 문제
1. 증상
- 로그인 성공 후 홈 화면으로 자동 전환되지 않음
- 로그인 성공 메시지는 보이지만 버튼을 한 번 더 눌러야 전환됨
- 또는 화면을 터치해야 홈 화면이 나타남
2. 원인
- 로그인 후 사용자 인증을 기다리기 위해
authStateChanges().firstWhere()를 사용했으나, 비동기 흐름의 타이밍 이슈로 UI 반영이 지연됨
WidgetsBinding.instance.addPostFrameCallback() 안에서 Navigator.pushReplacement()를 호출함으로써 프레임 타이밍 충돌 발생
3. 시도한 해결 방법
authStateChanges().firstWhere() 사용하여 로그인 완료 감지
addPostFrameCallback() 안에서 Navigator.pushReplacement() 호출
4. 최종 해결
userCredential.user를 직접 확인하여 인증 완료 여부 판단
addPostFrameCallback() 제거
if (!mounted) return; 체크 후 즉시 Navigator.pushReplacement() 호출
- 로그인 후 한 번의 클릭으로 홈 화면 전환이 정상적으로 이루어짐
5. 코드 예시 (정상 동작 방식)
if (!mounted) return;
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (_) => const MyHomePage()),
);
3. 요약
| 항목 | 문제 요약 | 해결 방법 요약 |
|---|
| iOS에서 Google 로그인 실패 | Info.plist 설정 누락, GoogleService-Info 미포함 | <CFBundleURLTypes> 추가 및 Clean Build |
| 로그인 후 자동 전환 안됨 | 인증 감지 타이밍 및 Navigator 호출 시점 문제 | addPostFrameCallback 제거 후 Navigator.pushReplacement 직접 호출 |