TL;DR

  • Firebase Analytics SDK 12.14.0이 sdk-exp 응답을 처리한 직후 iOS 앱에서 발생하는 충돌이 여러 출시 빌드에서 급증함.
  • 2026년 9월 29일 00:41 UTC부터 첫 18분 동안 사용자 56명에게서 충돌 56건이 보고됐으며, 앱 업데이트는 배포되지 않음.
  • 확인된 충돌 42건 모두 https://app-analytics-services.com/sdk-exp에 대한 HTTP 200 응답 직후 발생함.
  • 예외는 -[__NSDictionaryM setObject:forKeyedSubscript:]: key cannot be nil이며, 실험 응답이 nil 키로 파싱되는 문제일 가능성이 제기됨.
  • 재현 여부는 서버 응답에 달려 있으며, Firebase 팀은 문제를 인지하고 조사 중임.

문제 설명

  • 2026년 9월 29일 00:41 UTC부터 프로덕션 iOS 앱의 충돌이 증가함. 첫 18분 동안 사용자 56명에게서 충돌 56건이 발생했으며, 앱 업데이트는 배포되지 않은 상태임.
  • 이미 출시된 4개 빌드에서 같은 시각에 충돌이 시작됨.
  • 예외 유형은 NSInvalidArgumentException이며, 오류 메시지는 -[__NSDictionaryM setObject:forKeyedSubscript:]: key cannot be nil임.
  • 조사한 충돌 42건 모두 https://app-analytics-services.com/sdk-exp에 대한 POST 요청이 HTTP 200 응답을 받은 직후 발생함.
  • 충돌 시점에 APMExperimentWorkerQueue가 응답을 처리 중이며, 호출 흐름은 다음과 같음.
  • -[GULMutableDictionary dictionary]
  • -[APMEExperiment copyWithZone:]
  • -[APMESnapshot initWithSDKName:experiments:]
  • -[APMESnapshot initWithProtobuf:]
  • -[APMETaskManager experimentSnapshotsFromExperimentResponse:]
  • -[APMETaskManager handleFetchingExperimentsResponse:data:error:]
  • __35-[APMETaskManager fetchExperiments]_block_invoke
  • 충돌 스레드에는 _dispatch_call_block_and_release에서 -[__NSDictionaryM setObject:forKeyedSubscript:]로 이어지는 호출만 표시됨. GULMutableDictionary setObject:forKeyedSubscript:가 dispatch_async를 통해 쓰기 작업을 수행해 호출자의 스택 프레임이 남지 않는 현상과 부합함.
  • 보고 내용은 00:41 UTC부터 제공된 실험 페이로드가 nil 키로 파싱되는 것으로 보인다며, sdk-exp 설정을 확인하고 롤백해 달라고 요청함.

재현 방법 및 환경

  • 재현 여부는 서버 응답에 따라 달라짐. 앱을 실행하면 SDK가 sdk-exp를 가져오고, 1초 이내에 앱이 충돌함.
  • Firebase SDK 버전: 12.14.0
  • Xcode 버전: 26.5
  • 설치 방식: Swift Package Manager
  • Firebase 제품: Analytics
  • 대상 플랫폼: iOS

Firebase 팀의 답변

팀이 문제를 인지하고 조사 중임.

  • 이슈는 2026년 9월 29일에 열렸으며, api: analytics, priority: p0 라벨이 지정됨.