Going from Lovable to App Store is not one step, it's about nine, and the slowest one has nothing to do with code. This is the order we do them in for a Lovable iOS app, with the bits that trip people up. Whether Apple will accept a wrapped web app at all is a separate question, and I wrote about that in the guideline 4.2 post. Read that first if your app is mostly forms and lists.
1. Start the Apple Developer enrollment today
$99 a year. Do it before anything else, because verification is the part you can't speed up.
You can enroll as an individual or as an organization. Individual is fast, often same day, but your personal legal name shows on the App Store as the seller. Organization shows your company name and needs a D-U-N-S number, and getting one of those took one founder I know just under three weeks because the address on file didn't match their incorporation paperwork character for character. If you have a company, enroll as the company anyway. Moving an app from a personal account to an organization later is possible, it's just paperwork you'll be doing while also trying to ship.
2. Get the code out of Lovable
Connect the project to GitHub from Lovable and clone it. Lovable apps are Vite + React, so npm install && npm run build should give you a dist/ folder. If the build fails locally but works in Lovable, it's almost always a missing env var. Check .env for the VITE_SUPABASE_* values.
3. Wrap it with Capacitor
npm i @capacitor/core @capacitor/ios
npm i -D @capacitor/cli
npx cap init "Your App" com.yourcompany.yourapp --web-dir dist
npx cap add ios
npm run build && npx cap sync ios
npx cap open ios
Two things about that init line. The bundle ID (com.yourcompany.yourapp) is permanent once you upload a build, so don't use com.example.app "for now". And --web-dir dist matters, because Capacitor defaults to www and you'll get a white screen.
Some tutorials tell you to set server.url in capacitor.config.ts to your Lovable preview URL so the app "updates automatically". Don't. That ships an app that loads a website, which is precisely what 4.2 rejections are about, and the day someone edits the project in Lovable your production app changes under you without review. Bundle the build.
4. You need a Mac with Xcode 26
Since April 28, 2026, App Store Connect only accepts builds made with Xcode 26 and the iOS 26 SDK. You can still support older iPhones with a lower deployment target, you just have to compile with the current tools. Xcode only runs on macOS.
No Mac? Rent one (MacinCloud, or a Mac mini on Scaleway) or build in CI with Codemagic, which has a free tier that covers a small app. I don't love doing signing on a rented machine, but it works, and it's cheaper than buying a Mac for one app.
5. Signing and the Info.plist
In Xcode, select the App target, Signing & Capabilities, tick "Automatically manage signing" and pick your team. Let Xcode make the certificates. Manual signing is for people who enjoy pain.
Then open ios/App/App/Info.plist and add:
-
ITSAppUsesNonExemptEncryptionset toNO, unless you do your own encryption beyond HTTPS. Otherwise App Store Connect asks you the export compliance question on every single build. -
NSCameraUsageDescriptionif any screen has a file upload. A plain<input type="file" accept="image/*">offers "Take Photo" on iOS, and without that string the app crashes the moment the user taps it. Reviewers tap it. That's a crash rejection, not a 4.2, and it's an embarrassing one.
Capacitor's iOS template targets iPhone and iPad. If you haven't looked at your layout on an iPad, either test it there or set the target to iPhone only, because reviewers do sometimes review on an iPad.
6. Archive, upload, TestFlight
Product, Archive, then Distribute App, App Store Connect. The build sits in "Processing" for anything from five minutes to an hour, then appears in TestFlight. Install it on your own phone through TestFlight and use it properly for a day: log in, log out, kill the app, reopen it with no signal, rotate it. Most problems we catch happen here, not in review.
7. The listing
In App Store Connect create the app record with the same bundle ID. Then fill in:
Screenshots at 1320 × 2868 (the 6.9-inch iPhone size; Apple scales down for smaller phones) plus 13-inch iPad ones if you kept iPad support. A privacy policy URL and a support URL. The App Privacy questionnaire, which has to match what the app actually collects, Supabase auth email and any analytics included. The age rating questions.
And App Review Information, which is where a lot of first submissions die. If your app needs a login, give the reviewer a working demo account with a password. I watched a founder get rejected twice because their only login was a magic link and the reviewer had no way to read the email. Also, if users can create an account in the app, they have to be able to delete it from inside the app (guideline 5.1.1(v)). A "contact us to delete your account" link doesn't count.
8. Submit
Choose "Manually release this version" so an approval at 3am doesn't launch your app before you're ready. Review usually comes back within a day or two. If it's rejected, the message in Resolution Center quotes a guideline number. Reply there, fix it, resubmit. It is not the end of the world, it happens to plenty of experienced teams.
9. Updates
Each update means a new build number, a new archive and another review. For a web app you used to deploy ten times a day, that's the real adjustment. Batch your changes.
That's the path. Steps 3 to 6 are an afternoon if nothing is weird, and something usually is. If you'd rather not spend your week inside Xcode, we take Lovable apps through the App Store and Google Play for you, and if you're only on Android for now there's a Google Play version of this.
Originally published on lovable2app.com. Aakash Verma, software developer and founder of Lovable 2 Live.
Top comments (0)