--- id: mobile-firebase-distribution title: Firebase App Distribution / Pre-launch / App Review category: Coding status: draft source_trust_level: B verification_status: conceptual created_at: 2026-05-09 updated_at: 2026-05-09 tags: [mobile, firebase, vibe-coding] tech_stack: { language: "process", applicable_to: ["Mobile"] } applied_in: [] aliases: [Firebase App Distribution, Pre-launch report, App Store review, common rejections, expedited review] --- # Firebase Distribution / Pre-launch / Review > Beta tester + automated test + store review. **Firebase App Distribution (cross-platform), Pre-launch report (Android), App Store review tips**. ## πŸ“– 핡심 κ°œλ… - Firebase Distribution: free, cross-platform. - Pre-launch report: μžλ™ device test (Android). - Apple App Review: 1-2 days, common rejection. - Expedited review: emergency fix. ## πŸ’» μ½”λ“œ νŒ¨ν„΄ ### Firebase App Distribution setup ```bash firebase login firebase init appdistribution ``` ### Distribute (CLI) ```bash # Android firebase appdistribution:distribute app/build/outputs/apk/release/app-release.apk \ --app 1:1234567890:android:abcdef \ --release-notes "Bug fixes" \ --groups "internal-testers" # iOS firebase appdistribution:distribute MyApp.ipa \ --app 1:1234567890:ios:abcdef \ --release-notes "Bug fixes" \ --testers "alice@example.com,bob@example.com" ``` ### Fastlane integration ```ruby lane :distribute do build_app firebase_app_distribution( app: 'YOUR_APP_ID', groups: 'internal', release_notes: 'Bug fixes', ) end ``` ### Tester groups ```bash firebase appdistribution:groups:create internal firebase appdistribution:testers:add --group internal alice@example.com ``` β†’ Email κ°€ group 식. Group β†’ distribute. ### Tester experience ``` 1. Email "Beta available". 2. App Tester app (iOS / Android) λ‹€μš΄λ‘œλ“œ. 3. App Tester κ°€ list. 4. 1-tap install. 5. Feedback button (in-app screenshot). ``` ### vs TestFlight / Play Internal ``` Firebase: - Cross-platform (1 tool λ‘˜ λ‹€). - Free. - μž‘μ€ ecosystem. TestFlight: iOS μ „μš©, Apple μΉœν™”. Play Internal: Android μ „μš©, Google μΉœν™”. β†’ Cross-platform team κ°€ Firebase. ``` ### Firebase Crashlytics 톡합 ```swift // iOS import FirebaseCrashlytics Crashlytics.crashlytics().log("Login attempted") // Force crash for test fatalError() ``` β†’ Beta crash κ°€ μžλ™ λ³΄μž„. ### Pre-launch report (Android) ``` Play Console β†’ App β†’ Pre-launch reports. μ—…λ‘œλ“œ ν›„ (15-30 min): - Crash report (λ‹€λ₯Έ device, λ‹€λ₯Έ Android version) - Performance metric - Accessibility issue - Security warning β†’ λ§€ μ‹€ device κ°€ 5 min μžλ™ navigate. ``` ### Pre-launch login (auto fill) ``` Play Console β†’ Setup β†’ Pre-launch report credentials. - Test username + password. - Robo crawler κ°€ μ‚¬μš©. ``` β†’ Login ν›„ page 도 test. ### Robo script (custom) ```json { "actions": [ { "type": "click", "elementText": "Login" }, { "type": "input", "elementId": "email", "text": "test@example.com" }, { "type": "input", "elementId": "password", "text": "password" }, { "type": "click", "elementText": "Submit" } ] } ``` β†’ Custom flow test. ### App Review μ€€λΉ„ ``` - App icon (1024x1024) - Screenshot (λͺ¨λ“  size) - App preview video (선택) - Description (4000 char) - Keyword (100 char) - Support URL - Privacy URL - App Store Connect 의 Test Information β†’ λ§€ ν•­λͺ© κ°€ review checklist. ``` ### Common Apple rejections ``` 1. Crash (κ°€μž₯ ν”ν•œ). Fix β†’ resubmit. 2. Metadata mismatch (screenshot β‰  app). 3. Functionality (broken feature). 4. Privacy (NSUsageDescription λˆ„λ½). 5. Sign in with Apple (3rd party login + κ°€). 6. Subscription (clear pricing). 7. Hidden purchase (IAP outside StoreKit). 8. Misleading (hyperbolic claim). 9. Info.plist key λˆ„λ½. 10. Beta software (not production-ready). ``` ### Privacy nutrition label ``` App Store Connect β†’ App Privacy. - Data linked to user (track) - Data not linked (analytics) - Data used for tracking (advertising) β†’ μ •ν™• μž‘μ„±. ``` ### App Tracking Transparency ```swift // Track ν•˜κΈ° μ „: import AppTrackingTransparency ATTrackingManager.requestTrackingAuthorization { status in if status == .authorized { // Track } } ``` ```xml NSUserTrackingUsageDescription Used for personalized ads. ``` β†’ iOS 14.5+ 의무. Reject 흔함. ### Sign in with Apple ``` ToS: λ‹€λ₯Έ social login (Google, Facebook) + κ°€ 있으면 Apple 도. - Skip κ°€λŠ₯ = 거의 λͺ¨λ“  login flow κ°€ μΆ”κ°€. - Native UI κ°€ Sign in with Apple button. ``` ### Expedited review ``` App Store Connect β†’ Resolution Center β†’ Request expedited review. 이유: - Critical bug (μ‚¬μš©μž 영ν–₯) - Time-sensitive (event) - Legal / regulatory β†’ 보톡 24 hr μ•ˆ review. 1λ…„ 1-2회 만. ``` ### App Review reply ``` Reject β†’ Resolution Center. - λͺ…ν™• λ‹΅. - "Fixed in build 1.5.0" 식. - Screenshot / video κ°€ 도움. β†’ λ©°μΉ  ν›„ 재 review. ``` ### Beta 의 app store κ°€ 닀름 ``` TestFlight beta κ°€ review (1-2 day, first build only). 이후 build = quick review (λͺ‡ hour). App Store full review κ°€ 1-2 day. ``` ### Phased release (App Store) ``` Submit β†’ Approve β†’ Phased release: - Day 1: 1% - Day 2: 2% - Day 3: 5% - Day 4: 10% - Day 5: 20% - Day 6: 50% - Day 7: 100% β†’ λ§€ day crash κ°€ μ§€ν‚€λ©΄ halt κ°€λŠ₯. ``` β†’ Bug 발견 = halt + new build (expedited). ### Play Store review ``` Apple 보닀 빠름 (1-3 hour 평균). Manual review: - Permissions (특히 background location). - Privacy policy. - Restricted content. λ§€ update = same. ``` ### Version bump ``` 1.2.3 β†’ 1.2.4 (patch) 1.2.4 β†’ 1.3.0 (minor) 1.3.0 β†’ 2.0.0 (major) Build number κ°€ λ§€ upload (CFBundleVersion). ``` β†’ TestFlight κ°€ build number 만 λ‹€λ₯΄λ©΄ OK. ### Reject β†’ fix flow ``` 1. Reject λ°›μŒ (email + Resolution Center). 2. 이유 뢄석 (screenshot, log). 3. Fix code. 4. New build (build number++). 5. Same version λ˜λŠ” patch μƒμŠΉ. 6. Resubmit. 7. Quick re-review (1 day). ``` ### Apple Developer Forum ``` forums.developer.apple.com Common rejection 검색. "Guideline 4.0 β€” Design" 식 search. ``` ### App Store Connect API ```bash # CLI 둜 metadata update / build upload xcrun altool --upload-app -f app.ipa --apiKey ABC --apiIssuer XYZ ``` β†’ Fastlane κ°€ wrap. ### 함정: Privacy λ³€κ²½ ``` Update κ°€ μƒˆ SDK μΆ”κ°€: - μƒˆ tracking? - μƒˆ data collection? - App Privacy ν•­λͺ© update. β†’ App Privacy 와 actual code κ°€ mismatch = reject μœ„ν—˜. ``` ### 함정: Subscription ``` - Free trial λͺ…ν™•. - Auto-renew λͺ…μ‹œ. - Cancel link. - Restore purchase button. β†’ Subscription rejection 흔함. ``` ### Test build κ°€ reject? ``` TestFlight first build = review. - Production-quality. - Crash μ—†μŒ. - Required content. β†’ "test only" 라도 quality. ``` ## πŸ€” μ˜μ‚¬κ²°μ • κΈ°μ€€ | μž‘μ—… | μΆ”μ²œ | |---|---| | Cross-platform beta | Firebase App Distribution | | iOS only | TestFlight | | Android only | Play Internal Track | | Auto Android test | Pre-launch report | | Critical fix | Expedited review | | Slow launch | Phased release | | Manual review concerns | Common rejection 검색 | ## ❌ μ•ˆν‹°νŒ¨ν„΄ - **Production κ°€ first beta**: bug κ°€ λͺ¨λ“  μ‚¬μš©μž. - **NSUsageDescription λˆ„λ½**: reject. - **Hidden purchase**: reject + ban. - **Misleading screenshot**: reject. - **Privacy nutrition κ°€μ§œ**: μ‚¬μš©μž μ‹ λ’° ↓. - **No phased release**: bug κ°€ 100%. - **Reject 자주 λ¬΄μ‹œ**: μ‹œκ°„ λ‚­λΉ„. ## πŸ€– LLM ν™œμš© 힌트 - Firebase Distribution = cross-platform free beta. - Pre-launch report = Android free auto-test. - App Review checklist 맀번. - Phased release + crash monitor = safe. ## πŸ”— κ΄€λ ¨ λ¬Έμ„œ - [[Mobile_TestFlight_Distribution]] - [[Mobile_App_Store_Optimization]] - [[Mobile_Crash_Free_SLO]]