App Store Deployment
Submit your Capacitor app to the Apple App Store and Google Play Store.
What you'll accomplish
Understand the submission process for both app stores and prepare your app for release.
Prerequisites
- Working Capacitor app tested on device
- Apple Developer account ($99/year) for iOS
- Google Play Developer account ($25 one-time) for Android
Before You Submit
Both stores have requirements. Address these first:
Privacy Policy
Required by both stores.
Create a privacy policy that explains:
- What data you collect
- How you use it
- Third-party services you use
- How users can contact you
Host it on a public URL (e.g., yoursite.com/privacy).
App Icons
All required sizes:
| Platform | Sizes Needed |
|---|---|
| iOS | 1024x1024 for App Store, plus various sizes |
| Android | 512x512 for Play Store, plus adaptive icons |
Use tools like AppIcon Generator to create all sizes.
Screenshots
Both stores require screenshots:
- iOS: Multiple sizes for different devices
- Android: At least 2 screenshots per device type
Tip
Use the simulator/emulator to capture screenshots. For professional results, tools like Figma or Screenshot Framer can add device frames and text.
Apple App Store (iOS)
Step 1: Apple Developer Program
- Go to developer.apple.com
- Enroll in the Apple Developer Program ($99/year)
- Complete enrollment (may take 24-48 hours)
Step 2: Create App in App Store Connect
- Go to App Store Connect
- Click My Apps → (+) → New App
- Fill in:
- Platform: iOS
- Name: Your app's display name
- Primary Language: English (or your language)
- Bundle ID: Select from dropdown (matches your
appId) - SKU: Unique identifier (e.g.,
mymobileapp001) - User Access: Full Access
Step 3: Configure App Information
In App Store Connect, fill out:
App Information:
- Category (e.g., Productivity, Lifestyle)
- Content Rights (confirm you have rights)
- Age Rating (questionnaire)
Pricing:
- Price tier (Free or paid)
- Availability (countries)
App Privacy:
- Link to your privacy policy
- Data collection questionnaire
Step 4: Prepare Screenshots & Description
Version Information:
- Description (up to 4000 characters)
- Keywords (100 characters, comma-separated)
- What's New (for updates)
- Screenshots for each device size
- App Preview videos (optional)
Screenshot requirements:
| Device | Size |
|---|---|
| iPhone 6.7" | 1290 × 2796 |
| iPhone 6.5" | 1284 × 2778 |
| iPhone 5.5" | 1242 × 2208 |
| iPad Pro 12.9" | 2048 × 2732 |
Step 5: Archive and Upload
In Xcode:
-
Remove development settings:
typescript// capacitor.config.ts - Remove or comment out: // server: { url: 'http://...', cleartext: true } -
Build production:
bashnpm run build npx cap sync ios -
Set version numbers:
- In Xcode, select your target
- General → Version:
1.0.0 - General → Build:
1
-
Create archive:
- Select "Any iOS Device" (not a simulator)
- Product → Archive
- Wait for build to complete
-
Upload to App Store Connect:
- In Organizer (Window → Organizer)
- Select your archive
- Click "Distribute App"
- Choose "App Store Connect"
- Follow prompts
Step 6: Submit for Review
- In App Store Connect, go to your app
- Select the build you uploaded
- Fill in any remaining required fields
- Click "Submit for Review"
Review times:
- Usually 24-48 hours
- Can be longer for first submission
- You'll receive email updates
Common iOS Rejection Reasons
| Reason | Solution |
|---|---|
| Missing privacy policy | Add privacy policy URL |
| Incomplete metadata | Fill all required fields |
| Crashes on launch | Test thoroughly on device |
| Guideline 4.2 (Minimum Functionality) | Add more features or unique value |
| Login required without guest mode | Add "Skip" or demo mode |
Google Play Store (Android)
Step 1: Create Developer Account
- Go to Play Console
- Pay one-time $25 registration fee
- Complete identity verification
Step 2: Create Application
- Click "Create app"
- Fill in:
- App name
- Default language
- App or game
- Free or paid
- Accept policies
Step 3: Store Listing
Fill out your store listing:
Main store listing:
- Short description (80 characters)
- Full description (4000 characters)
- App icon (512 × 512)
- Feature graphic (1024 × 500)
- Screenshots (2-8 per device type)
- Video URL (optional)
Categorization:
- App category
- Tags (up to 5)
- Contact email/website
Step 4: App Content
Complete the content questionnaire:
Privacy Policy:
- Add your privacy policy URL
App Access:
- Does app require login?
- Provide test credentials if needed
Ads:
- Does app contain ads?
Content Rating:
- Complete IARC questionnaire
- Get content ratings
Target Audience:
- Age groups
- Appeals to children? (additional requirements)
News App:
- Is this a news app?
Data Safety:
- What data do you collect?
- How is it shared/used?
- Security practices
Step 5: Build Signed AAB
-
Remove development settings:
typescript// capacitor.config.ts - Remove: // server: { url: 'http://...', cleartext: true } -
Build production:
bashnpm run build npx cap sync android -
Generate signing key (one time):
bashkeytool -genkey -v \ -keystore my-release-key.jks \ -keyalg RSA \ -keysize 2048 \ -validity 10000 \ -alias my-key-aliasWarning
CRITICAL: Back up your keystore file and remember your password! If you lose it, you cannot update your app.
-
Configure signing in Gradle:
Create
android/keystore.properties:propertiesstorePassword=your-store-password keyPassword=your-key-password keyAlias=my-key-alias storeFile=../my-release-key.jksAdd to
.gitignore:keystore.properties *.jksUpdate
android/app/build.gradle:groovydef keystorePropertiesFile = rootProject.file("keystore.properties") def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) android { signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile']) storePassword keystoreProperties['storePassword'] } } buildTypes { release { signingConfig signingConfigs.release } } } -
Build AAB:
- In Android Studio: Build → Generate Signed Bundle / APK
- Choose "Android App Bundle"
- Select your keystore
- Choose "release" build variant
Step 6: Upload and Release
- In Play Console, go to Release → Production
- Click "Create new release"
- Upload your
.aabfile - Add release notes
- Click "Review release"
- Click "Start rollout to Production"
Review times:
- First app: 1-3 days (can be longer)
- Updates: Usually < 24 hours
- Some apps get instant publishing after track record
Common Android Rejection Reasons
| Reason | Solution |
|---|---|
| Privacy policy missing | Add privacy policy to store listing |
| Data safety incomplete | Complete all sections accurately |
| Crashes | Fix stability issues |
| Impersonation | Don't use misleading names/icons |
| Permissions not justified | Explain why each permission is needed |
TestFlight & Internal Testing
iOS: TestFlight
Test with users before public release:
- In App Store Connect, go to TestFlight
- Add internal testers (up to 100)
- Add external testers (up to 10,000)
- Upload builds and invite testers
Android: Testing Tracks
- Internal testing: Up to 100 testers, instant rollout
- Closed testing: Invite-only, good for beta
- Open testing: Anyone can join
In Play Console:
- Release → Testing → Create track
- Upload AAB
- Add testers by email or list
Updating Your App
iOS Updates
- Increment version/build numbers in Xcode
- Archive and upload new build
- In App Store Connect, create new version
- Submit for review
Android Updates
- Increment
versionCodeandversionNameinandroid/app/build.gradle - Build new signed AAB
- Upload to production (or testing) track
- Write release notes
groovy// android/app/build.gradle android { defaultConfig { versionCode 2 // Increment for each release versionName "1.1.0" // User-visible version } }
Common Issues
Frequently Asked Questions
- Ensure you have a valid Apple Developer account
- In Xcode, enable "Automatically manage signing"
- Select the correct Team
- Make sure bundle ID is registered in Apple Developer portal
Keystore has two passwords:
- Store password: For the .jks file
- Key password: For the key alias inside
Make sure you're using the right one in each place.
Apple requires apps to have "significant value." If your app is essentially a website:
- Add native features (push notifications, camera, etc.)
- Provide offline functionality
- Demonstrate unique value beyond a web wrapper
Check your minSdkVersion in android/app/build.gradle. It should be at least 22 for Capacitor. Also check required permissions.
- iOS: Usually within 24 hours of approval
- Android: Can take several days for indexing
- Search ranking improves with downloads and ratings
Deployment Checklist
Before submitting:
Both Platforms
- Privacy policy published and linked
- App icons in all required sizes
- Screenshots prepared
- Development settings removed
- Tested on real devices
- Version numbers set
iOS Specific
- App Store Connect listing complete
- Age rating questionnaire complete
- Archive uploaded via Xcode
- Build selected in App Store Connect
Android Specific
- Play Console listing complete
- Data safety section complete
- Content rating obtained
- Signed AAB uploaded
- Keystore backed up securely
Track Complete!
You've completed the Capacitor track if you can:
Congratulations! You've completed the Capacitor track. You now know how to build, test, and deploy native mobile apps using web technologies.