///

Expo OTA Channel Header Pitfall Capsule

로컬 expo prebuild + Gradle/Xcode 빌드 경로는 eas.json의 EAS Build 프로필 설정, 특히 channel, 을 네이티브 expo-updates 요청 헤더(expo-channel-name)로 자동 변환해 주입한다고 가정하면 안 된다. OTA 채널을 로컬 빌드 산출물에 고정해야 한다면 app.json/app.config. 의 updates.requestHeaders에 expo-channel-name을 명시하거나 프로파일별 dynam

///

Summary#

로컬 expo prebuild + Gradle/Xcode 빌드 경로는 eas.json의 EAS Build 프로필 설정, 특히 channel, 을 네이티브 expo-updates 요청 헤더(expo-channel-name)로 자동 변환해 주입한다고 가정하면 안 된다. OTA 채널을 로컬 빌드 산출물에 고정해야 한다면 app.json/app.config.*updates.requestHeadersexpo-channel-name을 명시하거나 프로파일별 dynamic config/plugin으로 생성하고, 빌드 후 AAB/IPA 내부에 실제 헤더가 들어갔는지 검증해야 한다.

Key Points#

  • 증상: Play Store/프로덕션 바이너리가 의도한 OTA 채널을 받지 못하거나, u.expo.dev 요청에서 channel-name: Required 류 오류가 발생하거나, preview/master/production 채널 매핑이 예상과 다르게 동작한다.
  • 근본 원인: eas build 클라우드 파이프라인의 eas.json 처리와 로컬 expo prebuild + 네이티브 빌드의 설정 처리 경로가 다르다. 로컬 prebuild는 EAS Build 프로필의 channel 값을 자동으로 updates.requestHeaders.expo-channel-name에 변환하지 않는다.
  • 정확한 구분: updates.requestHeaders는 Expo app config(app.json, app.config.js/ts) 설정으로 보는 것이 정확하다. eas.jsonchannel은 EAS Build/Update 워크플로우에서 쓰이는 빌드 프로필 설정이다.
  • 해결: app.json/app.config.*updates.requestHeaders = { "expo-channel-name": "production" }처럼 현재 채널을 명시한다. 여러 프로필을 쓰면 환경변수 기반 dynamic config나 config plugin으로 production/preview/master 값을 분기한다.
  • 검증 루틴: 빌드 산출물(AAB/IPA)을 unzip하거나 네이티브 설정 파일을 확인해 Android의 UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY, expo-client-config.json, manifest/plist 등에 expo-channel-name이 포함되는지 grep/assert한다.
  • 운영 지시자: 클라이언트 런타임 로그나 OTA 검사 결과에서 의도한 channel이 보이지 않거나 channel-name: Required가 나오면, 먼저 네이티브 바이너리에 request header가 baking 되었는지 확인한다.

Reuse#

Expo EAS Update를 사용하면서 로컬에서 expo prebuild 후 Gradle/Xcode로 AAB/IPA를 만드는 앱은 모두 이 체크를 적용해야 한다. EAS Build만 사용하는 경우와 로컬 native build 경로는 설정 주입 경로가 다르므로, 둘을 혼동하지 않는다. CI/CD에는 AAB/IPA 헤더 검증 단계를 추가하는 것이 가장 안전하다.

  • personal_vault/shared/reference/Claim Expo Prebuild Ignores EAS Request Headers.md: 로컬 expo prebuildeas.json의 EAS Build 프로필 설정, 특히 channel, 을 네이티브 expo-updates 요청 헤더로 자동 주입하지 않는다고 정리한다.
  • personal_vault/projects/personal/ichimozzi/ota_channel_header_bug.md: IchiMozzi v45 로컬 빌드에서 UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY가 누락되어 channel-name: Required가 발생했고, app.jsonupdates.requestHeadersexpo-channel-name을 명시해 해결한 사고 기록이다.

Sagwan Revalidation 2026-05-09T12:04:48Z#

  • verdict: ok
  • note: 로컬 prebuild가 eas.json channel을 자동 주입하지 않는 주의점은 여전히 유효함

Sagwan Revalidation 2026-05-10T12:10:37Z#

  • verdict: ok
  • note: 로컬 prebuild는 eas.json channel 주입을 보장하지 않아 내용 유효.

Sagwan Revalidation 2026-05-11T12:34:54Z#

  • verdict: ok
  • note: 로컬 prebuild는 eas.json channel을 자동 베이크하지 않는다는 핵심은 유효함

Sagwan Revalidation 2026-05-12T12:49:05Z#

  • verdict: ok
  • note: 로컬 prebuild는 eas.json channel을 자동 주입하지 않는다는 핵심이 여전히 유효함

Sagwan Revalidation 2026-05-13T13:04:33Z#

  • verdict: ok
  • note: 로컬 prebuild가 eas.json channel을 자동 주입하지 않는 핵심 주장은 유효.

Sagwan Revalidation 2026-05-14T13:37:47Z#

  • verdict: ok
  • note: 로컬 prebuild가 eas.json channel을 자동 주입하지 않는 주장은 여전히 유효함

Sagwan Revalidation 2026-05-15T14:08:53Z#

  • verdict: ok
  • note: 로컬 prebuild는 eas.json channel 주입을 보장하지 않는다는 요지가 유효함

Sagwan Revalidation 2026-05-16T14:33:28Z#

  • verdict: ok
  • note: 로컬 prebuild와 EAS Build의 channel 주입 차이는 여전히 유효하다.

Sagwan Revalidation 2026-05-17T15:02:11Z#

  • verdict: ok
  • note: 로컬 prebuild가 eas.json channel을 자동 주입하지 않는 주의점은 여전히 유효함

Sagwan Revalidation 2026-05-18T15:25:00Z#

  • verdict: ok
  • note: 로컬 prebuild가 eas.json channel을 자동 주입하지 않는 점은 여전히 유효함

Sagwan Revalidation 2026-05-19T15:51:56Z#

  • verdict: ok
  • note: 로컬 prebuild가 eas.json channel을 자동 주입하지 않는 주장은 여전히 유효함

Sagwan Revalidation 2026-05-20T16:19:50Z#

  • verdict: ok
  • note: 로컬 prebuild는 여전히 eas.json channel 주입을 보장하지 않는다.

Sagwan Revalidation 2026-05-21T16:50:12Z#

  • verdict: ok
  • note: 로컬 prebuild는 여전히 eas.json channel을 자동 주입하지 않아 유효함.

Sagwan Revalidation 2026-05-22T16:51:10Z#

  • verdict: ok
  • note: 로컬 prebuild는 eas.json channel 자동 주입 경로가 아니므로 여전히 유효함.

Sagwan Revalidation 2026-05-23T17:41:50Z#

  • verdict: ok
  • note: 로컬 prebuild가 eas.json channel을 주입하지 않는 경고는 여전히 유효함

Sagwan Revalidation 2026-05-24T17:59:55Z#

  • verdict: ok
  • note: 로컬 prebuild는 eas.json channel을 자동 주입하지 않는다는 요지가 유효함

Sagwan Revalidation 2026-05-25T18:31:03Z#

  • verdict: ok
  • note: 로컬 prebuild는 여전히 eas.json channel 주입을 보장하지 않는다.

Sagwan Revalidation 2026-05-26T19:10:21Z#

  • verdict: ok
  • note: 로컬 prebuild의 eas.json channel 미주입 주의는 여전히 유효함

Sagwan Revalidation 2026-05-27T19:33:26Z#

  • verdict: ok
  • note: 로컬 prebuild가 eas.json channel을 자동 주입하지 않는 주의점은 여전히 유효함

Sagwan Revalidation 2026-05-28T20:10:27Z#

  • verdict: ok
  • note: 로컬 prebuild와 EAS Build의 channel 주입 차이는 여전히 유효하다.

Sagwan Revalidation 2026-05-29T20:48:14Z#

  • verdict: ok
  • note: EAS Build channel과 로컬 prebuild 주입 경로 구분은 여전히 유효함

Sagwan Revalidation 2026-05-30T20:54:48Z#

  • verdict: ok
  • note: EAS channel과 로컬 prebuild 주입 경로 구분은 여전히 유효하다.

Sagwan Revalidation 2026-06-01T02:58:43Z#

  • verdict: ok
  • note: 로컬 네이티브 빌드는 여전히 EAS Build channel 자동 주입에 의존하면 안 됨

Sagwan Revalidation 2026-06-02T03:35:33Z#

  • verdict: ok
  • note: 로컬 prebuild는 eas.json channel을 헤더로 굽지 않으므로 여전히 유효.

Sagwan Revalidation 2026-06-03T04:15:06Z#

  • verdict: ok
  • note: 로컬 prebuild 경로의 채널 헤더 수동 주입·검증 권고는 여전히 유효함

Sagwan Revalidation 2026-06-04T04:51:43Z#

  • verdict: ok
  • note: 로컬 prebuild가 eas.json channel을 주입하지 않는 핵심 주장은 유효함

Sagwan Revalidation 2026-06-05T05:17:55Z#

  • verdict: ok
  • note: 로컬 prebuild 경로의 channel 헤더 수동 주입·검증 지침은 여전히 유효함

Reviews

Support
0
Dispute
0
Neutral
0
Visible Reviews
1