Native, Hybrid or PWA - Which one is for my app?

Native, Hybrid or PWA - Which one is for my app?

The State of Technology

In the earlier days, the seperation of technologies used to be rather clear. Websites were composed of documents served to web browsers such as Netscape or Internet Explorer. Mobiles came along and apps were just programs that ran on your phone (usually within Symbian OS in the prehistoric times). Browsers came and went, javascript entered our lives and everything was still pretty clear - until Apple brought along the most fundamental change to technology since the home computer. There were mobile devices that supported web browsing before the iPhone but nobody took them seriously and the experience was simply bad.

Apple brought along the iPod Touch, iPhone (and later the iPad) and with those came browsers that were capable of running full web applications of the time. It was around this time that websites started focusing on "responsiveness" (not completely breaking on a small screen, at least). Apps and Websites still had a pretty clear seperation at this point. If you wanted speed and performance, you'd go with a native application and if you just have something that was content heavy and easily accessible- it'd be on a website. Apple used to be quite strict with creating apps that weren't fit for purpose too, so this kept the app store pretty clean.

Fast forward to today, phones are faster than ever with processing power that's mind blowing when you consider how fast it's grown. 90% of the time, you could use an app downloaded from the app store and not be able to notice if it's truly native, using shared business logic or just a web application pretending to be native. The times have changed and building software for general use today has become a choice that needs some careful consideration. Let's end this with some terminology to move forward with:

  • Native App: Applications that are written using the tools of the operating system providers (Swift + Xcode, Kotlin + Android Studio)
  • Hybrid App: You can write an application for multiple platforms with one language, sharing your business logic between them. E.g Xamarin, React Native, Ionic and Flutter.
  • PWA: This is a website that behaves like an application (webapp). In iOS and Android, you can save these to your home screen as if they were apps.

Are native apps faster?

Before we answer this, I want you to do a small excercise. The answer won't surprise you but you will get more value from exploring it yourself. Below I've linked two hybrid applications and two native applications. Take a look at them and see if you can instinctively figure out which is which:

App 1
App 2
App 3
App 4

Give it a shot, try to honestly find the two native apps out of the bunch. The answers are below, just hover over the white box to reveal them.

[.c-hide-text]App 1 and App 4 were hybrid (1 = Ionic, 4 = Flutter). App 2 and App 3 were native[.c-hide-text]

If you got them right, congratulations - you clearly have a good intuition! If you didn't, you're in the large majority. The answer to the initial question is: yes, native apps are theoretically faster. The word "theoretically" is key here because although native apps have the potential to be faster, you need to have a competent developer. A poorly seasoned developer can easily make a native application run more sluggish than a well optimised hybrid application or even a well made PWA. If you're looking for an example of a great PWA, look here: https://app.starbucks.com

Yep, that's right. You can have the full starbucks experience on a web application, save it to your home screen and treat it like an app. The best part? The experience is great for desktop users too.

If you're looking for amazing, slick and fluid animations in your application - then PWA might not be the best way to go. CSS and browser technologies have made a lot of great advances over the years, especially on mobile. There's plenty you can achieve with a silky smooth 60FPS but you'll be hitting the limit a lot sooner than you will with the bare metal.

Pushing Updates

We're still not in a golden era of apps being updated automatically. I'm sure one day, some genius will create a binary-diffing software that allows you to just update parts of a binary. iOS and Android are generally pretty good at downloading updates for you in the background, but these updates are generally large and an entirely new application is downloaded per each update, even if the developer just wanted to change a line of text! We see a lot of companies these days pushing updates with hidden feature flags that they can enable at a later point, which slightly works around the issue.

The main issue with updating applications is that the code is all compiled into a binary file before being submitted to the app stores. This means that even if a colour is changed or a piece of text has been updated, the code has to be compiled again into a new binary. It's a tedious process and there's a number of reasonable solutions to this. Native apps suffer the most from this issue and the only realistic solution is by using a CMS to store most of your text or content. You can use a tool like Sanity to model the content of your application, download them when the application is started and present them when needed. This is a very reasonable compromise for "remotely updating" your application, since you can just update the text and images on the CMS and it's propagated immediately to the apps.

Hybrid applications come with a number of their own approaches. React Native has CodePush which comes with a risk of getting banned if you use it for gigantic updates. Ionic has AppFlow, which is a lot safer (since Ionic is essentially a wrapped webview). If you mix these options with a CMS, you have quite a robust opportunity for remote updates.

PWAs are great for updates, because they're already on the web. Whenever a user visits your application, they'll get the latest version of your content. They'll generally use something called Web Workers to fetch it in the background whilst initially showing you the older content but it's usually quite a good experience and there's almost no friction for updates. No waiting days for Apple and Google to approve your updates.

The Affordable Option

The question of affordability when it comes to building an app for mobile has quite a complicated answer. A PWA might be more affordable in the short term as it requires a single developer, one codebase and the market has a nice ripe supply of web developers. However, as your business needs evolve, so will the capabilities of your app - which may lead you to require some native functionality further down the line. This could demand an entire re-write of the application, rendering the initial cost of the PWA useless. Hybrid apps are generally a good compromise - you can find either developers that specialise in web development or you can find more niche developers for platforms like Flutter, which are better suited if your application is have lots of great animations on multiple platforms. It'll generally cost a little more than building a PWA due to the skillset required but it's a reasonable middle-ground for performance, flexibility and price.

We could say that building a native application is the least affordable because generally, Swift and Kotlin developers demand greater remuneration than Web developers. If you're looking at both platforms, that'll be a native developer for both. A potential large benefit from starting with native applications is that as your business grows, you'll likely be able to keep the original apps you've built - making your initial investment last over time.

Conclusion

If you're a bootstrapped business and you have a co-founder that codes and only knows Swift or Kotlin, then sure - go native. It makes sense. If you're looking at outsourcing or bringing in your first hire, carefully consider what is important to you.

‍If you've got plenty of capital and have big visions for your product with designers, native might be good.

If cashflow is extremely important right now, maybe go hybrid with Ionic + React

If you want something that can perform great whilst still giving you a lot of flexibility, look into React Native.

If you want a beautiful looking application that looks mostly the same on either platform, take a look at Flutter.

If you have some .NET developers in your team already, maybe explore Xamarin with them.

If you already have an Android developer and you're looking to potentially go cross platform, investigate Kotlin Multiplatform.

Start your free trial

Join over 500 teams already building better software with BugKit.