Publish an iOS App Without a Mac: Expo and EAS Guide
By Mehdi Azizi
Updated , 9 min
From a Windows PC, Expo and EAS build your iOS app and send it to Apple. What works without a Mac, what doesn't, and why you still need an iPhone.
Can you publish an iOS app without a Mac?
Yes. You can publish an iOS app without a Mac if you build it with Expo and React Native. EAS Build compiles your app on Mac machines hosted by Expo in the cloud, and EAS Submit then sends it to App Store Connect. Expo's documentation is clear on this: EAS Submit runs on macOS, Linux and Windows, so you don't need a Mac to ship an iOS build.
You do need three things nothing can replace, though: a paid Apple Developer account, an iPhone to test your app for real, and a browser to fill out your listing in App Store Connect. The rest of this guide covers what works from a Windows PC, what doesn't, and the order of the steps.
All my iOS apps go through this pipeline: Expo, EAS Build, then EAS Submit. That's how Solys and TradaZen got on the App Store. I work on a Mac, but no publishing step depends on it: builds happen in Expo's cloud and the upload to Apple goes through the command line.
How Expo and EAS replace the Mac
To understand what's possible, you need to know why the Mac used to be mandatory. An iOS app has to be compiled with Xcode, Apple's tool, which only runs on macOS, in a version recent enough to avoid the ITMS-90725 rejection. It then has to be signed with a certificate tied to your developer account, and uploaded to App Store Connect.
Expo splits this work into three tools:
- Expo and React Native: you write your app in JavaScript or TypeScript, on any computer.
- EAS Build: you run the command from your PC, the code goes to an Expo Mac, which compiles and signs the app for you. You get back a file ready to install or upload.
- EAS Submit: it takes that build and sends it to App Store Connect. Once Apple has processed it (checking the icon, for example, see ITMS-90717), it shows up in TestFlight.
The Mac is still in the pipeline. It's just not yours anymore. If you want to know why I recommend this stack to beginners, read the page React Native and Expo for a mobile app.
What you can do from a Windows PC
Code the app
All development works on Windows with no restrictions: your editor (VS Code, Cursor), Node.js, the terminal. If you code with help from Claude or ChatGPT, nothing changes either. On that topic, read build an iOS app with AI.
See your app on your iPhone while you code
To get started, the Expo Go app on your iPhone scans a QR code shown in your terminal and loads your project. Every change shows up on the phone within seconds. It's perfect for your first screens. Since May 2026, the App Store version of Expo Go is stuck on SDK 54: create your project with compatibility for it, or use eas go and TestFlight for a newer SDK.
Expo Go has a limit: it only contains the native modules bundled by Expo. As soon as your app uses a native library that isn't included, like the RevenueCat SDK for subscriptions, you need a development build: your own version of your app, compiled by EAS Build, that you install on your iPhone.
Install a build on your iPhone without the App Store
EAS offers internal distribution. You register your iPhone with the eas device:create command, then run a build with internal distribution. You get an install link. Apple limits this method: an account can distribute this way to at most 100 iPhones per year, and every new device requires a new build or a new signature. For you and a few friends, that's plenty.
Handle certificates without Xcode
Signing is what trips up the most beginners on a Mac, all the way to the ITMS-90034 error at upload. With EAS, you log into your Apple account from the command line, and the tool can generate the distribution certificate and provisioning profile for you. You never open Keychain Access.
Send your app to Apple and publish it
eas submit --platform ios uploads your build to App Store Connect. You can also chain both steps with the --auto-submit option of eas build. Everything else happens in the browser: the App Store listing, the screenshots, privacy declarations, subscriptions, TestFlight and submitting for review. App Store Connect is a web app, and it works just fine on Windows.
What's not possible (or harder) without a Mac
The local iOS simulator
The iOS simulator is part of Xcode, so it doesn't run on Windows. In practice, that's no big deal: your iPhone beats the simulator for testing. In September 2026, Expo announced a cloud iOS simulator, EAS Simulator, still in limited access as I write this. Don't build your workflow around it until it's open to everyone.
Debugging native code
If a crash comes from native code (Swift, Objective-C, a misconfigured library), Apple's diagnostic tools live in Xcode. Without a Mac, you rely on EAS build logs and a tool like Sentry, which reports crashes from the installed app. It's doable, just slower. That's why, for a first app, you should stick to maintained, Expo-compatible libraries, which also helps you avoid an ITMS-90338 rejection at upload.
Writing native extensions by hand
Widgets, notification extensions, specific native targets: it's possible with Expo thanks to config plugins, but without Xcode to inspect the generated project, every mistake costs you another build. For a first app, save these features for later.
Building locally
EAS local builds (the --local option) aren't supported on Windows. So on a PC, your iOS builds go through Expo's cloud. The free EAS plan includes a limited number of builds per month, with a queue: check the current terms on Expo's pricing page before planning an intense week of work.
The Apple Developer account: mandatory, no exceptions
No trick gets around this, not even the Apple Developer Enterprise Program, which is reserved for internal apps at large organizations. Without an Apple Developer Program membership, there's no App Store Connect, no TestFlight, no internal distribution, and no App Store submission. Membership costs $99 per year, charged in your local currency.
Two tips before you sign up:
- Choose carefully between an individual and an organization account. As an individual, your own name shows as the seller on the App Store. As an organization, it's your company's name, but Apple then requires a D-U-N-S number and a longer verification.
- Allow a few days. Account approval isn't always instant. Sign up as soon as you know you'll publish, not the day before you submit.
Why you really need an iPhone to test
Technically, you can publish an iOS app without ever holding it in your hand. I strongly advise against it, and so does Apple: its review guidelines (guideline 2.1) require the app to be tested on a device for bugs and stability before submission. Your users will only have that: a real iPhone.
Here's what only a real iPhone shows you:
- The real first launch, with no dev server: that's where startup crashes hide.
- In-app purchases in the sandbox environment, to check your paywall shows the right prices and the subscription actually unlocks the app.
- Notifications, camera, haptics, permissions, which behave differently, or not at all, elsewhere.
- The real layout: the notch or Dynamic Island, the home indicator, the keyboard covering a field.
- Smoothness, which a powerful computer often hides.
A recent used iPhone is enough, as long as it runs an iOS version supported by your Expo SDK version. And if you can, borrow an iPhone of a different size too: an app that fits on a big screen can get cut off on a small one. That's exactly what got Solys rejected, as I explain in why Apple rejects an app.
Without a Mac, it's doable. Without an iPhone, you're sending Apple an app you've never seen work.
The steps, in order, from Windows
- Create your project with
npx create-expo-appand test your first screens with Expo Go. - Install EAS CLI with
npm install -g eas-cli, then runeas loginandeas build:configure. - Sign up for the Apple Developer Program as soon as your project takes shape.
- Register your iPhone with
eas device:createand run a development build. - Create your app record in App Store Connect, with the same bundle identifier as in your Expo config.
- Run the production build with
eas build --platform ios. - Upload it with
eas submit --platform ios, then test it in TestFlight. The guide TestFlight to test your app covers this step in detail. - Fill out the listing and submit for review from the browser. The promotional text can be changed later without a new version.
Three traps come up often at this stage. The build number must go up with every upload: turn on EAS auto-increment so you never think about it again. The encryption question blocks every build until you answer it: you can declare it once and for all in the app config. And the bundle identifier must match everywhere, or EAS Submit won't find your app. For what comes next, from listing to approval, the page publish an app on the App Store covers every step.
Publish your first app, without a Mac and without getting lost
The Mac isn't the real obstacle anymore. The real obstacles are elsewhere: picking an app that has a shot at making money, wiring up subscriptions that work, preparing a submission Apple accepts. That's what the four-step path in the iOS Kit covers, at your own pace. For the submission, the Apple Review Kit bundles my pre-submission checklist and notes for the reviewer. The homepage shows how to build a mobile app without starting from scratch with Expo and Claude Code, Mac or not.
The final call on publishing your app stays with Apple, and no kit can guarantee it. What I can give you is the method I use on my own apps.
Frequently asked questions
How do you publish an iOS app without a Mac?
With Expo and React Native, a Mac hosted by Expo replaces yours. You code on any computer, EAS Build compiles and signs the app in the cloud, then EAS Submit sends it to App Store Connect. You also need a paid Apple Developer account, a browser to fill out the listing and an iPhone to test your app for real.
What are the steps to publish an iOS app from Windows?
Create your project with Expo, install EAS CLI and sign up for the Apple Developer Program. Register your iPhone, run a development build, then create your App Store Connect record with the same bundle identifier as in your Expo config. Next, run the production build, upload it with EAS Submit and test it in TestFlight, then fill out the listing and submit the app for review from the browser.
How much does it cost to publish an app on the App Store?
The Apple Developer Program membership costs $99 per year, charged in your local currency. It's mandatory: without it, there's no App Store Connect, no TestFlight, no internal distribution and no App Store submission. On the Expo side, the free EAS plan includes a limited number of builds per month, with a queue: check the current terms on Expo's pricing page.
Do you need an iPhone to publish an iOS app without a Mac?
Technically no, but I strongly advise against it, and so does Apple: its review guidelines (guideline 2.1) require the app to be tested on a device for bugs and stability before submission. A recent used iPhone is enough, as long as it runs an iOS version supported by your Expo SDK version.
How do you test an iOS app without a Mac?
Install the Expo Go app on your iPhone: it scans a QR code shown in your terminal and loads your project, with every change visible within seconds. Expo Go only contains the native modules bundled by Expo. As soon as your app uses a native library that isn't included, like the RevenueCat SDK, you need a development build compiled by EAS Build. To test the final build, read TestFlight to test your app.
What are the limits of iOS development without a Mac?
You can't use the iOS simulator locally: it's part of Xcode, so it doesn't run on Windows. EAS local builds (--local) aren't supported on Windows: your iOS builds go through Expo's cloud. Debugging native code and writing native extensions by hand are still possible, but harder, because Apple's tools live in Xcode.