Mobile development — overview
Status: 🟩 COMPLETE (🟦 LIVING — the mobile landscape shifts annually) Last updated: 2026-06-19 Plain-English tagline: Two operating systems (iOS, Android) dominate the world’s pockets. Three main ways to build for them: native (best UX, two codebases), cross-platform (one codebase, near-native UX), or web (PWA — one codebase, capped UX).
In plain English
You have an iPhone. Someone else has an Android. You both download apps from your respective stores. The apps look mostly the same, work the same way. How does that happen — and why are some apps available on one platform but not the other?
The world of mobile apps is two platforms:
- iOS — Apple’s, runs on iPhones + iPads. Built with Swift (or older Objective-C). Apps distributed via Apple’s App Store. Strict review process.
- Android — Google’s, runs on Samsung, Pixel, Xiaomi, OnePlus, Motorola, hundreds of others. Built with Kotlin (or older Java). Apps distributed via Google Play (and some side-loaded).
Building for BOTH is the challenge. Three main strategies:
- Native — write the iOS version in Swift + the Android version in Kotlin. Two codebases. Best UX. Most expensive to build + maintain.
- Cross-platform — write once in a meta-framework (React Native, Flutter, Expo, .NET MAUI), which compiles or runs on both. ONE codebase. Near-native UX with some constraints.
- Web / PWA — write a web app; users add to home screen. ONE codebase (shared with web). Lowest cost. Limited access to device features.
For Bible Quest-style work: George’s project is a web app. Users can install it as a PWA on iOS or Android — gets a home-screen icon, runs in a window without browser chrome. For most purposes, indistinguishable from a “real” app. See PWA.
If you wanted full native features (push notifications without limits, background processing, camera with custom UI, biometric auth at the OS level, App Store presence), you’d reach for one of the other two approaches.
This entry maps the mobile landscape — what you’d choose, when, why.
Why it matters
Three reasons even a non-coder benefits from understanding mobile:
-
Mobile is most of the internet now. 60%+ of web traffic. Designing without thinking about mobile (or worse: assuming desktop is primary) is increasingly out of step.
-
The strategic choice is real. Building a webapp, a native app, or a cross-platform app — each is a major commitment. Knowing the trade-offs matters before starting.
-
AI tools’ UX often differs on mobile. Claude Code is desktop-first. Reading code on a phone is suboptimal. Knowing this is just useful awareness.
The trade-off: full mobile dev is its own discipline. This entry is the conceptual map; if you actually build native mobile, you’ll need deeper resources.
The three paths in depth
Path 1: Native (Swift + Kotlin)
You write two apps. Each runs in its OS’s primary language + framework:
| Platform | Language | UI framework |
|---|---|---|
| iOS | Swift | SwiftUI (modern) or UIKit (legacy) |
| Android | Kotlin | Jetpack Compose (modern) or XML layouts (legacy) |
Tools:
- iOS: Xcode (Mac-only)
- Android: Android Studio (cross-platform)
Advantages:
- Best possible UX — exactly matches platform conventions
- Full access to device APIs (camera, sensors, file system, biometrics)
- Best performance — animations + heavy compute work natively
- Smaller app size + memory footprint typically
- Latest platform features available immediately
Disadvantages:
- TWO codebases to maintain
- Need iOS + Android developers (or one person who knows both)
- Releases need to go through App Store review (1-7 days)
- Mac required for iOS development
- Hardest path for solo developers
When to choose:
- The app’s UX is its competitive advantage
- Heavy use of device features
- Performance-critical (games, AR, real-time editing)
- You have the budget for two codebases
Path 2: Cross-platform (React Native, Flutter, etc.)
You write one codebase that runs on both platforms (and sometimes web + desktop too).
The major frameworks:
| Framework | Language | Style | Owner |
|---|---|---|---|
| React Native | JavaScript / TypeScript | Renders to native components | Meta |
| Expo | JavaScript / TypeScript | React Native + tooling + managed cloud build | Expo (company) |
| Flutter | Dart | Renders own UI engine | |
| .NET MAUI | C# | Renders to native components | Microsoft |
| Capacitor | Any web tech | Wraps a webview | Ionic |
React Native + Expo is the dominant choice for JavaScript developers in 2026. If you know React for web, you can build mobile apps without learning a new language.
Flutter has a passionate following — uses Dart (Google’s language) but produces beautiful UIs with custom rendering. Strong for “we want our app to look identical on iOS and Android” use cases.
Advantages:
- Single codebase (~80-90% shared between platforms)
- Faster development than two native apps
- Same developer skills as web (for React Native)
- Hot reload during development
Disadvantages:
- UX has some constraints — feels almost native but not quite for specific platform conventions
- Less direct access to platform APIs (need bridges)
- Performance gap with native (small but present)
- New OS features can take weeks-months to be supported
When to choose:
- Multi-platform from day one (iOS + Android + web in some cases)
- JavaScript-heavy team
- Budget for one codebase, not two
- Standard app shape (lists, forms, navigation, basic media)
For Expo specifically: the smoothest path for React developers. Includes managed cloud builds, OTA updates, push notifications, distribution via App Store and Play Store. Used by many production apps.
Path 3: Web / PWA
Build a web app. Use it through the browser. Optionally let users “Add to Home Screen” so it appears like an installed app.
Advantages:
- Single codebase shared with web
- No App Store review process
- Instant updates (no waiting for users to update)
- Lowest cost
- No store fees
- Bible Quest-style flexibility
Disadvantages:
- Limited access to device APIs (no biometrics on iOS, no full background, limited push notifications on iOS)
- Users may not realize they CAN install
- App Store presence is missing (some users only discover apps via stores)
- iOS specifically has historically restricted PWAs more than Android
When to choose:
- Content-oriented or reading-focused apps
- Tools that work fine in a browser
- Solo developer / minimal team
- Don’t need App Store discovery
- Iteration speed matters
For Bible Quest, the PWA path is right. Users can install it; works offline (with service workers); looks like an app. Without the App Store overhead.
See PWA for the technical implementation.
A concrete example: building a “mark this verse as read” feature
The same feature in three approaches:
Native iOS (Swift)
import SwiftUI
struct VerseRow: View {
let verse: Verse
@State var isRead: Bool = false
var body: some View {
HStack {
Text(verse.text)
Spacer()
Image(systemName: isRead ? "checkmark.circle.fill" : "circle")
.onTapGesture {
isRead.toggle()
saveToCoreData(verse, isRead)
}
}
}
}React Native (Expo)
import { View, Text, Pressable } from "react-native";
import { useState } from "react";
import { Ionicons } from "@expo/vector-icons";
export function VerseRow({ verse }) {
const [isRead, setIsRead] = useState(false);
return (
<Pressable
style={{ flexDirection: "row", alignItems: "center" }}
onPress={() => {
setIsRead(!isRead);
saveToSupabase(verse.id, !isRead);
}}
>
<Text>{verse.text}</Text>
<Ionicons name={isRead ? "checkmark-circle" : "ellipse-outline"} />
</Pressable>
);
}Web / PWA (Next.js + Tailwind)
"use client";
import { useState } from "react";
import { Check, Circle } from "lucide-react";
export function VerseRow({ verse }) {
const [isRead, setIsRead] = useState(false);
return (
<button
className="flex items-center w-full justify-between"
onClick={async () => {
setIsRead(!isRead);
await markVerseRead(verse.id, !isRead);
}}
>
<span>{verse.text}</span>
{isRead ? <Check /> : <Circle />}
</button>
);
}All three are similar in spirit. The native is more verbose (Swift conventions); the React Native is between; the web version is shortest. The native has direct access to native iOS features (haptics, etc.); the others access them through bridges or polyfills.
For most app needs, all three deliver an acceptable UX. The differences accumulate at the margins.
App Store vs Play Store — the distribution gatekeepers
If you build a native or cross-platform app, you submit it to:
Apple App Store
- $99/year developer account
- App must pass App Store review (1-7 days typical)
- Apple takes 15-30% of in-app purchases / subscriptions
- Strict guidelines on UI, content, monetization
- Pre-built apps (PWAs that haven’t gone through review) can’t be in the store
Google Play Store
- $25 one-time developer account
- More lenient review process (often hours)
- 15-30% revenue share (same as Apple)
- More flexibility on content + monetization
- Allows side-loading (users can install APKs directly)
Web apps + PWAs bypass both. Users install via “Add to Home Screen.”
For Bible Quest: not in any store. Users visit the URL, optionally install as PWA. Zero distribution friction; zero store presence.
The “marketing problem” for PWAs
The honest downside of PWA-only strategy:
- Users SEARCH the App Store / Play Store for new apps. PWAs aren’t there.
- Users don’t always know they CAN install a PWA.
- Adding to home screen on iOS especially is a 3-step process that most users don’t discover.
For known users coming to a known URL, this is fine. For broad discovery, the App Store presence matters.
Mitigations:
- Promote PWA installation explicitly on first visit
- Use Web Share API to leverage native share menus
- Get organic search traffic (SEO)
- Add to TWA (Trusted Web Activity) — wraps a PWA as an Android app for Play Store
Apple has been slowly improving PWA support on iOS but historically restricts it more than Android.
React Native vs Flutter — the cross-platform decision
If you’re going cross-platform, the choice is usually React Native vs Flutter:
| Aspect | React Native | Flutter |
|---|---|---|
| Language | JavaScript / TypeScript | Dart |
| UI rendering | Native components (UIKit, Android Views) | Own engine (Skia) |
| Look + feel | Platform-native (iOS feels like iOS) | Identical on all platforms |
| Web support | Via React Native Web (good but rough) | Stable but heavy bundle |
| Community / ecosystem | Larger, more libraries | Growing fast |
| Hot reload | Yes | Yes (some say Flutter’s is smoother) |
| Best for | React developers; UX that should match each platform | Designers who want consistent visual identity |
| Adoption examples | Discord, Tesla, Shopify, Pinterest | Google products, Reflectly, BMW |
For JavaScript-heavy developers (most webapp developers): React Native + Expo. Same React skills; gentle learning curve; mature ecosystem.
For people starting fresh + valuing visual consistency: Flutter is excellent.
When to NOT build a mobile app at all
A common mistake: assuming “we need a mobile app.”
Often the right answer is:
- A great mobile-optimized website (which works everywhere)
- A PWA (adds home-screen install + offline)
- Both
Reasons to actually build a NATIVE app:
- You genuinely need OS features unavailable on web (rich push, background processing, deep biometrics, AR, advanced camera)
- You need App Store presence for discovery
- The app needs to work fully offline
- You’re targeting a market where app stores are critical (China, much of Asia)
- The competitive product is native and beats your web version
Reasons NOT to:
- A website would work fine
- Your team has no mobile expertise
- You’d rather iterate fast (web wins)
- You don’t want to share 30% revenue with stores
For Bible Quest: zero native need. PWA covers everything. The mobile-first design + PWA installation is the right choice.
Common gotchas
-
Apple’s App Store review is famously strict. Apps get rejected for tiny UI violations, vague guidelines, sometimes inconsistently. Plan for back-and-forth.
-
Google Play is more lenient but still has rules. Especially around privacy disclosures, content categorization, and security.
-
Push notifications differ wildly. iOS strictly limits background; Android is more permissive. Web push notifications work on Android but are limited on iOS (only since iOS 16.4 for PWAs added to home screen).
-
30% store cuts are non-negotiable for in-app purchases. Apple + Google both. EU rulings in 2024 are slowly changing this. Plan revenue accordingly.
-
Web doesn’t have access to App Store reviews / discoverability. A serious limitation if discoverability matters.
-
window.matchMedia('(pointer: coarse)')detects touch. Useful for adapting UI between mobile and desktop on the web. -
Mobile browsers behave subtly differently from desktop. iOS Safari especially has historical bugs + limitations.
-
100vhis wrong on mobile Safari. Address bar height changes; viewport size shifts. Use100dvh(dynamic viewport height). -
Tap target size matters. 44×44px minimum for tappability (Apple HIG and Material Design agree). Smaller buttons get mis-tapped.
-
Mobile data is variable. Test on a real device on cellular, not just on WiFi.
-
Battery and performance matter more on mobile. Heavy JavaScript drains batteries; users notice. Profile.
-
Network conditions vary. Mobile users may hit 3G, dropouts, switching networks. Plan for graceful degradation.
-
The PWA installation prompt is buried on iOS. Add Safari → Share → Add to Home Screen. Most users won’t find this; an in-app prompt explaining “tap share, then add to home screen” is needed.
-
Android’s “Install App” prompt is automatic (browsers offer it when criteria are met). iOS has nothing equivalent.
-
App Store optimization (ASO) is its own discipline. Keywords, screenshots, descriptions affect downloads. Treat as separate from “building the app.”
-
navigator.userAgentfor mobile detection is unreliable. Browsers spoof it. Feature detection > UA sniffing. -
Offline support requires a service worker. PWAs without service workers don’t work offline. Service worker registration + cache strategy is required.
-
Background sync on PWAs is limited. Web apps mostly can’t run when the user isn’t actively using them. Native apps can. For “send a push at 8am tomorrow,” native usually wins.
-
iOS Safari’s quirks change with each major release. What works in iOS 17 might break in iOS 18. Test across versions.
-
Android fragmentation is real. Different OEMs (Samsung, Xiaomi, etc.) tweak the OS. What works on Pixel may break on Samsung. Common in low-budget Android devices.
-
iPad has its own gotchas. Larger screen, different layout requirements. Some apps look great on iPad with minimal effort; some need separate design work.
-
Apple’s silicon transition + iOS evolution means current iOS apps need recent Xcode, recent SDKs. Old iOS apps gradually stop working.
-
App reviews matter. A 3-star app gets fewer downloads. Solicit reviews carefully (not too aggressively; Apple’s HIG has rules).
-
TestFlight + Google Play Internal Test let you beta test. Use them before broad release.
-
Crash reporting is essential. Sentry, Crashlytics, Bugsnag. A native crash without telemetry = blind debugging.
-
Mobile-specific features (haptics, biometrics, AR) require native code. React Native + Expo provide bridges; pure web cannot access most of these.
-
App size matters. Apps over 100MB face download warnings on cellular. Optimize assets, lazy-load resources.
-
Privacy labels are mandatory now. Apple’s App Store and Google Play both require disclosure of data collection. Plan ahead.
-
Don’t build native unless you have a real reason. Web + PWA covers 80%+ of “I need an app” use cases. Native is for the 20% where it really matters.
-
AI agents help mobile dev too. Claude Code + Expo / React Native works smoothly. Cross-platform AI-assisted mobile dev is a real workflow in 2026.
A practical decision tree
For “should I build a mobile app?”:
- Does it WORK as a website? → Yes → Web first. Add PWA features.
- Is the website constrained by missing native features? → Yes → Cross-platform (React Native / Flutter).
- Does it need EXTREME native UX or features? → Yes → Go native (Swift + Kotlin).
- Are you targeting App Store discovery primarily? → Probably native or cross-platform.
For Bible Quest, the answers were: Yes (1), so web + PWA. Done.
See also
- PWA 🟩 — the web-based mobile path
- Mobile-first thinking 🟩 — designing for mobile screens
- Responsive design 🟩 — the web technique
- React 🟩 — what React Native is based on
- Next.js 🟩 🟦
- What is “the cloud”? 🟩 — mobile apps usually have cloud backends
- Operating systems — overview 🟩 — iOS + Android are OSes
- Containers & Docker 🟩
- Low-code & no-code 🟩 — Glide etc. are mobile-first no-code
- Glossary: iOS, Android, PWA, React Native, Flutter
Sources
- Apple Developer — iOS docs + tooling
- Android Developer — Android docs
- React Native — official docs
- Expo — React Native tooling
- Flutter — official docs
- Apple Human Interface Guidelines — iOS design
- Material Design 3 — Android design
- Capacitor — web → mobile via webview
- App Store Connect — Apple’s app management
- Google Play Console — Google’s