Let’s get one something straight.
There are few reasons your app shouldn’t be available on both iOS and Android. Unless you are building something niche and specific which fully exploits the underlying platform APIs, you will want the app to be available on as many platforms as possible. Shipping only an Android or iOS app results in a lot of potential customers not becoming your actual customers.
Yes, you will have to write a just an Android app if you are trying to build an SMS organiser. Same is the case if you want to write an Apple TV/Apple watch app. If that’s not the case, let’s just agree that you need to build apps for both Android & iOS with mostly same features.
At this point, you have a choice to make. There are broadly two categories.
- Platform specific: Swift & Kotlin
- Cross platform: React Native/Flutter/Hotwire
If you choose this path, you will be writing the same features twice. One for iOS using Swift, and another for Android using Kotlin. You need double the resources/time to produce same results. Because you are writing platform specific code, you are going to have two implementations of the following:
- Networking module
- Local persistence
- Business logic
- Majority of the UI
If you like the “do not repeat yourself” principle, this should immediately be a deal breaker.
With a cross platform technology like React Native or Flutter, you will be able to share majority of the code. I am talking 90%+ here. You can iterate faster, and do more in less time with smaller teams. While each of these cross platform technologies have their pros & cons, here are the (subjective) thumb rules to choose a cross platform technology.
Hotwire: Choose this if you like majestic modular monoliths. Easiest to support web, iOS, Android using just HTML, CSS, and vanilla JS. You don’t even have to write any APIs!
React Native: Choose this if you have a lot of experience with ReactJS. You can also create a web version using react-native-web, though I am not a fan of huge JS bundles on web.
Flutter: Choose this if you are not already a ReactJS developer, or want something better.
There is also Xamarin and Kotlin multiplatform. I am not commenting on those as I don’t have any experience with either of those.
Cross platform apps have performance & UX issues:
Not true. While you can write bad code in any language, there isn’t anything inherent to these technologies that prevents you from reaching 60FPS rendering. Stick to the performance guidelines, and you won’t encounter issues in majority of the use cases. A lot of big apps such as Facebook, Instagram, Nubank, Google Ads, Gpay, and more make use of cross platform technologies while providing great performance & user experience.
Cross platform apps are not “native”, and thus inferior:
This accusation has its roots in confusing native code for native behaviour. The navigation transitions, certain UI elements and UX patterns which provide native feel are all available on cross platform technologies. There is also a hint of superiority complex disguised as a tech opinion in that accusation.
Native behaviour matters to users, not platform specific code.
You cannot do everything using a cross platform technology:
Yes, but this is not an issue at all. React Native & Flutter both allow you to write native code where necessary. You can write simple views to entire libraries and screens in platform specific code.
Needing some parts of your app be written in platform specific code isn’t a good enough reason to write the whole app that way.
While you read thus far, you might have noticed that I am not using native vs. hybrid. That’s because it makes no sense to use “hybrid” to refer to React Native or Flutter apps. These are not rendered in a webview, and thus quite “native”.
So go ahead, and write a cross platform app!