Web apps have the following pros:
- Faster to prototype in HTML/CSS/JS, than code an entire app in Objective-C.
- No need to send updates through the app store – you can publish updates anytime
- Your app runs in multiple environments. Gets close to the “write once, run everywhere” dream.
Native apps have the following pros:
- More performant than a web app since you’re closer to the metal.
- UI/UX looks and feels more natural.
- Less time spent styling elements to make them feel native.
Web apps have the following cons:
- Your app will never be as performant as it’s native counterpart. You’re always executing code in a browser-context, which is slower than the native context.
- It’s a pain (near impossible) to get your app to look and feel native. This is especially true in iOS.
- For hybrid apps, communicating between the web and native layer is a pain, and not elegant.
- Webviews will always reload when you re-launch the app, causing an unpleasant user experience.
Native apps have the following cons:
- Write once, for a single platform. Very far from the “write once, run anywhere” dream.
- Your app updates have to be explicitly downloaded by the users, meaning you will have a fragmented user-base.
- At the mercy of the app store.
My thoughts on this subject have changed over the last few months. Initially, I really believed that web apps were the way to go. I tried everything – Phonegap, Titanium, hybrid apps, and regular web apps added to the home screen. At the end of the day, I realized a web app cannot stand up to its native counterpart. It is too damn hard to make a web app feel native. By this, I mean that the styling, transitions and DOM structure necessary to make a web app feel usable on iOS is very difficult. Attempting to do this takes up more time than it would take me make a native app, in my opinion. The Android browser is even worse, especially since a good chunk of Android users are stuck on v2.3.x.
Now, even if you aren’t worried about getting your application to look and feel native, you still run into issues. For instance, for any app that requires a slightly complicated DOM structure, suddenly you have to worry a lot about memory management, webview scrolling jankiness, and more. LinkedIn is on of the few companies that have a successful hybrid app in the App Store, but most hybrid apps fail due to bad user experience. LinkedIn did some great work with NodeJS, and were able to keep their DOM and HTML structure extremely simple by removing DOM elements on the fly – not a trivial task, and one that is automatically handled for you when using native views.
You see, when it comes to making a web app, I face two challenges.
- Writing my application logic.
- Making sure my application’s UI/UX was not crappy on mobile devices.
When it comes to writing native apps, I only worry about (#1), which is the only thing that I want to think about. So, these days, I adopt to this principle: Make (responsive) web apps if you want to reach a large audience; make native apps if you want your small audience to have the best experience possible.
Web apps and native apps serve different purposes. I think it makes sense to start off with a web app (faster to prototype, larger user base, etc.), and then make a mobile app if the idea sticks. Of course, the opposite works as well (Instagram went mobile-first, for example).
As a front-end engineer, and someone who loves to improve user experience, I think it’s a great idea to get some experience making mobile and web apps. They both have their own challenges, and I find them both to be equally fun to develop.