iOS 앱을 테스터에게 배포하려면 TestFlight(내부 테스터는 즉시, 외부 테스터는 짧은 Beta App Review 후 가능)를 사용하거나 등록된 기기를 위한 ad hoc 빌드를 사용하세요. Android의 경우 Google Play 테스트 트랙(내부, 비공개 또는 공개), 일회성 링크를 위한 Play 내부 앱 공유, 또는 Firebase App Distribution이나 직접 다운로드를 통해 서명된 APK를 공유할 수 있습니다. 어떤 방식이 적합한지는 테스터의 유형과 인원수, 그리고 스토어 인프라를 거쳐야 하는지 여부에 따라 달라집니다.
이 가이드에서는 모든 옵션을 비교하고, Capacitor 앱을 위한 각 설정 방법을 보여주며, 테스터가 흔히 겪는 오류들을 정리했습니다.
방법 선택
| 메서드 | 플랫폼 | 최대 테스터 수 | 테스터 배포 전 검토 | 테스터 요구 사항 | 추천 대상 |
|---|---|---|---|---|---|
| TestFlight 내부 테스트 | iOS | 팀원 100명 | 아니요 | App Store Connect 계정, TestFlight 앱 | 팀 구성원 |
| TestFlight 외부 테스터 | iOS | 10,000 | 베타 앱 심사 (버전 첫 빌드 시) | 이메일 초대 또는 공개 링크, TestFlight 앱 | 베타 사용자, 클라이언트 |
| Ad hoc | iOS | 기기 유형별 연간 100대 | 아니요 | 등록된 UDID, 개발자 모드 | 소규모 QA 팀, Apple 심사 불필요 |
| Play 내부 테스트 | Android | 100 | 전체 심사 없음, 보통 몇 분 내 사용 가능 | 이메일 목록에 등록된 Google 계정 | 팀 구성원 |
| Play 비공개 테스트 | Android | 이메일 목록 또는 Google Groups | 예 | Google 계정, 참여 링크 | 베타 사용자, 12명 테스터 요구 사항 |
| Play 공개 테스트 | Android | 무제한 또는 제한 있음 | 예 | 스토어 등록 시 선택 | 공개 베타 |
| Play 내부 앱 공유 | Android | 링크가 있는 모든 사용자 | 아니요 | Google 계정, 설정 활성화됨 | 빠른 QA 빌드, 모든 code 버전 |
| Firebase App Distribution | 둘 다 | 대용량 | 없음 | 이메일 초대; iOS는 등록된 UDID 필요 | 크로스 플랫폼 QA |
| APK 직접 링크 | Android | 누구나 | 없음 | 출처를 알 수 없는 앱 허용 | 빠른 내부 테스트 |
요약 가이드:
- 스토어에 출시할 빌드와 동일한가요? TestFlight와 Play tracks를 사용하세요. 테스터가 사용하는 바이너리가 곧 배포될 바이너리입니다.
- 매일 QA 빌드가 필요한가요? 양쪽 스토어의 내부 테스트 또는 Firebase App Distribution을 활용하세요.
- 웹 레이어 변경 사항을 몇 분 안에 테스트해야 하나요? 새 바이너리 대신 live update를 테스트 채널로 배포하세요.
배포 전 확인 사항: 서명
모든 테스트 빌드는 반드시 서명되어야 합니다.
- iOS 테스트 빌드는 다음 중 하나를 사용합니다. App Store Connect 프로필(TestFlight) 또는 Ad Hoc 프로파일(직접 설치). 두 방식 모두 Apple Distribution 인증서를 사용합니다. 자세한 내용은 iOS 인증서 및 프로비저닝 프로파일 설명을 참조하세요.
- Android Play 트랙용 빌드는 업로드 키로 서명된 AAB 파일입니다. 직접 설치를 하려면 릴리스 키로 서명된 APK가 필요합니다. 디버그 APK도 설치는 가능하지만, 동작 방식(디버그 가능 여부, 서명 차이 등)이 다르며 나중에 Play 빌드로 업데이트할 수 없습니다.
iOS: TestFlight
빌드 업로드
Xcode에서: Product > Archive, 그 다음 Distribute App > App Store Connect > Upload. CLI 또는 CI에서는 다음을 export 하세요 .ipa App Store Connect API 키를 사용하여 업로드하거나, 클라우드 빌드 서비스를 이용하세요.
2026년 4월부터는 Xcode 26 이상의 버전으로 빌드하여 업로드해야 합니다.
다음 항목에 이 키를 추가하세요: ios/App/App/Info.plist 앱이 표준 HTTPS 암호화만 사용하는 경우, 빌드마다 App Store Connect에서 수출 규정 준수 질문이 뜨지 않도록 설정합니다:
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
처리에는 몇 분에서 약 한 시간 정도 소요됩니다. 빌드가 완료되면 이메일로 알림을 받습니다.
내부 테스트
- App Store Connect에서 앱을 선택한 후, TestFlight > Internal Testing메뉴로 이동하여 그룹을 생성하세요.
- 팀원을 추가하세요. 팀원은 App Store Connect 역할(Admin, App Manager, Developer, Marketing 등)을 보유해야 하며, 최대 100명까지 가능합니다.
- 다음 기능을 활성화하세요: 자동 배포 이제 모든 새로운 build가 해당 그룹으로 전송됩니다.
- 테스터는 App Store에서 TestFlight 앱을 설치하고 초대를 수락하면 됩니다.
별도의 리뷰가 필요 없습니다. upload 후 기기까지 가장 빠르게 전달되는 방법입니다.
외부 테스트
- TestFlight > External Testing > + 그룹을 생성하려면 클릭하세요.
- 이메일로 테스터를 추가하거나, 공개 링크를 활성화하여 테스터 인원 제한을 설정할 수 있습니다.
- build를 그룹에 추가하고 다음 내용을 입력하세요. 테스트 정보 (테스트 항목, 피드백 이메일, 베타 앱 설명, 필요 시 데모 로그인 정보).
- 다음 항목을 제출하세요: 베타 앱 리뷰. 각 버전의 첫 번째 빌드는 보통 하루 이내에 리뷰됩니다. 동일 버전의 후속 빌드는 전체 리뷰 없이 배포되는 경우가 많습니다.
외부 테스트는 최대 10,000명의 테스터를 지원합니다. 테스터는 TestFlight에서 피드백과 함께 스크린샷을 직접 보낼 수 있으며, 이는 App Store Connect에서 확인할 수 있습니다.
TestFlight 주요 제한 사항
- 빌드 만료 기간: 90일.
- 테스터의 iOS 버전은 빌드에서 지원하는 버전이어야 합니다 (Capacitor 8은 iOS 15 이상 필요).
- TestFlight 빌드는 프로덕션 App Store 서명을 사용하므로, 푸시 알림은 다음을 사용합니다: 프로덕션 APNs 환경입니다.
- TestFlight의 인앱 결제는 sandbox를 사용하므로 실제 비용이 청구되지 않습니다.
iOS: ad hoc 배포
Ad hoc 빌드는 TestFlight나 Apple의 리뷰 없이 Apple Developer 포털에 등록된 기기에 직접 설치할 수 있습니다.
- 테스터의 UDID를 수집하세요. 테스터는 다음 도구를 통해 직접 확인할 수 있습니다. iOS UDID 찾기, 또는 기기를 연결한 후 Finder나 Xcode에서 확인할 수도 있습니다.
- 다음 경로에서 기기를 등록하세요. Certificates, Identifiers & Profiles > Devices.
- 해당 기기들을 포함하는 Ad Hoc provisioning profile을 생성하고 다운로드하세요.
- 다음 항목을 빌드하세요:
.ipa해당 프로필로 (Xcode: Distribute App > Release Testing, Ad Hoc의 최신 명칭입니다). - 설치 방법:
- 다음 파일을
.ipaFinder에서 기기로 드래그하거나, Xcode > Window > Devices and Simulators. - 또는 HTTPS 기반의
itms-servicesmanifest를 사용하여 테스터가 링크를 클릭해 설치하게 할 수 있습니다. Firebase App Distribution 같은 서비스를 이용하면 편리합니다.
- 다음 파일을
- iOS 16 이상 버전에서 Mac(Xcode 또는 Apple Configurator)을 통해
.ipa를 설치하려면 다음이 필요합니다: 개발자 모드 기기에서 (설정 > 개인정보 보호 및 보안)을 통해 설정하세요. 다음에서 설치합니다:itms-services필요하지 않습니다. 자세한 내용은 iOS 개발자 모드 활성화 방법.
새 테스터를 추가하려면 UDID를 등록하고 프로파일을 재생성한 뒤 다시 빌드해야 합니다. 디바이스 슬롯(디바이스 제품군당 100개)은 멤버십 갱신 시에만 초기화되므로, 디바이스를 무분별하게 등록하지 마세요.
Android: Google Play 테스트 트랙
Play Console에는 프로덕션 외에 3개의 테스트 트랙이 있습니다. 모든 트랙에는 업로드 키로 서명된 AAB가 필요합니다.
내부 테스트
- 테스트 > 내부 테스트 > 테스터: 이메일 목록을 생성하세요 (최대 100개 주소).
- 새 출시 버전 만들기, AAB를 upload하고 출시 노트를 추가한 뒤, 저장 및 출시를 진행하세요.
- 다음 내용을 복사하세요 opt-in 링크를 복사하여 테스터에게 전달하세요. 테스터는 Play Store에서 직접 수락하고 설치할 수 있습니다.
내부 출시(Internal releases)는 보통 몇 분 내로 가능하며 전체 리뷰를 기다릴 필요가 없습니다. 다만, 신규 앱의 첫 출시 시에는 Google의 앱 처리 과정으로 인해 시간이 더 걸릴 수 있습니다.
비공개 테스트
비공개 트랙은 리뷰를 거치며, 지원 이메일 목록이나 Google Groups를 활용할 수 있습니다. 이 트랙은 다음 조건을 충족하는 데 필요합니다: 14일 동안 12명의 테스터 확보 이 규칙은 2023년 11월 13일 이후 생성된 개인 개발자 계정이 프로덕션 권한을 얻기 전에 적용됩니다. Google Group을 사용하면 테스터가 쉽게 참여할 수 있습니다. 자세한 내용은 Apple 및 Google Play 개발자 계정 생성 방법.
공개 테스트
Play 스토어 등록정보를 통해 누구나 참여할 수 있습니다. 스토어 등록정보가 완성되면 공개 베타용으로 활용하세요. 공개 테스터의 피드백은 비공개로 유지되며 공개 평점에는 영향을 주지 않습니다.
저희 Android 베타 테스트 가이드 트랙을 더 자세히 비교합니다.
Android: 내부 앱 공유
내부 앱 공유는 버전 code 규칙이나 심사 없이, Play Store를 통해 APK 또는 AAB를 기기에 가장 빠르게 전달하는 방법입니다.
- Play Console에서 다음을 여세요: 내부 앱 공유 (테스트 항목 아래)를 선택하고 업로더를 추가합니다.
- APK 또는 AAB를 upload하면 링크가 생성됩니다.
- 테스터는 Play Store 앱을 열고 설정으로 이동하여 Play Store 버전 을 7번 탭해 개발자 설정을 활성화한 뒤, 다음을 켭니다. 내부 앱 공유.
- 테스터가 링크를 열어 바로 설치합니다.
버전 코드를 올릴 필요가 없어 PR 빌드 QA에 유용합니다.
Android: 직접 APK 전달 및 Firebase App Distribution
직접 APK 전달
서명된 release APK를 빌드하세요. 새 Capacitor 프로젝트에는 release signing config가 없으므로, assembleRelease 설치되지 않는 unsigned APK가 생성됩니다. 먼저 signingConfigs.release block(keystore 경로 및 비밀번호, 보통 다음에서 읽음) key.properties)을 android/app/build.gradle 추가하고 buildTypes.release.signingConfig 지정하세요.
bun run build
bunx cap sync android
cd android && ./gradlew assembleRelease
공유하기 android/app/build/outputs/apk/release/app-release.apk 링크를 통해 설치할 수 있습니다. 테스터는 브라우저나 파일 관리자에서 출처를 알 수 없는 앱 설치 및 파일 열기를 허용해야 합니다. 이미 Play Store 버전을 설치한 경우, 서명이 다르므로 먼저 삭제해야 합니다. 또한 USB를 통해 설치할 수도 있습니다. adb install -r app-release.apk (참고: Android에서 개발자 옵션을 활성화하는 방법)).
2026년 9월 30일부터 브라질, 인도네시아, 싱가포르, 태국 내 인증된 Android 기기에서는 검증된 개발자가 등록한 패키지 명의 앱만 설치할 수 있으며, 2027년에는 전 세계로 확대될 예정입니다. 테스터가 해당 국가에 있다면 Android Developer Console 또는 Play Console에 패키지 명을 등록하세요. adb 를 통한 설치는 영향을 받지 않습니다.
Firebase App Distribution
Firebase App Distribution은 양쪽 플랫폼 모두 지원하며, 이메일 초대 발송 및 빌드별 설치 현황 추적이 가능합니다.
bun add -g firebase-tools
firebase login
firebase appdistribution:distribute android/app/build/outputs/apk/release/app-release.apk \
--app 1:1234567890:android:abc123def456 \
--groups "qa-team" \
--release-notes "Fix checkout crash"
- Android 테스터는 이메일 링크나 App Tester 앱을 통해 설치합니다.
- iOS 테스터는 여전히 ad hoc(또는 development) 프로필 상태여야 합니다. App Distribution은 초대를 수락할 때 UDID를 수집하지만, 테스터 등록 및 재빌드는 직접 수행해야 합니다.
- AAB 배포를 하려면 Firebase 프로젝트를 Google Play에 연결해야 합니다.
테스터에게 링크를 제공하는 Cloud build 방식은
모든 CI runner에서 Mac을 유지 관리하거나 서명 작업을 직접 하고 싶지 않다면, Capgo Build 클라우드에서 Capacitor 앱을 빌드합니다. 테스트 빌드의 경우 스토어 제출 과정을 건너뛰고, QR code이 포함된 기간 한정 다운로드 링크로 바이너리를 업로드할 수 있습니다:
# Android APK/AAB for testers, no Play upload
bunx @capgo/cli@latest build request com.example.app \
--platform android --no-playstore-upload --output-upload --output-retention 2d
# iOS ad hoc build (no App Store submission)
bunx @capgo/cli@latest build request com.example.app \
--platform ios --ios-distribution ad_hoc --output-upload
# iOS build uploaded to TestFlight for external groups
bunx @capgo/cli@latest build request com.example.app \
--platform ios --ios-testflight-groups "Beta Testers"
추가 --output-record build.json 및 CI에서 링크를 읽어 bunx @capgo/cli@latest build last-output --path build.json --field outputUrl pull request나 채팅에 공유하세요. Capgo Build 문서 모든 옵션을 나열합니다.
웹 변경 사항에 대한 재빌드 건너뛰기
Capacitor 앱의 대부분의 변경 사항은 웹 레이어에서 발생합니다. 단순 텍스트 수정을 위해 바이너리를 다시 빌드하고 배포하는 것은 TestFlight 처리와 리뷰에 하루를 낭비하는 일입니다. Capgo Live Updates를 사용하면테스터는 이미 설치된 빌드를 그대로 유지하면서, 여러분은 테스트 채널로 새로운 JavaScript bundle을 푸시할 수 있습니다:
bunx @capgo/cli@latest bundle upload --channel beta
각 pull request마다 별도의 채널을 할당하여, QA가 동일한 앱에서 채널을 전환하며 테스트하게 할 수도 있습니다. 자세히 보기: 모든 pull request를 즉시 설치 가능한 프리뷰로 만드세요.
문제 해결
iOS ad hoc 설치 불가 오류 기기 UDID가 프로필에 없거나 프로필이 만료되었습니다. 다음을 확인하세요: security cms -D -i profile.mobileprovision.
iOS에서 앱 실행 즉시 종료됨 Developer Mode가 꺼져 있거나(ad hoc/development build), 프로필이 만료되었습니다.
TestFlight 빌드가 “Processing” 상태에서 멈춤 최대 한 시간 정도 기다려 보세요. 계속 실패한다면 이메일에 이유가 적혀 있습니다. 주로 usage description 문자열 누락(NSCameraUsageDescription 및 유사한 문제) 또는 아이콘 문제입니다.
TestFlight “Missing Compliance” 오류 App Store Connect에서 수출 규정 준수 질문에 답하거나, ITSAppUsesNonExemptEncryption 로 Info.plist.
Android “앱이 설치되지 않았습니다” 오류. 다른 서명이 적용된 버전이 이미 설치되어 있거나, APK가 서명되지 않았거나 손상되었습니다. 기존 앱을 삭제하세요.
테스터가 참여(opt-in) 후에도 Play Store에서 앱을 찾지 못함. 몇 분 정도 기다린 후, 초대받은 계정으로 로그인했는지 확인하세요. 또한 릴리스가 해당 트랙에 배포되었는지, 해당 국가가 지원되는지 확인하세요.
업로드 시 “code 버전이 이미 사용되었습니다” 메시지 발생. 버전 올리기 versionCode 에서 android/app/build.gradle. Internal app sharing은 예외입니다.
TestFlight에서 푸시 알림이 오지 않음. TestFlight는 프로덕션 APNs 환경을 사용합니다. 다음을 확인하세요: aps-environment entitlement 및 푸시 제공업체의 환경 설정을 확인하세요.
소규모 팀을 위한 권장 설정
- 자동 배포가 적용된 TestFlight 내부 그룹과 Play 내부 테스트 트랙을 통해, 모든 머지 시
main. - 매주 업데이트되는 베타 사용자를 위한 TestFlight 외부 그룹 및 Play 비공개 테스트 트랙을 제공합니다.
- 빌드 사이의 웹 전용 수정을 위한
beta빌드 사이의 웹 전용 수정을 위한 채널. - 베타 버전이 안정되면 동일한 빌드를 양쪽 스토어의 프로덕션으로 승격시키고, 앱 첫 심사 가이드를 따르세요..