I’m trying to write an app with React Native because that’s the only sane way to write most cross-platform apps these days. You write it once and it works on iOS and Android, in the same way most modern Graphical Toolkits work on all desktops.
But you can’t compile an app for iOS without macOS. Specifically, you can’t compile it without XCode.
That's not all. You can’t run Xcode on "non-Apple branded hardware", which means:
- you can't run XCode in a macOS VM, which is itself illegal anyway.
- you can't run XCode on Darling (a macOS➜Linux translator) unless you’re using Darling on an "Apple-branded" computer running a GNU/Linux distribution.
Additionally, if you have a Mac computer that isn’t supported by the last major update but is still supported for 2 years of security updates, you can’t install the latest version of XCode, which allows you to compile apps for the latest version of iOS. This makes it functionally useless—your app will only be guaranteed to be supported by phones older than the newest version.
Finally, you need to pay Apple $99 a year to be a developer.
I already own a macOS computer; an Intel iMac. As I’m sure anyone in the space well understands, Intel Mac computers are being retired soon. Sometime in 2025, or maybe 2026, Apple will stop producing a build of the newest macOS version that works on x86 Intel CPUs.
This means I can’t even force my Mac computer to run the latest version of macOS with Open Core Legacy Patcher. There is no viable way to bridge the gap between my x86 Mac and Apple’s new ARM Macs.
There are three more methods I could try:
Macincloud offers macOS computers you can access remotely in order to compile your app. It costs $28 a month (minimum) at the time of writing. In about 3 years, it will cost more than owning a Mac Mini, and that’s not factoring in the latency, code signing, etc. I’m sure Apple gets a cut of this somehow too due to some obscure licensing rule. This is not viable for me.
I could install a GNU/Linux distribution on my iMac, and then compile Darling, and then run XCode. This is legal because I’m using “Apple-branded” hardware to run XCode. However, Darling does not seem to be able to run the latest version of XCode, putting me in the same spot, and it’s still not very reliable. It’s a very cool project, though, and maybe it will be a viable option in two years.
I could use Expo. Expo is heavily-pushed in the official documentation for React Native, and in almost every unofficial tutorial for React Native. That’s because it’s really, really easy to get started with React Native when you use Expo compared to setting up the toolchain yourself. You can even build an iOS and Android app using Expo’s servers…for free. No need to have Android Studio or XCode installed.
You can even publish your app with Expo. And you still don’t need to pay them any money for the first 30 production builds (a maximum of 15 for iOS) a month. It also has some constraints on the size of the app, but that’s almost certainly enough for most small developers. Even if you need to pay, it’s only $1-4 per build, which is fairly reasonable. Sounds like an amazing deal, right?
Yeah, it does. There are a few things to watch out for. The biggest one is that it’s painful to add third-party libraries Expo doesn’t already support to an Expo Go app. It’s possible, but not fun. You also end up depending on quite a lot of Expo-specific features not in React Native, and it may not support as many features as React Native. Flatlogic’s article from 2020 provides some more detailed ideas of what to consider. It's possible not all of this criticism still applies, but most of it still seems to.
Paying for the service isn’t an issue (especially at those prices), but I want to maintain a smaller dependency tree if possible, use third-party libraries when necessary, and I’m wary of other disadvantages. Depending on hundreds of libraries I haven't examined is worrying—Flatlogic talks about how Facebook's libraries were being kept active for Expo projects until 2017, meaning it's possible user's data was being collected. That worries me. I realise I'm already inviting that sort of concern by using React Native in the first place, but I don't want to make it worse. For now, I don’t want to use Expo.
So, none of those options are viable for me.
To continue maintaining the app, I would need to buy a Mac Mini (Apple’s cheapest computer costs $999), probably at the start of 2025. That’s really my only option.
Here’s how it looks on Android:
You can run Android Studio on Windows, macOS, Linux, and ChromeOS. As long as you have Java 11 (we’re on Java 21 now), you’re good. It's even possible to run it unofficially on FreeBSD. You can compile Android apps and run an Android emulator easily. You pay $25 one time to become a developer forever.
That’s it. That’s the deal.
If I don't want to pay Google $25 for the privilege of making my apps available in the Google Play store either, I can release a .apk file on my website that anyone on an Android-based operating system can install, for free. Users could manage updates with Obtainium.
On iOS, you can install them from the App Store and that's it.
On desktop operating systems, you don't need anyone's permission to write software that anyone can install. Not on Microsoft Windows, macOS, FreeBSD, or any GNU/Linux distribution. You just write the code, produce a binary, and the user can install it. Sure, Microsoft and Apple try to stiff you on "protection fees" by forcing you to pay for signatures that show you are an authorised vendor and the software is unlikely to be malware, but that's optional. You might have your customers running scared if you don't pay the cartel, but it isn't a requirement.
iOS is not like this. Users are not free to use whatever software, from whatever vendor, in whichever way they please. It's the Apple App Store, or nothin'. iOS is the only consumer-facing platform which prevents you from even compiling software for it without specical hardware.
Apple makes app development hard. The hard part should be writing the program, but Apple has added friction to every part that comes afterward.
The worst part is, I'm willing to put up with it. It isn't the customer's fault their phone company is a tyrant. So, I put up with it, and I write long, rambling rants about it.