Guide

Build your iOS app from Windows, one framework at a time

You can write a Flutter, React Native, Unity, Godot or MAUI app on Windows. The iOS build is the one step that needs a Mac. Every one of these tools hands the last mile to Xcode. This page lists what you run on the Mac for each framework. It also shows how to upload the result.

What needs a Mac, per framework

This is what each project's own docs say, read on October 18, 2026.

  • Flutter: the iOS release guide says Xcode is required and you must use a device running macOS. Your Dart code and your Android builds can stay on Windows or Linux.
  • React Native: the App Store guide does the release build in Xcode. JavaScript work and Jest tests run on any system.
  • Expo: EAS Build runs iOS builds on macOS machines in Expo's cloud, so you may never need a Mac of your own.
  • Unity: the editor writes an Xcode project, and Xcode builds the app from it. Unity says a local iOS build needs macOS.
  • Godot: the docs say you must export for iOS from a computer running macOS with Xcode installed. So even the export step moves to the Mac.
  • .NET MAUI: Visual Studio on Windows connects to a Mac over SSH, and the Mac compiles and signs the app.

Two older guides cover the general case. Read publishing without a Mac for API keys, signing and TestFlight. Read Xcode on Windows for the remote screen and keyboard. This page sticks to the commands.

Before you start: account and signing

  • You need a paid Apple Developer Program membership. It is 99 USD a year.
  • Create the app record in App Store Connect, which works from any browser.
  • Add your Apple Account to Xcode on the Mac, then pick your team under Signing and Capabilities.
  • Leave Automatically manage signing on, so Xcode makes the certificate and the profile for you.

Flutter: flutter build ipa

Install Flutter on the Mac and clone your repository there. Then run this one command in the project folder:

flutter build ipa

Flutter's docs say this writes an .xcarchive to build/ios/archive and an .ipa to build/ios/ipa. Use --build-name and --build-number to set the version. Flutter documents three ways to upload the result. You can drag the .ipa into Apple's Transporter app on the Mac. You can open the archive in Xcode and click Distribute App. Or you can upload from the terminal with an App Store Connect API key:

xcrun altool --upload-app --type ios -f build/ios/ipa/*.ipa \
  --apiKey your_api_key --apiIssuer your_issuer_id

React Native: archive in Xcode

The React Native guide does the release in the Xcode window. Install the pods first, then open the workspace:

cd ios
bundle exec pod install
open MyApp.xcworkspace
  • In Product, Scheme, Edit Scheme, set the Run build configuration to Release.
  • Set the device to Any iOS Device (arm64), then choose Product, then Archive.
  • In the archive window, click Distribute App, then App Store Connect, then Upload.

The build then shows up in App Store Connect under TestFlight. To release from the terminal instead, use xcodebuild archive and -exportArchive, with the flags from our publishing guide. For the full Windows and Linux workflow, see React Native iOS builds without a Mac.

On Expo, you can skip the Mac for builds. Run this from Windows, and the build happens on Expo's macOS runners:

eas build --platform ios

You still need a Mac when you want the Simulator or Xcode's debugger.

Unity: build on Windows, archive on the Mac

In Build Settings, pick iOS and click Build, and Unity writes a folder with an Xcode project. The Run in Xcode option only shows on macOS, so on Windows you stop there. Copy the folder to the Mac over SSH:

scp -r Builds/iOS you@your-mac:~/MyGame-iOS

On the Mac, open the .xcodeproj inside that folder. Pick the Unity-iPhone scheme, which is the launcher target that runs UnityFramework. Set the device to Any iOS Device, then choose Product, then Archive. Distribute it from the Organizer window like any other iOS app.

A large game makes a large folder, so copy time depends on your upload speed. Unity also offers Build Automation, which builds the game in Unity's cloud.

Godot: export on the Mac

Godot's iOS export runs on macOS only. Install Godot and its export templates on the Mac, then open your project there.

  • Open Project, then Export, then click Add and pick iOS.
  • Fill in App Store Team ID and Bundle Identifier, since the exporter requires both.
  • The Team ID is a 10 character code, not your name as Xcode shows it.
  • Click Export Project and pick an empty folder for the files.
  • Open the .xcodeproj it writes, then choose Product, then Archive.

.NET MAUI: pair Visual Studio to the Mac

Microsoft's Pair to Mac feature runs the Mac builds over SSH, so Remote Login must be on. Xcode must be installed by hand and opened once. Microsoft also asks for Mono, and for Rosetta on Apple silicon. In Visual Studio, open Tools, iOS, Pair to Mac. If the Mac is not listed, add it by its address.

You can also publish from the Windows command line. This is Microsoft's example for Visual Studio 2026, minus the password:

dotnet publish -f net8.0-ios -c Release -p:ArchiveOnBuild=true \
  -p:RuntimeIdentifier=ios-arm64 \
  -p:CodesignKey="Apple Distribution: John Smith (AY2GDE9QM7)" \
  -p:CodesignProvision="MyMauiApp" \
  -p:ServerAddress={macOS build host IP address} \
  -p:ServerUser={macOS username} -p:TcpPort=58181 \
  -p:_DotNetRootRemoteDirectory=/Users/{macOS username}/Library/Caches/maui/PairToMac/SDKs/dotnet/

Change net8.0-ios to your own target framework. With no password flag, Pair to Mac uses the SSH keys it saved on the first connection. The signed .ipa lands under bin\Release on your PC. Microsoft points to Transporter for the upload.

Uploading: what Apple lists today

Apple's upload page names four tools: Xcode, Swift Playground, altool and Transporter. It says Transporter and altool support every target type, and it gives no end date for altool. Transporter is a macOS app, but its command line version also runs on Windows with some limits. Our publishing guide explains those limits.

Cloud builds or a rented Mac?

Start with what you need. If you only need an .ipa now and then, a cloud build may be enough. Codemagic, EAS Build and GitHub Actions macOS runners all build iOS apps. Our GitHub Actions guide shows one setup.

A rented Mac fits other jobs. You may need the Simulator to check a screen, or Xcode's debugger for a crash. A signing error is easier to fix in the Xcode window. And some teams want to watch each step of a release as it happens.

Release day on a $15 Mac

Many apps ship only a few times a year. For that, a MacRun day pass costs $15, paid once with no renewal. A week is $59, which leaves time for a fix after review. If you ship every few weeks, monthly plans start at $139.

  • You get a dedicated Mac mini, not a shared one, with admin rights.
  • Xcode 27.1 is the default, and Xcode 26.6 is installed for older projects.
  • The iOS 27.1 simulator, including iPhone Duo, is already installed.
  • The Mac is ready to use in under 5 minutes.
  • SSH and screen sharing run over a private Tailscale network from Windows or Linux.

The Mac is wiped when the pass ends. Push your code and copy your signing files off before then.

Frequently asked questions

Can I build an iOS app on Windows?

+

You can write it on Windows. The iOS build needs Xcode, which runs only on macOS. Use a rented Mac, a CI runner or a cloud build service for that step.

Can Flutter build iOS on Windows?

+

No. Flutter's iOS release guide says you must use a device running macOS for this step. Run flutter build ipa on a Mac, then upload the .ipa with Transporter, altool or Xcode.

Can I build a React Native iOS app without a Mac?

+

With Expo, yes, because EAS Build runs iOS builds on macOS machines in Expo's cloud. Without Expo, you need a Mac to archive the app in Xcode.

Can Unity build for iOS on Windows?

+

Unity writes the Xcode project. Xcode then builds the app, and Xcode runs only on macOS. Copy the project to a Mac and archive it there, or use Unity Build Automation.

How do I upload an iOS app from Windows?

+

Apple's Transporter command line tool runs on Windows. It still needs a file that Xcode exports with the build, so the build itself comes from a Mac.

Related guides