Until quite recently I hadn’t got around to building a mobile app, but I had a vague idea about the “native” vs “web” debate. In iOS, “native” means the application was built using Swift and UIKit, Apple’s APIs and programming language that are deeply linked to the operating system and provide a unified interface across applications, as well as many performance benefits. On Android, which I don’t understand quite as well, it seems like Java or Kotlin are usually required to properly write “native” Android apps. Most large software companies will have two separate teams for iOS and Android, and build two separate apps with the different native toolkits.
On the other end of the spectrum, there are several solutions that allow you to develop from a single code base, and then create builds for both mobile architectures. Usually this involves building a web application, and then compiling it to the native languages, and usually there are some sacrifices: older APIs for compatibility, performance, binary size, etc. The fact that most large companies still have two teams, and are willing to absorb the overhead and cost associated with that, suggest that these sacrifices are usually a little too much if you want truly high quality apps in both ecosystems.
React Native is another step in this direction: it lets you write a React web application and then transpile it to native binaries. Combined with some automatic build systems like Expo, and of course a subscription to the Apple Developer Program, paid for with a grimace, I found React Native gives a very fast and simple way to write, build and deploy apps for iOS - of course, the experience is particularly good if you happen to already know React. I didn’t try Android because I don’t have a device, but I think the additional effort would have been minimal (but still not free).
Indeed, with the following toolkit:
- react-native
- npx
- expo
You can create and submit an app to the App store in just five commands:
npx create-expo-app your-app
cd your-app
expo start
eas build
eas submit --platform ios
Now all you have to do is actually make something!