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 트랙을 사용하세요. 테스터가 사용하는 바이너리가 그대로 배포되는 바이너리입니다.
- 매일 QA 빌드가 필요한가요? 두 스토어의 내부 테스트 또는 Firebase App Distribution을 사용하세요.
- 웹 레이어 변경 사항을 몇 분 안에 테스트해야 하나요? 새 바이너리 대신 live update를 테스트 채널로 배포하세요.
배포 전: 서명
모든 테스트 빌드는 서명이 필요합니다.
- iOS 테스트 빌드에는 다음 중 하나를 사용합니다. App Store Connect 프로필(TestFlight) 또는 Ad Hoc 프로필(직접 설치). 두 방식 모두 Apple Distribution 인증서를 사용합니다. 참고: iOS 인증서 및 provisioning profile 설명.
- Android Play 트랙용 빌드는 업로드 키로 서명된 AAB입니다. 직접 설치에는 릴리스 키로 서명된 APK가 필요합니다. 디버그 APK도 설치되지만 동작이 다르고(디버그 가능, 서명 다름) 나중에 Play 빌드로 업그레이드할 수 없습니다.
iOS: TestFlight
빌드 업로드
Xcode에서: Product > Archive, 그 다음 Distribute App > App Store Connect > Upload. 명령줄 또는 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 > 내부 테스트, 그리고 그룹을 만드세요.
- 팀 멤버를 추가하세요. App Store Connect 역할(Admin, App Manager, Developer, Marketing 등)이 필요합니다. 최대 100명까지 추가할 수 있습니다.
- 활성화 자동 배포 그래서 모든 새 build가 해당 그룹으로 전송됩니다.
- 테스터는 App Store에서 TestFlight 앱을 설치하고 초대를 수락합니다.
별도 심사가 필요 없습니다. upload부터 기기까지 가장 빠른 경로입니다.
외부 테스트
- TestFlight > 외부 테스트 > + 를 눌러 그룹을 만드세요.
- 이메일로 테스터를 추가하거나, 공개 링크를 활성화하세요. 테스터 수 제한은 선택 사항입니다.
- 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 이상에서는
.ipaMac(Xcode 또는 Apple Configurator)에서 개발자 모드 기기에서(설정 > 개인정보 보호 및 보안) 활성화해야 합니다. 다음에서 설치하는 경우itms-services링크는 필요 없습니다. 참고 iOS에서 개발자 모드 활성화 방법.
새로운 테스터를 추가하려면 UDID를 등록하고 프로필을 재생성하며 다시 빌드해야 합니다. 기기 슬롯(기기 유형당 100개)은 멤버십 연도가 갱신될 때만 초기화되므로 기기를 함부로 등록하지 마세요.
Android: Google Play 테스트 트랙
Play Console에는 프로덕션을 포함해 세 가지 테스트 트랙이 있습니다. 모두 업로드 키로 서명된 AAB가 필요합니다.
내부 테스트
- 테스트 > 내부 테스트 > 테스터: 이메일 목록 생성 (최대 100개 주소).
- 새 릴리스 생성, AAB 업로드, 릴리스 노트 추가, 저장 및 롤아웃.
- 다음을 복사하세요 opt-in 링크 테스터에게 전송하세요. 수락 후 Play Store에서 설치합니다.
내부 릴리스는 보통 몇 분 안에 사용 가능하며 전체 리뷰를 기다리지 않습니다. 완전히 새로운 앱의 첫 릴리스는 Google이 앱을 처리하는 동안 더 오래 걸릴 수 있습니다.
비공개 테스트
클로즈드 트랙은 리뷰되며 이메일 목록 또는 Google Groups를 지원합니다. 이 트랙은 14일간 12명의 테스터 규칙이 2023년 11월 13일 이후 생성된 개인 개발자 계정에 프로덕션 접근 권한 획득 전까지 적용됩니다. Google Groups를 사용하면 테스터가 쉽게 참여할 수 있습니다. 자세한 내용은 Apple 및 Google Play 개발자 계정 생성 방법.
공개 테스트
Play 스토어 목록에 있는 누구나 참여할 수 있습니다. 스토어 목록이 완성되면 공개 베타로 사용하세요. 오픈 테스터의 피드백은 비공개이며 공개 평점에 영향을 주지 않습니다.
저희 Android 베타 테스트 가이드에서 트랙을 더 자세히 비교합니다.
Android: 내부 앱 공유
내부 앱 공유는 버전 code 규칙이나 심사 없이 Play Store를 통해 APK 또는 AAB를 기기에 가장 빠르게 설치하는 방법입니다.
- Play Console에서 다음을 여세요: 내부 앱 공유 (테스트 아래)를 선택하고 업로더를 추가합니다.
- APK 또는 AAB를 업로드하면 링크가 생성됩니다.
- 테스터는 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에 연결해야 합니다.
테스터에게 링크를 전달하는 클라우드 빌드
모든 CI 러너에서 Mac과 서명을 관리하고 싶지 않다면, Capgo 빌드 클라우드에서 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 풀 리퀘스트나 채팅에 게시합니다. Capgo Build 문서 모든 옵션을 나열합니다.
웹 변경 시 재빌드 생략
Capacitor 앱의 대부분의 변경 사항은 웹 레이어에 있습니다. 텍스트 수정을 위해 바이너리를 다시 빌드하고 재배포하면 TestFlight 처리 및 검토에 하루가 낭비됩니다. Capgo Live Update 사용하기, 테스터는 설치한 빌드를 그대로 유지하고, 새 JavaScript 번들을 테스트 채널로 푸시합니다:
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/개발 빌드), 프로필이 만료되었습니다.
TestFlight 빌드가 “처리 중”에 멈춤. 최대 1시간 기다리세요. 실패하면 이메일에 원인이 표시되며, 대개 사용 설명 문자열 누락(NSCameraUsageDescription 등) 또는 아이콘 문제입니다.
TestFlight “컴플라이언스 누락”. 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 제한적 테스트 트랙, 매주 업데이트
- Live Update를 통한
beta빌드 간 웹 전용 수정 사항 배포 - 베타 버전이 안정화되면 동일한 빌드를 두 스토어 모두에 프로덕션으로 배포하고, 첫 앱 심사 가이드.