Working in mobile security over the last 5 years, I often get asked some variant the following questions:
- What’s the difference between native apps and non-native apps?
- What’s the difference between “cross-platform” mobile apps and “hybrid apps”?
- How do cross-platform apps and hybrid apps relate to the ‘native vs non-native’ app question?
- And finally what are Progressive Web Apps (PWA) and how do they fit into the mix?
Sooooo, if you’re not a mobile developer, this all may sound like alphabet soup to you. Well, don’t worry you’re not alone. As I said, I get these questions all the time. And tbh, it was confusing to me at first as well, (and I live and breathe mobile everyday!).
In this article, I’ll break down the differences between native, non-native, hybrid, cross-platform and progressive web apps — and explain a bit about why those differences exist.
Quick note: this is by no means intended to be a hard-core technical definitional document. Nor am I proclaiming that this is an ‘exhaustive’ list (ie: my goal is not to define all the ways that there are to make apps). Nor is this a proclamation of which is ‘better’. Quite frankly, the answer to that question is: you guessed it: it depends.
So read this blog if you want a quick and simple way to understand the basic differences between native and non-native apps.
Ok here goes!
Mobile App Development Categories — An Overview
Mobile apps can be broken into 2 top level categories (native and non-native apps). Then within the category of non-native apps, there are various sub-categories (hybrid-apps, cross-platform apps, and progressive web apps (PWAs).
First I’ll discuss the differences between native and non-native mobile apps. Then I’ll cover the various sub-categories of non-native apps, including some details on the frameworks used to build them.
What makes an app ‘native’ anyway?
Native mobile apps are built entirely in technologies that are specifically designed to leverage proprietary mobile OS and hardware functions of the 2 mobile operating system vendors — (Apple/iOS & Google/Android) — without requiring additional layers to bridge gaps. Specifically, the libraries used in native apps are designed to directly access all of the classes, objects, functions, methods, etc of the source code (and the programming languages underlying the code).
NATIVE Android apps written in either Java or Kotlin. The libraries used in these apps can access all of the bespoke functionality built into the Android operating system, as well as the various hardware/firmware variants and chip architectures of the Android ecosystem.
Similarly, NATIVE iOS apps are written in either the Swift or Objective C programming languages, and they contain libraries that can access and take advantage of the OS functions, controls, hardware etc built by Apple.
Another major difference between native and non-native apps is the manner in which they are built and compiled:
Native apps are compiled to run directly on the application. When you compile native mobile apps, the source code (human-readable) is actually converted into binary code (machine-readable) and it executes from there.
With non-native apps, the source code is not compiled directly into binary code. Instead, the source code is saved inside the application itself. When the app initializes, it reads the code from the saved source code files, and runs the code from there. (side note: This means that all of the code is available to anyone with the application file in hand (it’s not encrypted or obfuscated by default). You can learn more about securing non-native apps without coding in a separate post.
Generally, what makes an app ‘native’ relates to the fact that all the languages, development tools, frameworks, etc were explicitly designed to work together; differently stated, all the components inside native apps can directly access the functionality that Apple and Google make available through their respective platforms by using the native programming languages to build applications (again Swift/Objective C for iOS and Kotlin/Java for Android. It’s also worth nothing that Android apps often include C and/or C++ code for native libraries).
Non-Native App Types — Hybrid, Cross-platform, Progressive Web Apps (PWA)
Now that we covered the differences between native and non-native apps, I’ll focus on non-native apps and break them down further into sub-categories.
What are the different types of non-native mobile apps?
Among non-native apps, there are several different variants: Hybrid, Cross-Platform, and Progressive Web Apps (PWAs). I’ll cover the differences between each non-native variant below:
Hybrid Apps (aka Hybrid Web Apps)
Cross-platform apps, such as apps built using Xamarin , React Native and Flutter are also written in a common programming language, and then compiled to run on both iOS and Android platforms, sharing the same code base. For example, Xamarin apps are written in C# (‘C Sharp’) programming language and leverage native Android and iOS user controls and OS functions which enable user experiences and performance characteristics closer to those of native iOS/Android apps (That’s the main thing that differentiates Xamarin apps from their hybrid app counterparts). And though some may argue that Xamarin apps are truly native, they are not, but it’s fair to state that they are ‘native-ish’.
What are Progressive Web Apps (PWAs)?
That’s it for today. I hope you found this article useful. If you’d like to see more on this topic, please let me know in the comments or by sharing the article.