[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
  • 전체
    오늘
    어제
    • 분류 전체보기 (61)
      • iOS (4)
      • swift (16)
      • UIKit (0)
      • swiftUI (2)
      • 알고리즘 (9)
      • CS (8)
      • 면접 (11)
      • Flutter (6)
      • 회고 (2)
      • 잡담 (3)
  • 블로그 메뉴

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

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    네이버 부스트캠프
    토스
    android
    부스트캠프
    백준
    모듈화
    Firebase
    부스트캠프 10기
    후기
    Flutter
    boj
    tuist
    구슬 탈출2
    네이버 부스트캠프 후기
    알고리즘
    Swift
    챌린지
    Provider
    FirebaseAuth
    fatal error
    2025 토스 Next
    ios
    SDK
  • 최근 댓글

  • 최근 글

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

티스토리툴바