Flyleaf - 독서를 여행처럼/트러블슈팅

[트러블슈팅] 01. FirebaseAuth Auth.auth() 크래시 - Firebase 중복 링크 문제

여성일 2026. 3. 8. 22:28
728x90

문제 상황

Apple 로그인 이후 Firebase Auth 연동 시 아래와 같은 런타임 크래시가 발생했습니다.

FirebaseAuth/Auth.swift:168: Fatal error: Unexpectedly found nil while unwrapping an Optional value

문제 접근

1. Firebase configure가 정상적으로 되지 않았을 수 있다.

초기에는 Auth.auth().signIn(with:) 호출 시점에 크래시가 발생했기 때문에, 가장 먼저 Firebase 초기화(FirebaseApp.configure())가 정상적으로 수행되지 않은 것을 의심했습니다.

 

Firebase Auth는 기본적으로 FirebaseApp.configure()가 선행되어야 동작하므로, 초기에는 다음과 같은 가능성을 우선적으로 확인했습니다.

 

1. GoogleService-Info.plist가 올바르게 포함되지 않았는지

2. 번들 ID와 Firebase 프로젝트 설정이 일치하지 않는지

3. FirebaseApp.configure()가 실제로 호출되지 않았는지

4. Auth.auth()가 configure() 이전에 먼저 실행되는지

 

확인 과정

if let app = FirebaseApp.app() {
  print("Firebase configured")
  print("AppID: \(app.options.googleAppID)")
  print("ProjectID: \(app.options.projectID ?? "")")
  print("BundleID: \(Bundle.main.bundleIdentifier ?? "")")
}

- AppDelegate에서 FirebaseApp.configure() 직후 로그를 출력하여 초기화 여부를 검증

 

결과

로그를 통해 아래 항목을 확인했습니다.

- FirebaseApp 생성 성공

- AppID 정상 출력

- ProjectID 정상 출력

- BundleID 일치

즉, Firebase 초기화 자체는 정상적으로 수행되고 있었고, GoogleService-Info.plist 누락이나 configure 미호출 문제는 아니라는 결론에 도달했습니다.


2. Apple Login 구현 로직 문제일 수 있다.

다음으로는 FirebaseAuth가 아닌 Apple 로그인 연동 과정을 의심했습니다.

 

1. identityToken이 정상적으로 내려오는지

2. rawNonce가 올바르게 생성/전달 되는지

3. OAuthProvider.appleCredential(...) 생성 과정에 문제가 없는지

4. payload 변환 과정에서 nil 값이 들어가는 부분은 없는지

 

확인 과정

- identityToken 문자열 변환 로그 출력

- rawNonce 생성 및 request.nonce 설정 확인

- FirebaseAuthService 내부에서 FirebaseApp.app() != nil 여부 재확인

 

결과

- identityToken 정상

- rawNonce 정상

- FirebaseApp.app()도 true로 정상

- payload 변환 정상

 

즉, Apple Login 결과값이나 ViewModel/Service 계층 로직 자체도 직접적인 원인이 아니었습니다.


3. FirebaseAuth 모듈 링크 문제일 수 있다.

FirebaseApp.configure()는 정상이고, FirebaseApp.app()도 존재하는데, Auth.auth() 진입 시점에만 크래시가 난다는 점에서 단순 설정 문제가 아니라 FirebaseAuth가 런타임에 제대로 로드되지 않았을 가능성을 의심하게 되었습니다.

 

특히 Tuist + 모듈 구조에서 외부 프레임워크를 사용할 때는 정상적으로 빌드되더라도 Objective-C 기반 심볼/카테고리 로딩 문제로 인해 런타임에서만 드러나는 경우가 있습니다. 

 

이 시점부터는 Firebase 설정 문제가 아니라 링커 설정 쪽 문제로 범위를 좁혀 디버깅했습니다.

 

확인 과정

- FirebaseAuth 프레임워크 링크 여부 확인

- 링커 설정 확인

 

결과

- FirebaseAuth 프레임워크는 정상적으로 링크되어 있음.

 

즉, 단순한 프레임워크 누락 문제는 아닌 것으로 판단했습니다. 


해결

 

Technical Q&A QA1490: Building Objective-C static libraries with categories

Technical Q&A QA1490 Building Objective-C static libraries with categories Q:  How do I fix "selector not recognized" runtime exceptions when trying to use category methods from a static library? A: If you're seeing a "selector not recognized" runtime exc

developer.apple.com

 

Apple 문서에 따르면 Objective-C 카테고리를 포함한 static library는 링커가 자동으로 로드하지 않을 수 있으며, 이 경우 -ObjC 옵션을 통해 해당 심볼을 강제로 로드해야 한다고 나와있습니다.

 

Firebase iOS SDK는 내부적으로 Objective-C 기반 코드와 카테고리를 포함하고 있기 때문에 - ObjC가 설정되지 않으면 다음과 같은 현상이 발생할 수 있습니다.

컴파일 단계
-> import 가능

링크 단계
-> 실제 바이너리 연결

런타임
-> symbol resolve

 

- 빌드는 정상적으로 완료됨

- Firebase 초기화도 정상적으로 수행됨

- 특정 API 호출 시점에 런타임 크래시 발생

 

이번 케이스에서도 동일하게 FirebaseAuth 내부 코드가 런타임에 완전히 로드되지 않아 크래시가 발생한 상황이었습니다.

 

해결 방법

Firebase 공식 가이드

App 타겟 설정에 아래 옵션을 추가하여 문제를 해결했습니다.

base: [
  "OTHER_LDFLAGS": "$(inherited) -ObjC"
]

옵션 추가 이후 Auth.ath().signIn(with:) 호출 시 발생하던 FirebaseAuth 런타임 크래시가 정상적으로 해결되는 것을 확인했습니다.


레퍼런스

https://stackoverflow.com/questions/37175284/compile-and-runtime-failures-when-importing-interfaces-with-category-extensions

 

https://developer.apple.com/library/archive/qa/qa1490/_index.html

 

https://beefdev.blogspot.com/2012/02/ios-run-time-error-when-using-class.html

 

https://firebase.google.com/docs/ios/setup?hl=ko