Background
I’ve been an Android & iOS developer for around 11 years now. Working on Android since Froyo (v2.2), and iOS since v4 (Objective-C, Pre ARC, Hardcore).
Cross platform has always been a thing and it has always, always been terrible. PhoneGap 🤮, Xamarin, just WebViews inside a native app. They never feel nice, they never look nice.
Feel?
There’s just something off. Scrolling physics, transitions, touch feedback.
- Scrolling: The web scrolls differently to iOS and Android. There might be a lack of fling, speed, and responsiveness
- Transitions: iOS should animate in from the side in a Nav Controller, up for a Modal. Android, not as important, but Material transition should enter with alpha fade from the bottom. In cross platform there has been a lack of transitions altogether, or one that feels very alien.
- Touch Feedback: iOS generally uses an opacity shift to indicate touch, Android an elevation change. A lot of the time in cross platform there isn’t any change.
Looks?
Some kind of web UI, brought across to an app. Or an iOS component rendered on Android.. this is STILL live in the National Rail app, after all these years:
So what’s changed?
Personally I think one of the biggest changes is not in the cross platform frameworks, but in design. It is VERY rare these days that you’ll start working on an app, and you get:
Designer: Hey, heres the wireframe, just use all the standard controls from UIKit and Android, use this colour for theming
It just doesn’t happen. Why? Because a company want their app to align with their design language. Designers want their apps to look pretty. Largely, companies want their Android and iOS app to look the same. This is not to say exactly the same, you can usually convince a designer / product owner that we should use a native Switch on iOS, a Material Switch on Android. Have the title in the toolbar in the centre on iOS, left on Android etc etc…
So, if we want Android and iOS to look the same, why develop twice?
Why develop twice?
Before this article gets a tonne of hate, if the app is fancy. Real nice animations, low level API using, or you just want the “best in class”, native is always the way to go.
I’m confused
You’re saying that React Native doesn’t suck, but telling us if you want the best in class, write native. Well, thats the point of this post: regular users don’t care.
As mobile developers, we care about the apps we use. We enjoy the little animation in the header of the Sky Sports Scores app, we’re on the look out for little UI things. We like it when apps use the new APIs that we saw at WWDC and Google I/O.
But the average user of (most) apps, simply don’t…
The average user
Let’s think about a few very popular app categories. What do users want here? They want to get things done. They want the UI to respond. They want them to be fast.
- Social media
There is a case that they are complex. Photos, Videos, AR, Frames, they may need native development. But, maybe cross platform could take care of the vast majority. The user wants to be able to scroll through, see updates, make comments.
- Messaging
It’s just displaying text, and photos. The notifications need to be on time, it needs to respond in realtime to things like “x is typing”.
- Banking apps
It needs to be secure. It needs to be responsive. It needs to allow the user to see transactions, make payments.
- Travel apps (Train, taxis, buses etc)
It needs to be clear, responsive. Give them the information they need. Allow them to book a ticket, get a ticket and scan it.
Utilitarian apps
The vast majority of utilitarian apps could use React Native (or Flutter), the company saves money, get features faster, and their users get what they want (except the very small amount of native developer customers).
Performance
I’m not going to get into the details on performance. But React Native has improved a lot in recent times, and will continue to get better as long as Facebook continue to use it. The same goes for Flutter, each release comes with performance improvements, and will continue as long as Google is using it.
Risk
There is always a risk with cross platform, particularly from Apple. Apple don’t care, they would happily make a change in the next OS that stops things working. As long as their UIKit / SwiftUI works, nothing else matters.
To mitigate these risks, cross platform apps should test EARLY. Get the new Xcode beta, run against the next iOS preview. Same on Android, get the beta, run against it early. This way problems in cross platform solutions can be identified well before the general public get these OS versions.
Conclusion
We’re in a world where apps are needed, but companies are thrifty. If they need an app, there is absolutely nothing wrong with going cross platform. Most users won’t notice.
Here’s the thing though, as much as these frameworks are improving. You NEED to have knowledge of mobile in the team. It’s not good enough to just put React web devs on the project because they can write JS / React. If you do this, you’ll more than likely have an app that doesn’t fit properly, doesn’t use native components where it can, and feels off again… but at least the React code should be good, efficient. A mix is needed.
It feels like, because cross platform was poor for so long, that the default position of a native Android / iOS developer is cross platform sucks! Have we older devs passed that on to new developers mobile developers too? Quite possibly. Native mobile development is elitist in my opinion, and we need to change that.