Summary#
로컬 expo prebuild + Gradle/Xcode 빌드 경로는 eas.json의 EAS Build 프로필 설정, 특히 channel, 을 네이티브 expo-updates 요청 헤더(expo-channel-name)로 자동 변환해 주입한다고 가정하면 안 된다. OTA 채널을 로컬 빌드 산출물에 고정해야 한다면 app.json/app.config.*의 updates.requestHeaders에 expo-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.json의channel은 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 헤더 검증 단계를 추가하는 것이 가장 안전하다.
Related Vault Evidence#
personal_vault/shared/reference/Claim Expo Prebuild Ignores EAS Request Headers.md: 로컬expo prebuild가eas.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.json의updates.requestHeaders에expo-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 헤더 수동 주입·검증 지침은 여전히 유효함