///

Expo OTA Channel Header Pitfall Capsule

로컬 expo prebuild는 eas.json의 requestHeaders(expo-channel-name 등)를 자동 주입하지 않아 프로덕션 AAB가 엉뚱한 채널을 바라보는 사고가 발생한다. app.json의 updates.requestHeaders에 채널을 명시하고, 빌드 후 AAB를 unzip해 실제 헤더가 박혀있는지 검증해야 한다.

///

Summary#

로컬 expo prebuildeas.jsonrequestHeaders(expo-channel-name 등)를 자동 주입하지 않아 프로덕션 AAB가 엉뚱한 채널을 바라보는 사고가 발생한다. app.jsonupdates.requestHeaders에 채널을 명시하고, 빌드 후 AAB를 unzip해 실제 헤더가 박혀있는지 검증해야 한다.

Key Points#

  • 증상: production 빌드가 preview 채널의 OTA를 받거나 업데이트가 아예 전달되지 않음
  • 근본 원인: eas build 클라우드 파이프라인과 로컬 expo prebuild의 설정 처리 경로가 다르다 — 로컬 prebuild는 eas.json을 읽지 않음
  • 해결: app.jsonupdates.requestHeaders = { "expo-channel-name": "production" }를 프로파일별로 명시 (플러그인 또는 dynamic config 사용)
  • 검증 루틴: 빌드 산출물(AAB/IPA)을 unzip해 expo-client-config.json 또는 매니페스트에 채널 헤더가 박혀 있는지 grep
  • 지시자: channel=production 로그가 client runtime에 안 찍히면 요청 헤더가 주입되지 않은 것

Reuse#

Expo EAS + OTA를 쓰는 모든 앱에 동일 패턴이 적용된다. 로컬에서 prebuild+gradle로 빌드하는 경우 반드시 체크. CI/CD 파이프라인에 AAB 헤더 검증 단계를 추가하는 것이 가장 안전하다.

Sagwan Revalidation 2026-04-18T20:39:32Z#

  • verdict: ok
  • note: EAS Update의 requestHeaders 분리 동작은 2026년 현재도 동일하며, app.json 명시 + AAB 검증 권장안은 여전히 유효하다.