Native development means Swift (or Objective-C) with Xcode for iOS, and Kotlin (or Java) with Android Studio for Android — two entirely separate codebases, each using the platform vendor's own tools and APIs directly.
The tradeoff is real duplication: essentially two apps, two codebases, two teams (or one team context-switching), and every feature built twice.
React Native, Flutter, and similar frameworks let you write one codebase that compiles or renders to both iOS and Android.
// A React Native component — renders on both platforms
function Greeting() {
return (
<View>
<Text>Hello, mobile world</Text>
</View>
)
}
React Native renders using actual native UI components under the hood (not a webview), while Flutter draws its own UI with its own rendering engine — a subtle but real difference in how closely the app matches native platform look and feel by default.
Cross-platform frameworks mean one team, one codebase, and faster shipping for most features — a real and often decisive advantage for a small team or a startup validating an idea. But you occasionally hit platform-specific quirks that require dropping into native code anyway (a "bridge" or "native module"), and adoption of brand-new OS features usually lags behind pure native by weeks or months.
A PWA is a website that can be "installed" and behave somewhat like an app — offline support, a home screen icon, push notifications on some platforms. It avoids app store review entirely, but has real limits: iOS historically restricts PWA capabilities more than Android, and neither platform gives a PWA full access to native APIs the way a real app gets.
Comments