Answers · Mobile

Do I need a Mac to build and submit an iOS app?

Practically, yes. Xcode runs only on macOS and it is what archives, signs and uploads an iOS build. Cloud macOS runners and rented Macs work and add cost and latency. Android has no equivalent constraint: the Android shell builds on Linux, macOS or Windows.

What the Mac is actually for

Three things: opening the project in mobile/ios, producing a signed archive, and uploading it to App Store Connect. Everything before that, which is most of the work, is Rails.

bin/dev
open mobile/ios

The ways around it, honestly assessed

A cloud macOS CI runner. GitHub Actions and several others offer macOS runners. This works, and it is the sensible answer if you already have CI. The cost is minutes billed at a higher rate and a slower loop when signing goes wrong, which it will the first time.

A rented Mac. Reliable, monthly, and it is a real machine you can debug on.

Neither. Ship Android first. The Play Console has no macOS requirement anywhere in the path, so you can have an app in a store while you decide whether iOS is worth the tooling.

Android is genuinely unconstrained

open mobile/android

Android Studio runs on all three desktop platforms and produces a signed App Bundle on any of them. If the goal is to have a mobile app at all rather than specifically an iOS one, this is the shorter path.

What a Mac does not save you

The 99 dollar Apple Developer Program membership, which is separate. And the review, which is the same regardless of what built the binary.

Plan the order

Web first, because that is where the screens come from and they work in both shells. Then whichever store your users are actually in. The shells in mobile/ios and mobile/android both point at the same Rails app, so shipping one does not commit you to the other or duplicate any work.

Related questions

How do I set the app icon and name for a Hotwire Native shell?

The icon is an asset catalog entry in the shell project and the display name is a value in its configuration, both under mobile/ios or mobile/android. Unlike your screens, these are compiled in, so changing either needs a new build and a new submission. Set them before your first upload.

How do I test a Hotwire Native app against a local dev server?

Change the URL in the shell to your machine's LAN address, such as http://192.168.1.20:3000. An iOS simulator can reach localhost but a physical device cannot, because localhost on the phone is the phone. Both platforms also block plain HTTP by default, so development needs an explicit exception.

Can I put a Rails app in the App Store and Play Store?

Yes. Hotwire Native wraps your existing web views in a native shell, so the screens you already built are the screens in the app. One Shot ships both shells in mobile/ios and mobile/android. The rule you cannot route around is that digital subscriptions have to use the platform's in-app purchase, not Stripe.