Phase 5

Publish on the App Store

Xcode, signing, TestFlight, review

1 day + 1–3 days review0/8 done

The iOS path is shorter to describe but stricter to pass. Everything here needs a Mac with Xcode. Apple reviews every build by hand, so the polish work from Phase 3 matters more here than anywhere else.

01

Add the iOS platform

bash
npm install @capacitor/ios
npm run build
npx cap add ios
npx cap sync ios
npx cap open ios     # opens Xcode
02

Configure the target in Xcode

  1. Select the App target → Signing & Capabilities.
  2. Tick Automatically manage signing and pick your Team. Xcode creates the certificate and provisioning profile for you.
  3. Confirm the Bundle Identifier is com.example.myapp — it must match the App ID you register in App Store Connect.
  4. General → set Display Name to My App, Version to 1.0.0, Build to 1.
  5. Set the Deployment Target to iOS 14 or later (Capacitor 7 requires 14+).
  6. Set supported orientations. If you only support portrait, say so — a broken landscape layout is a rejection.
03

Add permission usage strings

iOS crashes the app instantly if you request a permission without a usage description, and Apple rejects vague ones. Write a specific sentence for every permission your plugins use, in ios/App/App/Info.plist.

xml
<key>NSCameraUsageDescription</key>
<string>My App uses the camera so you can attach photos to your entries.</string>

<key>NSPhotoLibraryUsageDescription</key>
<string>My App needs photo access so you can choose an existing image.</string>

<key>NSLocationWhenInUseUsageDescription</key>
<string>My App uses your location to show nearby results.</string>
04

Register the app in App Store Connect

  1. developer.apple.com → Certificates, Identifiers & Profiles → Identifiers → register com.example.myapp and enable any capabilities you use (Push Notifications, Sign in with Apple).
  2. appstoreconnect.apple.com → My Apps → + → New App.
  3. Platform iOS, name (30 characters), primary language, the Bundle ID you just registered, and an SKU (any internal string).
05

Archive and upload

  1. In Xcode set the run destination to Any iOS Device (arm64) — Archive is disabled for simulators.
  2. Product → Archive. Wait for the build.
  3. In the Organizer window: Distribute App → App Store Connect → Upload.
  4. Keep the default options (symbols included, manage version and build number automatically off).
  5. Processing in App Store Connect takes 10–60 minutes before the build appears.
06

Test through TestFlight

  • Internal testers (up to 100 people on your team) get builds immediately, no review.
  • External testers (up to 10,000) require a short Beta App Review, usually under a day.
  • Provide a test description and, if there is a login, working demo credentials.
  • Install on a real iPhone and exercise every flow, especially permissions and offline.
07

Fill in the App Store listing and privacy

FieldLimitNote
App name30 charactersShown under the icon
Subtitle30 charactersThe one-line pitch
Promotional text170 charactersEditable without a new build
Description4000 charactersRequires a new version to change
Keywords100 characters totalComma separated, no spaces, no competitor names
Support URLrequiredA real page that answers questions
Screenshots6.9" and 6.5" iPhone requirediPad set required if you support iPad

Then complete the App Privacy questionnaire — the same content as Play's data safety form, asked differently. It must match what your app and SDKs actually do.

08

Submit for review

  1. Attach the processed build to the version.
  2. Fill in App Review Information: contact details, demo account, and notes explaining anything non-obvious (how to reach a feature, what a permission is for).
  3. Choose manual or automatic release after approval. Manual is safer for a first launch.
  4. Add to Review → Submit. Typical turnaround is 24–48 hours.
Common rejectionFix
4.2 Minimum functionality — 'this is a website'Add native features, offline state, proper navigation; explain the native value in review notes
2.1 Incomplete informationProvide working demo credentials and reachable support URL
5.1.1 Data collectionDo not force sign-up for features that do not need an account; add account deletion
4.0 Design — broken layoutFix safe areas, keyboard overlap, and the largest and smallest device sizes
3.1.1 In-app purchaseDigital goods must use Apple's IAP, not your own checkout
Sign in with Apple missingRequired if you offer other third-party logins