Quick answer
Testing an iOS app without a Mac means borrowing someone else's Mac, because Xcode and the iOS Simulator run only on macOS. From Windows or Linux you can build on a cloud macOS machine and run the app in a cloud-hosted iOS simulator in your browser, install it on a physical iPhone through TestFlight or a development build, or rent a Mac by the hour or month.
Why do Windows and Linux developers get stuck on iOS?
Dana in design owns the only MacBook in the building, and she has never opened Xcode. The Android build works. Your Windows laptop has Android Studio, the emulator is up, and the feature is done. Then someone asks for the iOS version by tomorrow's demo.
Searches for "iOS simulator for Windows" return download sites and forum threads about virtual machines. Neither is a real answer. The rest of this guide covers what Apple's rules allow, what works from a Windows or Linux machine, and how long each path takes before you see the app on a screen.
Can you run Xcode or the iOS Simulator without a Mac?
No, and two facts explain why.
Xcode runs on macOS only. The current release, Xcode 27, requires macOS Tahoe 26.6 or later, according to Apple's Xcode support page. The iOS Simulator ships inside Xcode. There is no Windows or Linux version of either.
macOS is licensed for Apple hardware only. Apple's macOS Tahoe software license, section 2.B, permits installing the OS on "each Apple-branded computer" you own or control, and allows "up to two (2) additional copies or instances of the Apple Software" inside virtual machines, again "on each Apple-branded computer you own or control". A macOS virtual machine on a Windows PC is outside the license. The same rule shapes how cloud Mac providers charge: Amazon bills EC2 Mac instances with "a 24-hour minimum allocation period to comply with the Apple macOS Software License Agreement".
The practical question is whose Mac does the work, and how you see the result. Three answers follow.
Option 1: Build in the cloud and run a cloud simulator in your browser
A build service compiles the app on a Mac it owns and gives you an iOS Simulator build (a .app directory, not an .ipa). A separate cloud simulator service boots an iOS Simulator on another Mac, installs that build, and streams the screen to a browser tab.
The two halves are separable. Any CI service with macOS runners (Bitrise, Codemagic, EAS Build, GitHub Actions) can produce a simulator build. What is rarer is somewhere to run it without a Mac. Simulator builds only run in the iOS Simulator, which only runs on macOS, so the second half has to be a hosted Mac too.
What you need. An account with the build service and, for React Native, a project set up for it. No Apple Developer Program membership: simulator builds are unsigned. Expo's guide to building for iOS Simulators describes a simulator build as a version of the app running "without needing to deploy to TestFlight or even having an Apple Developer account".
How long. A full native build in Expo's own pipelines averages about 23 minutes. After that, a simulator session starts in the time it takes to boot a simulator and install the app.
Where it wins. The person testing needs nothing installed beyond a browser. A PM sees the app in a tab. A Linux developer sees the iOS layout bug. An AI agent can drive it. It does not exercise the camera, push notifications or real touch latency, because a simulator does not have them.
Option 2: Install on a borrowed iPhone with TestFlight or a development build
If a real iPhone is available, even someone else's, you can build in the cloud and install on the device. Two routes exist and they need different Apple paperwork.
TestFlight
TestFlight is Apple's beta distribution service. The build is a store-signed .ipa, uploaded to App Store Connect. Internal testing covers up to 100 members of your App Store Connect team and is available "as soon as the build finishes processing". External testing covers up to 10,000 testers by email or a public link, but the first build of every app version must pass Beta App Review, per the Expo TestFlight guide and Apple's TestFlight overview. Builds expire 90 days after upload. Each tester can use up to 30 devices.
You need a paid Apple Developer Program membership at $99 per year. You do not need a Mac to upload: EAS Submit runs on Windows and Linux and pushes the .ipa to App Store Connect. Apple's processing "usually takes 5 to 10 minutes, though there is no guaranteed time".
A development build through internal distribution
A development build is your app compiled with developer tools inside, so it connects to a development server on your machine and reloads as you edit. To put one on an iPhone you sign it with an ad hoc provisioning profile that lists the device's UDID. Apple caps ad hoc distribution at 100 iPhones per account per year, and adding a device means a re-sign or rebuild, as Expo's internal distribution guide explains.
New accounts hit one trap. On a new or recently renewed Apple Developer Program membership, Apple can take 24 to 72 hours to process a newly registered device, and the first build that includes it may fail until that finishes. The Expo docs flag this, citing Apple's device registration notes.
Where it wins. Real hardware: camera, biometrics, notifications, performance on the actual chip. TestFlight is the right choice when the tester is outside your team or the app is close to release. A development build is the right choice when you are still editing code and want reloads on the device.
Option 3: Rent a Mac
Rent macOS and use it like a Mac: remote desktop in, install Xcode, run the simulator on it. Two common forms:
- Dedicated hosted Macs. MacStadium lists an M2 Mac mini (8 GB RAM, 256 GB SSD) from $109 per month and an M1 Max Mac Studio from $249 per month, on monthly subscriptions, according to MacStadium's pricing page.
- Cloud Mac instances. Amazon EC2 offers Mac dedicated hosts across Intel, M1, M2, M3 Ultra and M4 families, billed per second after a 24-hour minimum allocation.
Where it wins. You get the full toolchain: Xcode, Instruments, the debugger, every simulator runtime. If you maintain native Swift code and need to step through it, a rented Mac is the only option on this list that gives you that. The cost is that you also inherit the Mac: OS updates, Xcode downloads, and a remote-desktop session that feels like a remote-desktop session.
Cloud simulator, TestFlight, development build or rented Mac?
| Cloud build + cloud simulator | TestFlight on an iPhone | Development build on an iPhone | Rented Mac | |
|---|---|---|---|---|
| Needs a Mac | No | No | No | No (you rent one) |
| Needs an iPhone | No | Yes | Yes | No for simulator; yes for device testing |
| Needs an Apple Developer account | No for simulator builds | Yes, $99 per year | Yes, $99 per year | Only to sign for a device |
| Time to first run | One cloud build (about 23 minutes average in Expo's pipelines), then session boot | Build, upload, 5 to 10 minutes of processing; Beta App Review for external testers | Build plus device registration; 24 to 72 hours on new memberships | 24-hour minimum on EC2; monthly on MacStadium; plus Xcode install |
| Cost | Build minutes plus simulator session time; EAS Free plan includes 15 iOS builds | $99 per year plus build minutes | $99 per year plus build minutes | From $109 per month (MacStadium Mac mini) or per-second EC2 after 24 hours |
| Best for | Non-developers, agents, Linux teams; nothing to install | Testers outside the team; near-release builds | Live reload on real hardware | Native debugging in Xcode |
Sources: Expo, Expo TestFlight guide, Expo internal distribution, Apple, MacStadium, AWS, Expo pricing.
Where Expo fits
For a React Native app, Expo covers the build half and the simulator half of option 1, and the cloud build for option 2.
EAS Build produces the binary. EAS Build compiles iOS apps on Expo's macOS workers from any host OS. To get a simulator build, set ios.simulator on a build profile:
A simulator build needs an Expo account and no Apple Developer account, per the iOS Simulator build guide. For a device, eas build --platform ios --profile development produces a development build, and the development builds docs are explicit that "all builds that run on an iPhone device require a paid Apple Developer account for build signing". EAS Build also makes "iOS builds from any operating system" possible, which is the whole point on Windows.
Expo Simulators runs it in the browser. Expo Simulators starts an iOS or Android simulator on Expo's infrastructure, installs a build, and streams it. The EAS CLI reference lists the commands: eas sim:start (alias eas sim) with --platform ios|android and a --build-id flag that takes an EAS Build to install and launch. Session length is controlled with --max-duration-minutes and --max-idle-time-minutes. For an iOS session the CLI prints a web preview URL to open in your browser.
Expo's eas-simulator skill documentation lists three build types a session can install: local release builds (.app for iOS, .apk for Android), EAS Build artifacts by URL, and local development builds paired with a tunnel for live reload. Starting a session needs an EAS project (eas init) with ios.bundleIdentifier set in the app config, and you must be logged in to EAS CLI or provide EXPO_TOKEN. The same page notes that --max-duration-minutes is "paid-plan only; otherwise a default applies", and that sessions bill until you stop them with simulator:stop.
Automated tests without a Mac. The maestro job in EAS Workflows takes a simulator build ID and a flow path and runs end-to-end tests on an iOS Simulator on Expo's Macs. The E2E example shows a build profile with withoutCredentials: true and ios.simulator: true feeding the test job. Maestro jobs are in alpha.
Limitations
Expo Simulators is in early access with a waitlist, as the Expo Simulators page states, and the commands in the EAS CLI are marked experimental. Not every account has access yet. Sessions install the build types listed above. A simulator does not test the camera, push notifications or device performance.
Expo Go, the sandbox app, runs on Android from the Play Store. The current guide to setting up your environment says installing Expo Go on an iOS device requires an Apple Developer Program membership and a TestFlight install via npx eas-cli@latest go. EAS Build's Free plan includes up to 15 iOS builds; simulator session time counts toward EAS compute usage on the pricing page.
Key facts for testing iOS without a Mac
| Fact | Value | Source |
|---|---|---|
| Xcode 27 minimum macOS | macOS Tahoe 26.6 or later | Apple |
| macOS virtual machines allowed | Up to 2 per Apple-branded computer you own or control | Apple macOS SLA |
| Apple Developer Program | $99 per year | Apple |
| TestFlight internal testers | 100 | Expo TestFlight guide |
| TestFlight external testers | 10,000 per app; Beta App Review on first build of each version | Expo TestFlight guide |
| TestFlight build expiry | 90 days | Apple |
| Ad hoc devices | 100 iPhones per account per year | Expo internal distribution |
| EC2 Mac minimum | 24 hours, then per second | AWS |
| MacStadium entry Mac mini | $109 per month | MacStadium |
Next step
If you have a React Native project and no Mac, add a simulator: true profile to eas.json and run eas build -p ios --profile preview. The iOS Simulator build guide is the shortest route to a build you can run in a hosted simulator. If you have an iPhone and an Apple Developer account, follow the TestFlight guide instead.
Verified on 12 September 2026.
