How to Publish a Cordova App on the App Store
Apache Cordova wraps your HTML/CSS/JavaScript app in a native WebView container. While Cordova is an older technology (consider migrating to Capacitor for new projects), many production apps still run on it. Publishing a Cordova app to the App Store follows a similar path to other hybrid frameworks, but with Cordova-specific build commands and plugin considerations. This guide covers the full process.
Prerequisites
- A Mac with Xcode 15+ installed
- An Apple Developer Program membership ($99/year)
- Node.js 18+ installed
- Cordova CLI installed (npm install -g cordova)
- iOS platform added to your Cordova project (cordova platform add ios)
Step-by-Step Build Process
Update config.xml
Set the widget id (bundle identifier), version, and iOS-specific preferences in config.xml. Add `<preference name="deployment-target" value="15.0" />`. Set `<preference name="WKWebViewOnly" value="true" />` to use WKWebView exclusively.
Build for release
Run `cordova build ios --release --device`. This generates an Xcode project in platforms/ios/ with release build settings. Cordova processes plugins, copies web assets, and configures the native project.
Open in Xcode
Open platforms/ios/YourApp.xcworkspace in Xcode. If using CocoaPods-based plugins, always open the .xcworkspace (not .xcodeproj). Configure signing, team, and deployment target.
Archive and validate
Select 'Any iOS Device', archive via Product > Archive. Validate the archive in the Organizer to catch signing and entitlement issues before uploading.
Code Signing & Certificates
Xcode signing configuration
Enable automatic signing in the Xcode project. Cordova generates a standard Xcode project, so signing works normally. If you regenerate the platform (cordova platform remove/add), you'll need to reconfigure signing.
Build.json for automated signing
Create a build.json file in your Cordova project root with signing information for automated builds: `{ "ios": { "release": { "codeSignIdentity": "Apple Distribution", "provisioningProfile": "UUID" } } }`. Pass it with `cordova build ios --buildConfig=build.json`.
Store Submission Steps
Upload to App Store Connect
Distribute the archive from Xcode Organizer to App Store Connect. The upload process is identical to native apps.
Create listing and submit
Set up the app in App Store Connect, add metadata and screenshots, test with TestFlight, and submit for review.
Common Rejection Reasons & Fixes
Guideline 4.2 - Minimum Functionality
Cordova apps are at higher risk of this rejection because they run entirely in a WebView. Use Cordova plugins for native features (camera, contacts, geolocation) and demonstrate functionality that requires a native app rather than a website.
UIWebView usage detected
Apple no longer accepts apps using UIWebView. Ensure you're using cordova-plugin-wkwebview-engine or Cordova 10+ which uses WKWebView by default. Check all plugins for UIWebView references with `grep -r UIWebView platforms/ios/`.
Outdated plugin causing crashes
Cordova plugins may not be maintained for recent iOS versions. Audit your plugins with `cordova plugin list` and update or replace abandoned plugins. Check GitHub issues for each plugin's iOS compatibility.
Privacy policy and data collection
Declare all data collected by Cordova plugins in App Privacy. Cordova's WKWebView stores cookies and local storage — declare this. Plugins like cordova-plugin-firebase add analytics that must be declared.
Pro Tips
- Consider migrating from Cordova to Capacitor — Capacitor is the modern evolution with better iOS support and maintenance
- Use cordova-plugin-splashscreen with a native storyboard splash screen, not a web-based one
- Pin plugin versions in config.xml to avoid unexpected breaking changes during `cordova prepare`
- Remove the Cordova whitelist plugin and use Content Security Policy headers instead for modern iOS security
- Test on iOS 15+ — WKWebView behavior has changed significantly in recent iOS versions
Skip the hassle. Let us handle it.
Publishing a Cordova app on the App Store (iOS) involves dozens of steps, certificates, and potential rejection pitfalls. Our team handles the entire process for you — from build configuration to store approval.