Capacitor
60 minutes
linux
macos
windows

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:

PlatformSizes Needed
iOS1024x1024 for App Store, plus various sizes
Android512x512 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

  1. Go to developer.apple.com
  2. Enroll in the Apple Developer Program ($99/year)
  3. Complete enrollment (may take 24-48 hours)

Step 2: Create App in App Store Connect

  1. Go to App Store Connect
  2. Click My Apps → (+) → New App
  3. 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:

DeviceSize
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:

  1. Remove development settings:

    typescript
    // capacitor.config.ts - Remove or comment out:
    // server: { url: 'http://...', cleartext: true }
    
  2. Build production:

    bash
    npm run build
    npx cap sync ios
    
  3. Set version numbers:

    • In Xcode, select your target
    • General → Version: 1.0.0
    • General → Build: 1
  4. Create archive:

    • Select "Any iOS Device" (not a simulator)
    • Product → Archive
    • Wait for build to complete
  5. 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

  1. In App Store Connect, go to your app
  2. Select the build you uploaded
  3. Fill in any remaining required fields
  4. 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

ReasonSolution
Missing privacy policyAdd privacy policy URL
Incomplete metadataFill all required fields
Crashes on launchTest thoroughly on device
Guideline 4.2 (Minimum Functionality)Add more features or unique value
Login required without guest modeAdd "Skip" or demo mode

Google Play Store (Android)

Step 1: Create Developer Account

  1. Go to Play Console
  2. Pay one-time $25 registration fee
  3. Complete identity verification

Step 2: Create Application

  1. Click "Create app"
  2. Fill in:
    • App name
    • Default language
    • App or game
    • Free or paid
  3. 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

  1. Remove development settings:

    typescript
    // capacitor.config.ts - Remove:
    // server: { url: 'http://...', cleartext: true }
    
  2. Build production:

    bash
    npm run build
    npx cap sync android
    
  3. Generate signing key (one time):

    bash
    keytool -genkey -v \
      -keystore my-release-key.jks \
      -keyalg RSA \
      -keysize 2048 \
      -validity 10000 \
      -alias my-key-alias
    
    Warning

    CRITICAL: Back up your keystore file and remember your password! If you lose it, you cannot update your app.

  4. Configure signing in Gradle:

    Create android/keystore.properties:

    properties
    storePassword=your-store-password
    keyPassword=your-key-password
    keyAlias=my-key-alias
    storeFile=../my-release-key.jks
    

    Add to .gitignore:

    keystore.properties
    *.jks
    

    Update android/app/build.gradle:

    groovy
    def 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
            }
        }
    }
    
  5. 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

  1. In Play Console, go to Release → Production
  2. Click "Create new release"
  3. Upload your .aab file
  4. Add release notes
  5. Click "Review release"
  6. 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

ReasonSolution
Privacy policy missingAdd privacy policy to store listing
Data safety incompleteComplete all sections accurately
CrashesFix stability issues
ImpersonationDon't use misleading names/icons
Permissions not justifiedExplain why each permission is needed

TestFlight & Internal Testing

iOS: TestFlight

Test with users before public release:

  1. In App Store Connect, go to TestFlight
  2. Add internal testers (up to 100)
  3. Add external testers (up to 10,000)
  4. Upload builds and invite testers

Android: Testing Tracks

  1. Internal testing: Up to 100 testers, instant rollout
  2. Closed testing: Invite-only, good for beta
  3. Open testing: Anyone can join

In Play Console:

  1. Release → Testing → Create track
  2. Upload AAB
  3. Add testers by email or list

Updating Your App

iOS Updates

  1. Increment version/build numbers in Xcode
  2. Archive and upload new build
  3. In App Store Connect, create new version
  4. Submit for review

Android Updates

  1. Increment versionCode and versionName in android/app/build.gradle
  2. Build new signed AAB
  3. Upload to production (or testing) track
  4. 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

  1. Ensure you have a valid Apple Developer account
  2. In Xcode, enable "Automatically manage signing"
  3. Select the correct Team
  4. Make sure bundle ID is registered in Apple Developer portal

Keystore has two passwords:

  1. Store password: For the .jks file
  2. 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:

0/5

Congratulations! You've completed the Capacitor track. You now know how to build, test, and deploy native mobile apps using web technologies.