This post makes very big claims based on a very basic application that doesn't seem to be much more than a few toggle buttons and a couple of animations thrown in, and some 'statistics' that don't appear to be based on any actual facts.
I work in a team developing an app that has around 5million users, and we abandoned an Ionic first version 5 years ago, after a couple of years of nightmarish development, where (after the first implementation, which went reasonably well) we spent most of our development time fixing inexplicable bugs, chasing native features, getting inconsistent UI problems, broken builds from package updates and a myriad other problems that just drained our energy and were generally dispiriting.
I personally felt the entire experience was a horrible professional dead-end. Luckily our management decided to switch to a native application, and learning Swift has been the most fulfilling part of my entire career. The application is faster, more reliable, the bugs are locatable and fixable; the entire framework feels solid and professional.
The application itself is immeasurably better now. We attracted better-qualified colleagues who have been a great learning resource. And the app itself went from an appstore rating of (iirc) around 2.8 stars to its current rating of 4.6.
We would never dream of going back to the nightmare that developing a complex and performant app with Ionic was in my experience.
Funnily enough, I actually wrote this post because if you had asked me about cross platform web apps 6 months ago I would have said the exact same thing you just said.
In 2014 I'd started an app using Ionic and actually ended up abandoning it and it killed the project. I was so frustrated. That's why I was shocked with this app (and yes it is small and pretty simple) actually worked really nicely being a react app bundled into a webview. It's crazy, I was just shocked.
Made me realize that cross platform web apps are a hell of a lot more capable today than I had thought.
And sure, maybe claiming native apps will die eventually is a pretty bold claim... But technology moves. And the direction it's going now, is in the direction of browsers becoming faster and more capable at a greater rate than user's desire for more elaborate UIs. Visual Basic and Java used to be the hottest tech you could have on your resume. Who knows what will be old fashioned and out of date in the future.
I don't normally make bold claims but I think I'll stick with this one and maybe in 5-10 years I can fish out this blog post to see if I'm right or not.
Hi - Thanks I don't consider myself responsible for the overall success of the app, it's a big company.
I know really well about how 'tech moves' as my first developer career was based on advanced and deeply immersive ActionScript3 Flash apps - and the speed that died was a genuine warning to never be complacent that I'm still fully aware of even now.
But I'm not convinced that 'web-apps' are the universal panacea you seem to think they are.
To begin with, the apparent simplicity of your app (forgive me if I'm underestimating the complexity of any features you don't mention in the article) suggests to me something that could be built using SwiftUI in a couple of days.
For side projects or simple UI applications, SwiftUI is so fast to put together that it really outstrips the setup speed of any of the web frameworks I've used in the past. Simply learning a bit of Kotlin and/or teaming-up with one other Android developer (which in itself would be a great learning opportunity) means that you could develop native apps pretty much as quickly and easily as learning and implementing an Ionic app.
You also (both here and in the article) focus on "user's desire for more elaborate UIs" - but the emphasis in most apps is not an "elaborate UI" but speed, reliability, predictability and accessibility.
In my experience, native frameworks provide a better user-experience in all these areas.
But common sense does not.
Just do not forget that you are reasoning over a "market", a supposed large number of potential users - not "a norm, some universal rule". It is very normal to want one's tools work without networking.
I suspect that if you had experienced Ionic a bit later in it's cycle, you would have been happy. Hard to tell, and I do think there are genuine cases for building to specific platforms. However I think it's the exception (outside gaming), not the rule.
I like react-native and nativescript's approach a lot more.. They use native UI elements.
Nobody noticed in the app of OP because it looks almost like a game. No native UI behaviors.
The performance is good on modern devices to the point where you don't notice a difference.
The main downside are these things:
1. No fine-grained control over input types / the keyboard that is displayed. You basically have to use whatever Safari gives you. The options got better in recent years, but a native app has better control over the type of keyboard it shows (maybe you can achieve similar effects with a plugin).
2. The UI obviously does not respect accessibility settings. For example, if you enable the O/I markers on toggle buttons on the OS level, your app won't show them. But I think React Native wouldn't show them either, so there's that.
3. Can be a pro and a con: Your app shows the same UI for every OS version. Let's say a user is still on iOS 11 and Ionic tries to adhere to the design language of iOS 15, an app update will also affect iOS 11 users. Whereas with native apps, you can basically say "take this headline element and show it in the way the OS renders this by default". Imho, this doesn't matter for normal users that much, but if you obsess over design, it can be a downside or at least somewhat unexpected.
And you get a lot of upsides:
1. Truly one code base with close to zero custom code for each platform. Hence, a solo developer can easily develop an app for iOS, Android, and the web.
2. Assuming you use Ionic's Capacitor as a runtime environment on devices: It is basically a thin wrapper for Chrome. Since Chrome is evergreen even on older devices, I usually never run into browser issues if users are on Android 6 for example. They simply have the most recent Chrome version and your app benefits from that.
Compare this with iOS: Users with an older iOS version run an old version of Safari and hence, you need to make sure that your JS code doesn't break on older Safari versions. Although the compatibility with modern JS got a lot better since iOS 11.
3. You can easily force the same design on all platforms if you want. I wouldn't recommend it, but for some enterprise-internal tooling, it might make sense.
To sum it up, especially indie developers who want to build an app very fast and don't have a team should give Ionic a try.
That's 90% of non-game apps. Most apps could be written using web-based tech (React Native, Flutter, PWA, whatever), and because they're so simple they should be very fast and very small. Where an app that's a few toggles and animations is slow or janky it's a sign that the developer screwed up rather than a problem that would be solved by going native - the dev would screw up regardless of the tech they used.
Some apps that have extensive design or animation work benefit from being native, and there are some things that are painful to do using web tech like custom camera work or things that use the secure enclave in weird ways, but if you're not doing those things then web should be fine.
While a PWA is a web app, react-native renders actual native components, and flutter has its own rendering engine. I wouldn't call them "web-based" tech
Unless mobile vendors put up artificial barriers on functionality of web apps (Apple).
At a certain hardware level, UX is not perceptibly different between native and Web based, yet development much easier with cross platform target
IMHO, replacing something != proving something. We may have replaced desktop apps with browser-based apps somewhere, but that does not prove anything. I'm looking at a lot of professional software, that just won't perform as a browser app (or work at all) in the near future. And then I look at a lot of crap browser-based software (like MS Teams) that makes me wonder whether this was actually an advancement, because it absolutely does not feel like it. It's UX is just miserable and so slow.
They did? I mean, I'm forced to use crap browser apps for work (i.e. Slack), but it's very early to be declaring the desktop app dead.
> At a certain hardware level, UX is not perceptibly different between native and Web based ...
Hard disagree.
> ... yet development much easier with cross platform target
Well, yes. There we can finally agree. It's all about cost; hiring cheap web developers to churn out something acceptable, if never good.
Let me know when the power is there for the desktops. My MacBook M1 Pro chokes a lot due to running Teams, Slack, VS Code all wanting to be desktop webapps and are highly inefficient.
I have to use a proper desktop to get everything running smoothly together.
I'm not sure whether it's that black and white. If you've worked on both platforms you know how much of a different beast mobile is, it's a lot less forgiving in a lot of aspects. The use cases and interaction model is very different.
I'm not a native developer (kind of jack of all trades) but I had to do some tasks in iOS, Android, web and desktop development. iOS and Android are incredibly overcomplicated. Web used to be fine but it's going in that direction as well thanks to Angular and React. I wish just using Qt was a viable choice.
I used to work in a company with a very popular app (can't tell how many active users but they have 2.5M reviews right now and they're top 50 in the iOS store) and the only reason they weren't web cross-platform is that they saw an exodus of native developers once they attempted that.
They had huge parts of the application in web-views though, so we had half of the animations native and half native. They had a native canvas based editor and 3D games running in a webview (as crazy as that may sound: that's exactly the kind of thing I would have done natively - but they didn't want to implement 3D games twice for web / android and metal).
I can't really say I could tell which was which but error logging was happening in different places so you would normally find out when debugging errors or seeing the web-views in the code.
You attracted better-qualified colleagues? How so exactly? You have a smaller pool of candidates to choose from. Are you implying native developers are just smarter?
Outdated opinions, favouritism and elitism all wrapped in one.
It's a little hard to understand, if the performance of webapps is actually indistinguishable from that of native apps, why anyone would choose the app store route. Is it for distribution purposes? Payments?
It's not hard to make the connection to apple's appstore 30% cut.
For this app it makes total sense, because it already seems to have a pretty custom look and feel; there’s nothing that needs imitating. Many others out there are probably in a similar boat, but certainly not all of them.
The number of times a Windows UI shows me an non-copyable error code is vastly greater than the number of times I wish I cannot select any text (which is zero).
I’m the “tech guru” for many of those who know me, and I’ve seen people of all ages struggle with mobile UIs. There’s two axes with two values, making four categories that I find problems fall into:
- Simple concept + familiar UI: User is at fault (usually a misconception). I rarely see problems in this category.
- Complex concept + familiar UI: User struggles to understand what they’re trying to achieve. A little bit of extra info helps them make sense of the situation. Very easy to help the user over the phone in this situation. Often, thanks to good UI, the user figures it out themselves.
- Simple concept + strange UI: The user knows what they want to do but can’t understand what the UI is conveying, can’t find the UI controls, can’t express what they want via the UI controls, or sometimes don’t even realise something is interact-able. Even if the user understands the concept, they often struggle to succeed after stumbling their way through the app for any length of time, and need assistance. Apple iOS’s “swipe from different corners to get notifications & control panel & home & etc” and “three fingers/hold to do textual things” are good examples of this.
- Complex concept + strange UI: Situations in this category can get so difficult & time-consuming that it’s often easy to just do what the user is asking for on their behalf, or give them a step by step process they can repeat.
The things that make a UI familiar or otherwise are subtle, like what makes a film good or bad.
UI/UX designers come up with all these “clever” ways to do things, like the breadcrumbs interface on the Notion app, but many users simply don’t figure out how to use them. And they don’t think to use an element/gesture when they seek to achieve the very things which that element/gesture achieves.
I get 20-50 mails daily through a very easy to use feedback and support function, but in none of those thousands of mails has anyone ever cared about how transitions are made or that a button doesn't look like a native iOS button.
They care about the value the app provides. About new functions or (in my case) report bad data to fix. That's why they download an app. Not because they want the button to look natural.
That's to say. I frequently get feedback about how they love the UX/UI of my app.
If there isn't a valid reason to create a native app these days I consider it a waste of time.
Whatever they do, complaining about the bad UI to the people who might have done something about it isn't it.
Yes, you nugget. That's why UX is a thing. Just because you know how to traverse your thinking patterns doesn't mean anyone else (wizzards included) can.
Surefire way to write garbage applications and APIs: don't think about the user.
I beat this mentality out of any junior that crosses my path. You're not paid to write code, you're paid to deliver a product. You studied how to write code. Massive difference
To use my father as an example, he sat at work with computers on his desk for 20 years, running everything from Windows 3.11 to Windows XP. He never had a problem using or understanding the computers in front of him because generally any pattern that he learned in one place would apply pretty much everywhere else on the system. Buttons had a uniform look. Radio controls worked the same way. Menus were in predictable places and had similar structures. Toolbar icons, if present, had a uniform appearance. Folders and files were presented uniformly. Tooltips appeared over many things if you hovered your mouse pointer over them. Embossing, solid, thick and dotted lines all had meaning designed to guide the user in certain directions. Disabled controls looked visibly non-interactive. Even "Open", "Print" and "Save" dialogs were globally consistent.
In that regard, older versions of Windows were beautiful in their simplicity — they were uniform and predictable. The same is true of classic Mac OS also. The reason for this is because both Microsoft and Apple spent a lot of time and energy working with real world users to figure out what made sense and what needed work. The result was that they both ended up with clear user interfaces that had learnable visual cues.
Then this aesthetic design trend started and now user interfaces have never been more unclear. Overwhelmingly UI elements are now flat or inconsistent in their appearance. It isn't clear at a glance which objects are interactive and which aren't, or what the side effects will be when you click on given thing. To make this worse, Electron happened, effectively leaving developers (who usually have completely insufficient understanding of user experience or design) to roll their own user interface toolkits and to build applications that end up looking nothing like anything else on the system. So now you don't just have to contend with the fact that the operating system controls aren't as friendly as they used to be, but now every application is out there trying to play by its own rules too, with their own designs and their own learning curves.
Now we're in a situation where very little of what you learn in one application makes sense or applies in another, which is the epitome of user hostility. I spend a lot of time trying to remotely diagnose wildly inconsistent applications over the phone and try to help him make sense of the mess that is modern day desktop computing. He rightly finds it confusing and overwhelming. Even in my own experience, modern macOS isn't much better.
At this point, Microsoft's "Official Guidelines for User Interface Developers and Designers" (2001) and Apple's "Human Interface Guidelines" (1995) should be mandatory reading for everyone who thinks they know better.
There's real psychology and methodology to building a good user experience. Every single detail matters.
Funnily enough though (and this might just be my lack of skill in iOS development) I always find the UIKit components surprisingly tough to customize.
This was still a great case-study though! It’s good to have concrete evidence that the performance side of things isn’t an issue
Good - apps should look and feel like the platform.
We've also seen a renaissance of sorts recently with this new generation of web developers realizing they can use their favorite web stack to build for mobile. A lot of them didn't "grow up" with bad phones and Cordova being the only option in town, and coming into the space with fresh eyes to see all the progress that has been made.
We are excited about seeing better UI tools and frameworks that raise the bar for mobile experiences with web tech. When we started Ionic Framework, there were few quality options. Today, there are a lot more, and we're thrilled if people want to use their favorite stack on mobile with our Capacitor project.
Our reaction time doesn't matter when it comes to the look and feel of an application. You can clearly feel the difference between an old DOS computer with a CRT putting characters on screen nearly instantaneously and a modern text editor having a whole UTF-8 rendering pipeline to deal with first.
We've all slowly been growing accustomed to these high latencies and the bar of acceptable performance has been lowered, but that doesn't mean such latencies don't matter.
Personally, I find browsers noticeably less responsive unless developers go out of their way to reduce latency and overhead. Leveraging things like CSS animations makes a huge difference because even on slow hardware they feel snappy, but there are many other optimisations that you need to get the job done.
That said, if the web version was already reasonably fast then I don't see a problem with porting it to mobile If a mobile browser can operate a website with tolerable performance, then why not stuff it into a platform native webview and he done with it. You'll be fighting the terrible built-in browser engines of your user's devices (I've seen people refuse to update the Webview on Android because they don't know what it is) but your app just got a whole lot tinier and easier to update.
It would probably work the other way around just as well (Flutter to web, or maybe even Kotlin Multiplatform to web and iOS, I haven't tried the latter) if your port source is of good enough quality.
The I notice quite few things: - low fps animations - delay until the keyboard popups - no support to save the password or use e.g. an Apple account to login - no scrollbars in the modal and the back button out of view
So in general, this would not make the cut for the native apps my employer produces. Especially the low fps is a deal breaker.
Tested on an iPhone XR
Let me know if anyone has a recommendation.
People on cheap Android tablets deserve the same experience as anyone else. You aren't rendering 3d graphics, you're displaying a few hundred characters of text.
There are hundreds of millions of users around the world with low-end Android devices. There are people in the world who are not rich white tech people living in suburbia, believe it or not.
> Are native apps dead? Not yet… but they’re going to be.
You don't have a crystal ball. What happens to all the legacy Java, Kotlin, Objective-C, and Swift code? That all just gets rewritten in JavaScript overnight? Right.
> You see as humans we’re comfortable with 60fps of animation performance. We don’t need 70fps
Bullshit. This person has never used a 144hz monitor. I'm never buying another 60hz display.
> Our reaction time is ~200ms, we don’t need 100ms
Our reaction time may be about this, but we perceive times much shorter in duration, which will matter if the tablet has a high refresh rate display like many of the iPads.
There are tablets out there, no name brands but also Lenovo branded ones, that are a complete waste of natural resources. I've had the displeasure of using a few of them in store demos and they couldn't even get video to play back at a consistent rate.
You're lucky to get an app working at all on that crapware, let alone at a smooth 60fps.
Strangely enough, I've had smoother experiences with some Chrome web apps on an old Android tablet than the native device UI is capable of providing. This thing was mid-range and outdated when I bought it years ago and it still runs Android 7 through LineageOS relatively well, but nobody is going to make that thing have a smooth experience. I'm hoping for the powervr video driver to be ported to postmarketOS so I can flash a lightweight Linux distro on there.
Sometimes, though, when the wind is just right and the stars align, Chrome is doing a smooth 60fps animation on that thing and I honestly can't figure out how they've manage to do it. It's impressive to see what modern web browsers are capable of squeezing out of slow hardware.
Total agree on all your other points. I don't think this stuff matters for this specific developer because of the nature of the application, but it's not great general advice.
Could really do without the racism. Tens of millions of non-white people have good phones.
It’s also a case of knowing your audience. If your app isn’t targeted towards Bangladesh, why optimize for those users? ForeFlight for example is native, iOS only. Should they release a version optimized for cheap Android devices? Of course not. People that can’t afford good hardware aren’t flying airplanes. Something like What’s App however, the audience is far more broad, so optimizing around the most users makes sense.
A non-native version of ForeFlight to me is a scary thought. Considering that it’s such a critical application being used by aviators in-flight.
Have you considered going „full web“ with a PWA, foregoing a native container completely? That was my expectation when I saw the headline.
I have a couple of business apps implemented as offline-capable PWAs and the experience has been so-so. Still hoping for better browser support especially on iOS.
Customers love that they can instantly push updates and are not bound by arbitrary rules enforced by the gatekeepers (App Store, Play Store). Bit of course some crucial things are missing. App discovery through the platform app store for instance is something that just doesn’t need to be explained to users. Also the absence of push notifications hurts.
Then comes along Capacitor. I assumed “Ok, it’s just the newer version of Cordova”, I couldn’t have been more wrong. Things that were a huge pain with Cordova (building the native project from scratch, any changes to the native project for things like capabilities/permissions, the version of Google apis conflicting, etc) are gone. You now commit the Xcode and Android Studio projects to your source tree. This makes builds so much easier (throw fastlane into the mix and you’ve got something really awesome) and makes writing native code super easy.
I didn’t think I’d ever want to write native code for a cross platform app but Capacitor makes it stupid-simple to drop down to native code whenever you want. No more packaging your code in a plug-in (if you don’t want to at least), just add a class with the right annotations or extending the right class and you are calling native code from JS in no time at all. Native used to be scary or hard to work with in Cordova, that’s no longer the case in Capacitor. It gives me a ton of freedom and finally makes me feel in control of my builds and my app as a whole.
If you’ve slept on Capacitor I urge you to give it a shot, it’s quite nice to work with and fixes all the major pain points I’ve had over the years with Cordova.
But that “someone else” is a very good engineer, that did a great job.
Good software is always gonna be difficult and expensive; regardless of the tools and platforms. Good engineers are expensive, and take the time to do things right. No shortcuts. No free lunch.
We get all hung up on the tools, as if they make us good. It’s like someone with money, buying a top-of-the-line PRS guitar, and playing Smoke Over the Stairway to Freebird.
If a tool makes it easy to do something cool, and, suddenly, we can do something we couldn’t, before, that’s nice. Enjoy it while it lasts. Some kid will blow us out of the water, using the same tool, shortly.
Native will always give the best UX, if done by expert native developers, but, in many cases, this may not make financial sense.
Also, bad native developers will do bad work; even though they are using top-shelf tech (Smoke Over…).
Guaranteed you could not tell if 10 randomly chosen apps were developed natively or cross platform. I'm sure you will say you can though.
Depends, if it's React Native it's actually getting hard to tell with all the work they've done to UI performance and animations etc. Flutter or a wrapped web site on the other hand are immediately obvious to me, in fact there's a certain flavour of Flutter jank in lists that is an obvious tell. I can also tell when an app's using SwiftUI due to the presence of a particular navigation bug so "native" toolkits don't get a pass here either.
I'm not sure it's pretentious it's just those developers are close to the topic and have opinions about it - you see it in other areas of software development too.
This article recommends Capacitor, but although they say "drop Capacitor into any existing web app" - they actually mean any JavaScript application. I have an Elixir app, I just want to put it in a WebView and cut iOS/Android versions. What's the best way to do this in 2022? I've stumbled upon "Jasonette", but have no idea if it's the right way to do things these days.
Does anybody have any recommendations they could share?
[0]https://elixirforum.com/t/what-is-the-best-easiest-way-to-co...
On the other hand, native app performance is second to none when done well, and if you have dedicated developers to manage a separate deployment from the web interface then you're going to have a better time going native.
oh never mind.
Turned out the big problem wasn't cross-platform compiling, it was dealing with Apple randomly telling you that your game was removed for some totally random reason and forcing you to upgrade it and submit it again every couple weeks.
Like, great, you compiled something for iOS. See how far that goes haha.
Our strategy for webapp involves nearly 100% raw vanilla javascript and some very unconventional techniques. One of my team members is about to demo it to a client.
That said, raising compliant kids is sooo boring :)
smallish swift shim > WebView > react-native-web
In the end there are minimal "tells" and it is such a joy to be able to deploy small and large things to both platforms with a single push to GitHub.
(https://www.shelf.fm if you want to take a peek)
How much more time would getting this to work on Android take if hypothetically you had to do so?
Edit: I didn’t notice you wrote “react-native-web”. Didn’t realize that was a thing. Another neat thing.
The mobile backend isn't very power efficient either if I'm being honest, but at least the resulting experience is acceptable in terms of smoothness and responsiveness.
They're winning over react programmers by delivering the performance they've come to expect.
I think a simple app like this should be no problem for most devices, but Notion (the app I work on) really struggles on those low-end Androids.
We have embarked in a costly rewrite to fully native because even today, most androids phones are noticeable slow to my customers...
Edit: This is a "talk to sales" framework and ionic is 50€ per month as the absolute cheapest option. This is essentially an ad then.
React Native doesn’t use HTML. It has its own set of base tags (eg 'Text', 'Image', 'ScrollView') that are then translated to native components.
(Though, to complicate matters further, 'React Native for Web' exists, and translates those into HTML tags https://necolas.github.io/react-native-web/docs/ )
Also Ionic is definitely free and open source: https://ionicframework.com/framework
https://9to5mac.com/2021/06/03/remembering-apples-sweet-solu...