[swift] FirebaseAuth/Auth.swift:168: Fatal error: Unexpectedly found nil while unwrapping an Optional value(Tuist)

2025. 8. 28. 12:59·swift

🚨 문제 상황

Tuist를 사용하여 iOS 프로젝트를 구성하고 Firebase Auth를 연동할 때, 다음과 같은 런타임 크래시가 발생했습니다.

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

또는

void * _Nullable NSMapGet(NSMapTable * _Nonnull, const void * _Nullable): map table argument is NULL

이 문제는 Firebase가 정상적으로 초기화되었음에도 불구하고, Auth 인스턴스에 접근할 때 발생하는 오류입니다.

🔍 문제 분석

시도했던 해결 방법들

  1. Firebase 초기화 시점 조정
  2. // AppDelegate.init()에서 더 이른 시점에 초기화 override init() { super.init() FirebaseApp.configure() }
  3. 지연 시간 추가
  4. // Firebase Auth 접근 전 충분한 대기 시간 try await Task.sleep(nanoseconds: 2_000_000_000)
  5. 안전한 Auth 인스턴스 생성
  6. // 다양한 방법으로 Auth 인스턴스 생성 시도 let auth = Auth.auth(app: firebaseApp)

하지만 이 모든 방법들로도 문제가 해결되지 않았습니다.

실제 원인 발견

문제의 핵심은 Objective-C 링커 플래그였습니다.

Firebase SDK는 내부적으로 Objective-C 코드와 카테고리(Categories)를 광범위하게 사용합니다. Swift 프로젝트에서 이런 Objective-C 라이브러리를 사용할 때, 적절한 링커 플래그가 없으면 다음과 같은 문제가 발생합니다:

  • Objective-C 카테고리가 제대로 로드되지 않음
  • 런타임에 메서드나 프로퍼티가 예상치 못하게 nil이 됨
  • NSMapTable 등의 Objective-C 객체가 제대로 초기화되지 않음

✅ 해결 방법

Tuist Project.swift 설정

Firebase를 사용하는 모든 타겟에 -ObjC 링커 플래그를 추가해야 합니다

// Projects/App/Project.swift
import ProjectDescription

let project = Project(
    name: "AppName",
    targets: [
        .target(
            name: "AppName",
            destinations: .iOS,
            product: .app,
            bundleId: "com.example.appname",
            sources: ["Sources/**"],
            resources: ["Resources/**"],
            dependencies: [
                .external(name: "FirebaseCore"),
                .external(name: "FirebaseAuth")
            ],
            settings: .settings(
                base: ["OTHER_LDFLAGS": "$(inherited) -ObjC"]  // 핵심
            )
        ),
        .target(
            name: "YourAppTests",
            destinations: .iOS,
            product: .unitTests,
            bundleId: "com.example.appname.tests",
            dependencies: [.target(name: "AppName")],
            settings: .settings(
                base: ["OTHER_LDFLAGS": "$(inherited) -ObjC"]  // 테스트 타겟도 포함
            )
        )
    ]
)

Tuist에서 Firebase Auth를 직접 사용하는 모듈들에도 똑같이 적용시켜줍니다.

📚 참고 자료

  • Firebase iOS SDK GitHub
  • Tuist Documentation
  • Apple Developer - Linking Objective-C Libraries

🎉 결론

Tuist와 Firebase Auth를 함께 사용할 때는 반드시 -ObjC 링커 플래그를 추가해야 합니다.

'swift' 카테고리의 다른 글
  • [swift] Tuist 겉핥기
  • [swift] 위치 권한 설정
  • [swift] RxSwift란?
  • [swift] ARC
GwanSon
GwanSon
버그는 도전, 코드는 해결. 열정있는 개발을 하자.
  • GwanSon
    관슨의 개발일지
    GwanSon
  • 전체
    오늘
    어제
    • 분류 전체보기 (57)
      • iOS (3)
      • swift (16)
      • UIKit (0)
      • swiftUI (2)
      • 알고리즘 (8)
      • CS (8)
      • 면접 (11)
      • Flutter (4)
      • 회고 (2)
      • 잡담 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Firebase
    부스트캠프 10기
    후기
    ios
    tuist
    백준
    boj
    토스
    부스트캠프
    챌린지
    fatal error
    네이버 부스트캠프
    네이버 부스트캠프 후기
    FirebaseAuth
    Swift
    모듈화
    2025 토스 Next
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
GwanSon
[swift] FirebaseAuth/Auth.swift:168: Fatal error: Unexpectedly found nil while unwrapping an Optional value(Tuist)
상단으로

티스토리툴바