Communitygithub.com

Expo 앱 스토어 배포

EAS를 사용하여 iOS 및 Android 앱을 빌드하고 TestFlight, App Store 또는 Google Play에 제출합니다. Expo 및 기타 React Native 프로젝트와 기존 네이티브 앱을 지원합니다.

Expo 앱 스토어 배포란 무엇인가요?

이 스킬은 EAS(Expo Application Services)를 사용하여 iOS 및 Android 앱을 빌드하고 앱 스토어에 제출하는 전체 프로세스를 다룹니다. Expo 및 React Native 프로젝트뿐만 아니라 SwiftUI/UIKit과 같은 기존 네이티브 앱도 지원합니다. 개발자는 이 스킬을 통해 EAS CLI 설치, eas.json 설정, 자동 버전 관리, TestFlight 및 App Store/Google Play 제출, CI/CD 워크플로우 구성까지 표준화된 배포 파이프라인을 구축할 수 있습니다. 네이티브 iOS 설정, 인증서 관리, 앱 메타데이터 최적화, 그리고 빌드 모니터링을 위한 상세 참조 문서도 함께 제공됩니다. 특히 `references/` 디렉토리 내의 문서들이 워크플로우, TestFlight 제출, 앱 스토어 메타데이터, Play Store 제출, iOS 앱 스토어 제출, 네이티브 iOS 설정 등 각 영역별 심층 가이드를 제공하여 실제 배포 과정에서 발생하는 다양한 문제를 해결할 수 있도록 돕습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/expo/skills/tree/HEAD/plugins/expo/skills/eas-app-stores

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

앱 스토어 배포

EAS 서비스 - 비용이 발생합니다. 클라우드 빌드는 EAS 플랜 리소스를 사용하며, EAS 서비스에는 무료 티어 및 유료 플랜 제한이 있습니다. Apple Developer 및 Google Play 멤버십은 별도입니다. 요청된 서비스에 대한 자세한 내용은 https://expo.dev/pricing 를 확인하세요.

이 스킬은 EAS를 사용한 iOS 및 Android 앱 빌드 및 릴리스(Expo 및 기타 React Native 프로젝트, 기존 네이티브 앱 포함)를 다룹니다. EAS는 전달 서비스입니다. 네이티브 앱은 런타임에 Expo나 React Native를 추가하지 않고도 EAS를 사용할 수 있습니다. 네이티브 설정 워크스루는 현재 iOS의 SwiftUI/UIKit을 다룹니다.

프로젝트 경로 선택

  • React Native 런타임이 없는 SwiftUI/UIKit 앱: 빌드 구성을 변경하기 전에 references/native-ios.md를 읽으세요. Xcode 프로젝트와 Swift 코드를 앱의 소스 기준으로 유지하세요. 아래의 Expo/React Native 퀵스타트 및 개발 클라이언트 예제는 이 경로에 적용되지 않습니다.
  • React Native 런타임이 없는 네이티브 Android 앱: 기존 네이티브 빌드 설정을 유지하세요. 제출에 대해서는 references/play-store.md를 참조하세요. Swift/iOS 설정 지침은 적용되지 않습니다. 전용 네이티브 Android 설정 워크스루는 아직 포함되지 않았습니다.
  • Expo/React Native 앱: 아래의 퀵스타트를 사용한 다음 관련 스토어 참조를 따르세요.
  • 기존 네이티브 앱에 React Native 화면 추가: 해당 통합에는 expo-brownfield를 사용하고, 배포를 위해 여기로 돌아오세요.

초기 네이티브 iOS 설정 시, 버전 관리, 번들 ID 또는 아이콘을 변경한 후, 또는 거부된 업로드를 진단할 때 references/native-ios.md의 아카이브 및 아이콘 검사를 사용하세요. 일상적인 릴리스는 EAS 빌드/제출 흐름과 references/testflight.md의 처리 및 가용성 검사를 따릅니다. 성공적인 EAS 빌드 또는 대기 중인 제출이 Apple 승인, 테스터 액세스 또는 App Store 릴리스를 의미하지는 않습니다.

참조

필요에 따라 다음 리소스를 참고하세요:

  • ./references/workflows.md -- 자동화된 스토어 릴리스 및 PR 프리뷰를 위한 CI/CD 워크플로우
  • ./references/testflight.md -- 베타 테스트를 위해 iOS 빌드를 TestFlight에 제출
  • ./references/app-store-metadata.md -- App Store 메타데이터 관리 및 ASO 최적화
  • ./references/play-store.md -- Android 빌드를 Google Play 스토어에 제출
  • ./references/ios-app-store.md -- iOS App Store 제출 및 리뷰 프로세스
  • ./references/native-ios.md -- Expo 런타임 없이 네이티브 Swift/SwiftUI/UIKit 설정, 버전 관리 및 아카이브 확인

Expo / React Native 퀵스타트

EAS CLI 설치

npm install -g eas-cli
eas login

EAS 초기화

npx eas-cli@latest init

eas init는 EAS 프로젝트를 연결하거나 생성합니다. eas build:configure를 실행하여 eas.json에 빌드 프로필을 생성하세요. 릴리스 설정이 이미 존재하는 경우 기존 프로젝트 및 스토어 식별자를 유지하세요.

빌드 명령어

프로덕션 빌드

# iOS App Store 빌드
npx eas-cli@latest build -p ios --profile production

# Android Play Store 빌드
npx eas-cli@latest build -p android --profile production

# 두 플랫폼 모두
npx eas-cli@latest build --profile production

스토어에 제출

# iOS: 빌드 및 App Store Connect에 제출
npx eas-cli@latest build -p ios --profile production --auto-submit

# Android: 빌드 및 Play 스토어에 제출
npx eas-cli@latest build -p android --profile production --auto-submit

# Expo / React Native iOS TestFlight 바로가기
npx testflight

웹 및 API 라우트 호스팅

Expo 웹사이트 또는 Expo Router API 라우트를 EAS Hosting(npx expo export -p web 다음 eas deploy)에 배포하는 것은 eas-hosting 스킬에서 다룹니다. 이 스킬은 네이티브 앱 스토어 릴리스에 중점을 둡니다.

EAS 구성

Expo / React Native 프로젝트 예시(네이티브 Swift 프로필은 references/native-ios.md에 있음):

{
  "cli": {
    "version": ">= 16.0.1",
    "appVersionSource": "remote"
  },
  "build": {
    "production": {
      "autoIncrement": true,
      "ios": {
        "resourceClass": "m-medium"
      }
    },
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    }
  },
  "submit": {
    "production": {
      "ios": {
        "appleId": "[email protected]",
        "ascAppId": "1234567890"
      },
      "android": {
        "serviceAccountKeyPath": "./google-service-account.json",
        "track": "internal"
      }
    }
  }
}

플랫폼별 가이드

iOS

  • 네이티브 Swift 앱의 경우 references/native-ios.md의 명시적 빌드/제출 흐름을 사용하세요.
  • Expo / React Native 앱의 경우 npx testflight로 빠른 TestFlight 흐름을 사용할 수 있습니다.
  • eas credentials를 통해 Apple 자격 증명을 구성하세요.
  • 자격 증명 설정은 ./references/testflight.md를 참조하세요.
  • App Store 제출은 ./references/ios-app-store.md를 참조하세요.

Android

  • Google Play Console 서비스 계정을 설정하세요.
  • 트랙 구성: 내부 → 비공개 → 오픈 → 프로덕션
  • 자세한 설정은 ./references/play-store.md를 참조하세요.

자동화된 릴리스

EAS 워크플로우는 CI/CD를 위한 빌드 → 제출 → 업데이트 파이프라인을 자동화합니다. 스토어 릴리스 예제는 ./references/workflows.md를 참조하세요. 워크플로우 YAML을 작성하거나 검증하려면 eas-workflows 스킬을 사용하세요. 라이브 워크플로우 스키마에서 작동합니다.

버전 관리

EAS는 appVersionSource: "remote"를 사용하여 버전 번호를 자동으로 관리합니다:

# 현재 버전 확인
eas build:version:get

# 수동으로 버전 설정
eas build:version:set -p ios

버전 설정 명령은 값을 입력하라는 메시지를 표시합니다. 네이티브 iOS 버전 관리를 설정하거나 변경할 때, 또는 중복 빌드 번호를 진단할 때 보관된 CFBundleVersion을 검사하세요. 원격 카운터만으로는 Xcode에서 사용되었다는 증거가 되지 않습니다.

모니터링

# 최근 빌드 목록
eas build:list

# 빌드 상태 확인
eas build:view BUILD_ID

# 제출 내역 확인 (EAS CLI 23.2.0에서 검증됨)
eas submit:list -p ios --json
eas submit:view SUBMISSION_ID --json

명령어가 누락된 경우 CLI 버전을 확인하세요. 이러한 제출 명령어는 23.2.0에서 사용 가능하지만 테스트된 18.6.0 설치에서는 사용할 수 없습니다. 고정된 npx [email protected] 호출을 사용하면 전역 설치를 변경하지 않고도 사용할 수 있습니다. 실시간 Apple 상태 및 재시도 지침은 references/testflight.md를 참조하세요. JSON 결과에 근본적인 실패 원인이 누락된 경우 반환된 로그 URL을 따르세요. 정확한 빌드 ID/버전과 확인된 가장 최근 릴리스 상태를 보고하세요.

피드백 제출

이 스킬에서 오류, 오해의 소지가 있거나 오래된 정보를 발견하면 Expo가 개선할 수 있도록 보고해 주세요:

npx --yes @expo/agent-cli@latest feedback --category skills --subject "eas-app-stores" "<실행 가능한 피드백>"

보고할 구체적이고 실행 가능한 내용이 있을 때만 제출하세요. 가능한 한 많은 관련 컨텍스트를 포함하세요.

에이전트가 Expo 작업에서 반복적으로 실패하거나 사용자가 개입해야 하는 경우, 작업, 예상 결과, 그리고 무엇이 잘못되었는지에 대한 간략한 보고서를 --category evals 및 관련 Expo 패키지 또는 명령어를 --subject로 사용하여 제출하세요.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

expo/add-app-clip

Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.

expo/building-native-ui

Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.

expo/eas-update-insights

Check the health of published EAS Updates: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health.

expo/expo-api-routes

Guidelines for creating API routes in Expo Router with EAS Hosting

expo/expo-brownfield

Integrate Expo and React Native into an existing native iOS or Android app. Use when the user mentions brownfield, embedding React Native in a native app, AAR/XCFramework, or adding Expo to an existing Kotlin/Swift project. Covers both the isolated approach and the integrated approach.

expo/expo-cicd-workflows

Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.

expo/expo-deployment

Deploying Expo apps to iOS App Store, Android Play Store, web hosting, and API routes

expo/expo-dev-client

Build and distribute Expo development clients locally or via TestFlight

expo/expo-examples

Framework (OSS). Expo's official example projects - the expo/examples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia, NativeWind, and more). Use when integrating a third-party library or service into an existing Expo app and you want the canonical, version-matched pattern to adapt, or when scaffolding a new project from one with `npx create-expo --example`.

expo/expo-module

Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo.

expo/expo-observe

Use for anything related to EAS Observe — adding `expo-observe` to an Expo project (AppMetricsRoot/ObserveRoot HOC, markInteractive, the useObserve hook, and the Expo Router / React Navigation integrations for per-route metrics), querying via the EAS CLI (`eas observe:metrics-summary`, `observe:metrics`, `observe:routes`, `observe:events`, `observe:versions`), or interpreting the resulting metrics (cold/warm launch, TTR, TTI, navigation cold/warm TTR, update download, and the TTI frameRate params for triaging slow startups).

expo/expo-overview

Framework (OSS). Entry point and router for every Expo or EAS task. Load this skill first — before writing code and before choosing another expo-* / eas-* skill — when the request, PRD, or spec mentions Expo, EAS, Expo Go, or an expo-* package, or the project has an `expo` dependency in `package.json`. Within that gate it also covers app specs and designs to implement (tabs, stacks, maps, lists, navigation, building from a screenshot), and phrasings like 'implement a mobile app', 'make my app look native', 'add navigation', 'fetch some data', 'upgrade my SDK', 'add Expo to my existing native app', 'ship to the App Store', or 'I'm new to Expo, where do I start'. A fully specified request (SDK pinned, libraries named, layout given) still routes through here — the shared setup rules still apply. Do NOT load it when neither signal is present: a bare React Native project with no `expo` dependency is not Expo work. Detects the real goal, routes to the right expo-* / eas-* skill, and owns the shared setup rules.

expo/expo-router

Framework (OSS). Navigation and routing for Expo Router. Covers file-based routes, groups and dynamic routes, folder organization, Link with previews and context menus, native Stack, page titles, modals and form sheets, NativeTabs, headers and toolbars, and header search bars.

expo/expo-skill-eval

Evaluate Expo skills in this repo end-to-end - trigger accuracy, generated code quality, and runtime screenshots on iOS simulator and Android emulator via Expo Go (web optional). Use when the user wants to eval an Expo skill, test that a skill produces working code, benchmark a skill with device screenshots, or verify a skill's output renders correctly.

expo/expo-tailwind-setup

Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling

expo/expo-ui

Framework (OSS). Build native UI with the @expo/ui package: real SwiftUI on iOS and Jetpack Compose on Android. Default to @expo/ui for sheets (BottomSheet), pickers, sliders, toggles, menus, and grouped-form sections — do NOT reach for Reanimated, @gorhom/bottom-sheet, or RN built-in Picker/Switch; use @expo/ui instead. Fall back to RN built-ins only when @expo/ui is missing the component. NOTE: @expo/ui List renders native grouped rows like an iOS Settings screen — it is NOT a virtualized list; use FlatList/FlashList for large datasets. Covers universal components (Host, Column, Row, Button, Text, List, BottomSheet, FieldGroup, Switch, Slider, Picker, Menu), drop-in replacements for RN community libraries, and platform-specific SwiftUI/Jetpack Compose trees. Not for Expo Router navigation, Reanimated, or data fetching.

expo/expo-ui-jetpack-compose

`@expo/ui/jetpack-compose` package lets you use Jetpack Compose Views and modifiers in your app.

expo/expo-ui-swiftui

`@expo/ui/swift-ui` package lets you use SwiftUI Views and modifiers in your app.

expo/expo-upgrade

Framework (OSS). Guidelines for upgrading Expo SDK versions and fixing dependency issues

expo/native-data-fetching

Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, and Expo Router data loaders (`useLoaderData`).

관련 스킬