Journal

Do I Need a Mac to Publish an iOS App? Not Anymore

Choose the framework first and the hardware question answers itself.

Do I Need a Mac to Publish an iOS App? Not Anymore: a reflective 3D App Store icon on a blue and purple gradient

TL;DR

No Mac needed in the Expo lane: EAS Build compiles iOS binaries on cloud Macs, manages certificates, and submits to App Store Connect from Windows or Linux, with Expo Go turning your iPhone into the live preview and the $99 developer account as the only unavoidable cost. The Mac survives for native Swift/SwiftUI work, where Xcode still rules, rentable by the hour or bought used when that lane is genuinely yours. Add a free VP0 design as the visual reference and the professional look is OS-independent too.

No, you do not need a Mac to publish an iOS app anymore, provided you build in the lane where the Mac’s jobs moved to the cloud: React Native with Expo, where EAS builds your iOS binaries on hosted macOS machines and EAS Submit uploads them to App Store Connect from any operating system. A Windows or Linux builder with an agent, an iPhone for testing, the $99 Apple developer account, and a free VP0 design for the visual system can take an app from first prompt to public App Store without touching a Mac. The honest asterisks: native Swift development still requires Xcode and therefore a Mac, some debugging situations are simply easier on one, and the no-Mac path leans on cloud services with their own free-tier limits. Where the Mac requirement genuinely ended, where it survives, and the complete no-Mac workflow.

What the Mac was actually needed for, and what moved

The question deserves precision, because the historical Mac requirement was never one thing but four distinct jobs: compiling iOS binaries (Xcode runs only on macOS), signing them with Apple certificates, uploading to App Store Connect (once Application Loader, now built into Xcode or the Transporter app), and testing on simulators. The cloud-build generation unbundled them. Compilation: EAS Build, and equivalents like Codemagic and Bitrise, run the Xcode toolchain on their own Mac fleets, taking your JavaScript-and-config repo and returning a signed .ipa. Signing: EAS manages certificates and provisioning profiles programmatically through Apple’s APIs, which for most builders is not a workaround but an upgrade over juggling certificates by hand. Upload: EAS Submit and Transporter-equivalent APIs deliver the binary to App Store Connect from any OS. Review, metadata, screenshots, and everything else in App Store Connect: always was a website, works from any browser on any machine.

What did not move: Xcode itself, and with it native Swift and SwiftUI development, on-device debugging through Xcode’s instruments, and the iOS Simulator. The lane you build in therefore decides the answer, which is the single most important sentence on the whole topic.

The lane decides: Expo yes, native Swift no

In the Expo lane the no-Mac story is complete and routine, not exotic: the agent, Claude Code or Cursor in the standard Cursor-Expo pairing, writes the React Native code on any OS, Expo Go previews it live on your physical iPhone during development, EAS builds in the cloud, TestFlight distributes betas, and App Store Connect handles submission from the browser. Thousands of shipped apps ran exactly this pipeline end to end, and nothing in it is a hack or a beta: every piece is the vendor’s own supported workflow. The iPhone in your pocket replaces the Simulator for daily testing, and is honestly a better test device anyway, since real hardware catches what simulators smooth over.

In the native lane the Mac survives: SwiftUI development means Xcode, and Xcode means macOS, with the practical workarounds being rented cloud Macs (MacStadium and friends, by the hour or month) or the used-Mac-mini route, which remains the cheapest permanent fix at a few hundred dollars secondhand and earns its desk space the month the cloud-Mac hours start recurring. The decision is therefore upstream of hardware: choose the framework first, and the SwiftUI-versus-React-Native question answers itself for most no-Mac builders, Expo unless you have a specific native conviction, in which case budget the Mac as part of that conviction’s cost.

TaskMac needed?The no-Mac route
Writing the app (React Native/Expo)NoAny OS, agent + editor
Previewing during developmentNoExpo Go on your iPhone
Compiling the iOS binaryNoEAS Build’s cloud Macs
Certificates and signingNoEAS-managed credentials
TestFlight + App Store submissionNoEAS Submit + browser
Native Swift/SwiftUI developmentYesCloud Mac rental or used Mac mini
Deep native debuggingMostlyCloud Mac for the rare session

The complete no-Mac workflow, start to store

Concretely, on a Windows or Linux machine with nothing Apple-flavored installed. Setup day: install Node and the Expo tooling, create the project with the agent, put a free VP0 design in front of it with palette, type scale, and spacing stated as constraints, so the app has an intentional look from the first screen, and install Expo Go on your iPhone, which from then on shows every change live over Wi-Fi, no cable, no build step, no Mac. Build weeks: the standard agent rhythm, spec-driven, card-sized sessions, works identically on any OS, with Supabase as the backend and the same review discipline on money and permissions code that the no-Mac question does not change. The free-until-the-gate economics also hold identically: everything is $0 until the Apple developer account.

Shipping weeks: pay the $99, let EAS handle credentials, run the cloud build, and send it to TestFlight without leaving the terminal, then finish in the App Store Connect browser tab, metadata, honest privacy labels, screenshots taken from your physical iPhone, account deletion wired if you have accounts. Review interacts with you by email and the website; no stage of it knows or cares what your laptop runs, and rejections arrive with the same reasons and the same appeal paths on every OS. The first submission’s learning curve is real but OS-independent, and the review-rejection trio, mismatched privacy labels, missing deletion, placeholder residue, is the thing to pre-empt, not the hardware.

Choosing among the cloud-build services

EAS is the default answer in this lane because it is Expo’s own, but the slot has real alternatives worth a paragraph each. Codemagic and Bitrise are general-purpose mobile CI services whose Mac fleets build React Native and Flutter alike, with more pipeline configurability than EAS and correspondingly more setup, the right choice when the project already lives in a CI-heavy team workflow rather than a solo-founder one. GitHub Actions offers macOS runners that can run Fastlane-driven iOS builds, the most transparent and most do-it-yourself route, where you own every YAML line and every certificate step, educational and occasionally worth it, rarely the fastest path for a solo builder. The selection heuristic mirrors every other slot in the stack: the managed, boring default until a concrete need argues otherwise, because each step down the DIY ladder converts subscription cost into your evenings.

Whichever service compiles the binaries, one practice keeps the lane healthy across all of them: keep the native configuration, bundle identifiers, entitlements, version numbers, in the repo’s config files rather than clicked into dashboards, so the agent can read and modify the whole truth of the app, and a build service swap, should it ever come, is a config change rather than an excavation.

The honest frictions of the no-Mac path

Four frictions deserve naming, none fatal, all plannable. Cloud-build latency: an EAS iOS build takes minutes-to-tens-of-minutes in a queue rather than seconds locally, which changes the rhythm, you batch native-config changes and lean on Expo Go’s instant JavaScript reload for everything else, and the free tier’s monthly build quota rations the habit further. Native-module edges: the moment the app needs a custom native module outside Expo’s ecosystem, you are writing Swift or Objective-C, and while EAS still compiles it in the cloud, debugging native crashes without Xcode is genuinely painful, the rare-session cloud Mac being the pressure valve. Simulator absence: some visual QA, testing many device sizes, is clumsier with one physical iPhone than a simulator fleet, partially offset by Expo’s web preview and by the truth that one real device beats five simulated ones for finding real problems. And Apple-account ceremonies: occasional verification steps assume Apple hardware exists somewhere in your life, and a friend’s borrowed Mac for one afternoon a year covers the residue comfortably.

The pattern across all four: the no-Mac path is not a degraded Mac path but a different rhythm, cloud-batched natives, device-first testing, and it suits the agent workflow unusually well, since the agent neither knows nor cares where the compiler runs. There is even a quiet advantage in the constraint: builders who cannot poke the native layer casually tend to stay inside Expo’s well-supported surface, which is precisely the surface where agents are most reliable, cloud builds are most reproducible, and the app remains upgradeable when the next iOS version lands. The Mac-less limitation, lived with deliberately, doubles as an architecture discipline.

Key takeaways: publishing iOS apps without a Mac

The Mac requirement ended for the Expo lane and survives for the native lane: EAS builds, signs, and submits iOS apps from any OS, Expo Go turns your iPhone into the live preview, and App Store Connect is a website, while Swift and Xcode still mean macOS, rented or bought used when genuinely needed. Choose the framework first and the hardware question answers itself: Expo plus an agent plus a free VP0 design ships a professional-looking app from Windows or Linux with $99 as the only unavoidable cost. Respect the frictions, batched cloud builds, device-first testing, a cloud Mac for rare native debugging, and the no-Mac path is a routine, not an adventure.

Frequently asked questions

Do I need a Mac to publish an iOS app? No, in the React Native/Expo lane: EAS Build compiles your iOS binary on cloud Macs, EAS manages the certificates, EAS Submit uploads to App Store Connect, and the store’s whole review process is a website, so Windows or Linux plus an iPhone for testing covers the entire journey. Yes, still, for native Swift/SwiftUI development, which requires Xcode and therefore macOS, rentable by the hour or bought as a used Mac mini when that lane is genuinely yours. Choose the framework first; the hardware question follows from it.

How do I test my iOS app without a Mac? With the iPhone you already have: Expo Go previews the app live over Wi-Fi during development, reloading on every change, and TestFlight installs the real cloud-built binary for honest end-to-end testing once the $99 developer account exists. What you give up is the Simulator’s device-size fleet, partially covered by Expo’s web preview, and the compensation is real: one physical device surfaces real-world issues, touch targets, performance, glare-legibility, that simulators smooth over.

Can I build a professional-looking iOS app from Windows? Yes, and the design side is OS-independent entirely: point your agent at a free VP0 design from the first prompt, restate its palette, type scale, and spacing as constraints, and the generated screens inherit an intentional, native-feeling look regardless of where the code was written. The professional look was never a hardware property; it is a reference-and-constraints property, and the audit passes that keep it, type, color, spacing, platform behavior, run from any OS with a browser and your phone.

What does the no-Mac path cost compared to buying a Mac? The recurring costs are identical, $99 a year for the developer account, free tiers for Expo, EAS’s build quota, and Supabase at validation scale, so the comparison is the hardware itself: $0 versus several hundred dollars used or four figures new, against the no-Mac frictions of queued cloud builds and clumsier native debugging. The honest arithmetic: builders staying in the Expo lane rarely miss the Mac, while anyone drifting toward native modules eventually rents one by the hour, and a used Mac mini pays for itself only when those hours accumulate.

What happens when my app needs a native module Expo does not cover? EAS still compiles custom native code in the cloud, so the build pipeline survives, but development honesty drops: you are now writing Swift or Kotlin the agent can draft but you cannot locally debug, and a native crash without Xcode is read through logs rather than instruments. The working pattern is containment: exhaust Expo’s large module ecosystem first, isolate any custom native code into the smallest possible surface, and budget a cloud-Mac session for its debugging rather than pretending the need away.

Questions VP0 users ask

Do I need a Mac to publish an iOS app?

No, in the React Native/Expo lane: EAS Build compiles on cloud Macs, manages certificates, and submits to App Store Connect, whose review process is a website, so Windows or Linux plus an iPhone covers the journey. Yes, still, for native Swift/SwiftUI development, which requires Xcode and macOS, rentable hourly or bought used. Choose the framework first; the hardware follows.

How do I test my iOS app without a Mac?

With your iPhone: Expo Go previews live over Wi-Fi during development, and TestFlight installs the real cloud-built binary once the $99 account exists. You give up the Simulator's device fleet, partially covered by Expo's web preview, and gain a real device that surfaces issues simulators smooth over.

Can I build a professional-looking iOS app from Windows?

Yes: the look is a reference-and-constraints property, not a hardware one. Point the agent at a free VP0 design from the first prompt, restate its palette, type scale, and spacing as constraints, and the screens inherit an intentional, native-feeling look regardless of where the code was written.

What does the no-Mac path cost compared to buying a Mac?

Recurring costs are identical ($99 account, free tiers), so the comparison is hardware: $0 versus hundreds used or four figures new, against queued cloud builds and clumsier native debugging. Expo-lane builders rarely miss the Mac; native-module drift eventually rents one hourly, and a used mini pays off only when those hours accumulate.

What happens when my app needs a native module Expo does not cover?

EAS still compiles custom native code in the cloud, but you are now writing Swift the agent can draft and you cannot locally debug. Contain it: exhaust Expo's module ecosystem first, isolate custom native code to the smallest surface, and budget a cloud-Mac session for its debugging.

Part of the React Native & Expo: Mobile Frontend Architecture hub. Browse all VP0 topics →

Keep reading

Webflow to React Native: the Expo WebView route and its limits: a glowing iPhone home-screen icon on a purple and blue gradient
Guides 10 min read

Webflow to React Native: the Expo WebView route and its limits

Wrapping a Webflow site in a React Native WebView is fast but risky for the App Store. Here is the WebView route, where it breaks, and the native rebuild.

Lawrence Arya · June 10, 2026
Expo Background Tasks UI: Processing Without Promises: the App Store logo as a glossy glass icon on a purple and blue gradient with floating bubbles
Guides 5 min read

Expo Background Tasks UI: Processing Without Promises

Build Expo background tasks and the UI around them: the opportunistic-scheduling truth, what fits the budget, honest toggle copy, and last-synced timestamps.

Lawrence Arya · June 5, 2026
React Native Step Counter Widget for iOS: How It Works: a glass iPhone UI wireframe icon on a holographic purple gradient
Guides 6 min read

React Native Step Counter Widget for iOS: How It Works

A home-screen step widget can't be pure React Native. Here is how the native WidgetKit extension, an App Group, and your step data fit together on iOS.

Lawrence Arya · June 4, 2026
React Native Deep Linking and the Unhandled URL UI: a glass iPhone UI wireframe icon on a holographic purple gradient
Guides 4 min read

React Native Deep Linking and the Unhandled URL UI

How to handle deep linking in React Native and Expo, with a graceful unhandled-URL fallback instead of a blank app when a link matches no route.

Lawrence Arya · June 2, 2026
Full-Stack React Native Expo + Supabase Template, Free: a glowing iPhone home-screen icon on a purple and blue gradient
Guides 5 min read

Full-Stack React Native Expo + Supabase Template, Free

Want a full-stack React Native Expo + Supabase starter? Generate your own from a free design plus Supabase auth, database, and storage, with Claude Code or Cursor.

Lawrence Arya · June 1, 2026
Port Vercel v0 Components to React Native and Expo: a glass iPhone app-grid icon on a mint and teal gradient
Guides 4 min read

Port Vercel v0 Components to React Native and Expo

v0 outputs React web with Tailwind. Here is how to map its components into a React Native and Expo iOS app with NativeWind, plus the pitfalls to avoid.

Lawrence Arya · June 1, 2026