Recode Log

  • tech-blog
  • apps
  • device
  • features
Copyright © [WebKBS]. All rights reserved.
  • tech-blog
  • apps
  • device
  • features
  1. Home
  2. issues
  3. Expo Prebuild 후 Xcode Localization이 초기화되는 문제 해결

Expo Prebuild 후 Xcode Localization이 초기화되는 문제 해결

Expo Prebuild를 실행할 때 Xcode의 Development Region이 en으로 돌아가는 원인과 config plugin으로 ko를 유지하는 방법을 정리합니다.

  • expo ~57.0.4
  • react-native 0.86.0
2026년 7월 14일

Expo 프로젝트에서 iOS 앱을 빌드하려고 Xcode를 열었을 때, Project → Info → Localizations의 기본 언어가 계속 English로 돌아가는 문제가 있었습니다.

Xcode에서 Korean을 추가하거나 Development Region을 한국어로 바꿔도, 다음에 npx expo prebuild를 실행하면 변경이 사라졌습니다. 이 글에서는 왜 이런 현상이 발생하는지와, Expo config plugin으로 Development Region을 ko로 고정하는 방법을 정리합니다.

문제 상황

Expo 프로젝트에서 iOS 네이티브 프로젝트를 생성한 뒤 Xcode에서 다음 항목을 직접 수정했습니다.

  • Project → Info → Localizations에서 Korean 추가
  • Development Region을 en에서 ko로 변경

하지만 다시 iOS 프로젝트를 생성하면 설정이 초기값으로 돌아갔습니다.

root directory
npx expo prebuild --platform ios

특히 --clean 옵션을 사용하면 기존 ios/ 폴더를 삭제하고 다시 만들기 때문에, Xcode에서 직접 수정한 내용은 확실히 사라집니다.

root directory
npx expo prebuild --platform ios --clean

원인: Prebuild가 Xcode 프로젝트를 다시 생성한다

Expo의 CNG(Continuous Native Generation) 구조에서 ios/, android/ 폴더는 app.json과 설치된 패키지를 바탕으로 생성되는 결과물입니다.

즉, ios/*.xcodeproj/project.pbxproj를 Xcode에서 직접 수정하는 방식은 유지 대상이 아닙니다. Prebuild가 다시 실행되면 새 Xcode 프로젝트가 만들어지고, 수동 변경은 덮어써집니다.

이 현상은 특정 앱만의 문제라기보다, Expo Prebuild/CNG를 쓰는 프로젝트에서 네이티브 설정을 직접 수정할 때 공통으로 생길 수 있는 특성입니다.

Expo 공식 문서도 CNG 프로젝트에서는 네이티브 파일을 직접 수정하기보다 config plugin으로 변경 사항을 적용하는 방식을 권장합니다.

`Expo Config Plugins 소개` `Expo Continuous Native Generation(CNG)`

해결 방법: 로컬 config plugin 만들기

withXcodeProject를 사용하는 로컬 config plugin을 만들면, Prebuild가 Xcode 프로젝트를 생성한 뒤 원하는 값을 자동으로 적용할 수 있습니다.

1. plugin 파일 만들기

프로젝트 루트에 plugins/with-ios-development-region.js 파일을 만듭니다.

plugins/with-ios-development-region.js
const { withXcodeProject } = require("@expo/config-plugins");
 
const DEVELOPMENT_REGION = "ko";
 
const withIosDevelopmentRegion = (config) =>
  withXcodeProject(config, (config) => {
    const project = config.modResults.getFirstProject().firstProject;
 
    project.developmentRegion = DEVELOPMENT_REGION;
    project.knownRegions = [DEVELOPMENT_REGION, "Base"];
 
    return config;
  });
 
module.exports = withIosDevelopmentRegion;

이 플러그인은 생성된 project.pbxproj의 다음 값을 변경합니다.

ios/*.xcodeproj/project.pbxproj
developmentRegion = ko;
knownRegions = (
  ko,
  Base,
);

2. app.json에 plugin 등록하기

app.json의 expo.plugins 배열에 로컬 플러그인 경로를 추가합니다.

app.json
{
  "expo": {
    "plugins": ["./plugins/with-ios-development-region", "expo-router"]
  }
}

기존에 등록된 플러그인은 지우지 않고 그대로 유지하면 됩니다.

3. iOS 프로젝트 다시 생성하기

root directory
npx expo prebuild --platform ios

이제 Prebuild를 다시 실행해도 Xcode 프로젝트에 ko가 적용됩니다.

적용 결과 확인하기

프로젝트 생성 후 ios/*.xcodeproj/project.pbxproj를 열어 아래 값이 있는지 확인합니다.

developmentRegion = ko;
knownRegions = (
  ko,
  Base,
);

Xcode에서도 파란색 프로젝트 아이콘을 선택한 뒤 PROJECT → Info → Localizations로 이동하면 한국어가 개발 리전으로 반영된 것을 확인할 수 있습니다.

CFBundleDevelopmentRegion만 설정하면 되지 않을까?

app.json에서 ios.infoPlist.CFBundleDevelopmentRegion 값을 ko로 넣는 방법도 생각할 수 있습니다.

app.json
{
  "expo": {
    "ios": {
      "infoPlist": {
        "CFBundleDevelopmentRegion": "ko"
      }
    }
  }
}

하지만 이 설정은 Info.plist의 값만 수정합니다. Xcode의 Project Localization 목록과 Development Region은 project.pbxproj에서 관리하므로, Xcode UI의 설정까지 일관되게 맞추려면 앞에서 만든 config plugin 방식이 더 확실합니다.

다국어 앱이라면

위 예시는 한국어만 지원하는 앱을 기준으로 knownRegions를 ko, Base만 남깁니다.

영어와 한국어를 함께 지원한다면 필요한 언어를 모두 유지해야 합니다.

project.knownRegions = ["ko", "en", "Base"];

또한 Development Region 설정은 Xcode 프로젝트의 기본 언어 설정일 뿐, React Native 화면의 문구를 자동으로 번역하지는 않습니다. 앱 내 다국어 처리는 expo-localization과 i18n 라이브러리로 별도로 구현해야 합니다.

정리

  • Expo Prebuild는 iOS 프로젝트를 다시 생성하므로 Xcode에서 직접 변경한 Localization 설정이 사라질 수 있습니다.
  • CNG 프로젝트에서는 네이티브 변경 사항을 config plugin으로 관리하는 것이 안전합니다.
  • withXcodeProject로 developmentRegion과 knownRegions를 수정하면, Prebuild 뒤에도 ko 설정을 유지할 수 있습니다.

다음글

Next.js Sentry Hydration 에러 해결


관련 태그

  • expo
  • react-native
  • ios
  • xcode
  • localization
  • config-plugin