← Studio Log
D. 기술 신뢰 (Uy tín)하이브리드 앱크로스플랫폼앱 개발 방식기술 선택 기준모바일 개발

One Codebase for Web, iOS, and Android: How to Decide

One Codebase for Web, iOS, and Android: How to Decide
by Yeowubie

What Actually Separates Native, Hybrid, and Web

The difference comes down to who draws the screen. Native apps are built separately with the toolkits Apple and Google provide. Web apps are drawn by the browser. Hybrid approaches start from one shared codebase and target both platforms at once. Most differences in timeline, maintenance load, and performance follow from that structure.

Native development means writing one codebase for iOS and another for Android. The same login screen gets built twice, the same bug gets fixed twice, the same specification change gets applied twice. In exchange, the product can use whatever the operating system ships the day it ships, and the interface rarely feels out of step with platform conventions.

The web has no installation step. Open a link and the latest version is already there, and releases go out without waiting for store review. Once you count responsive layouts and the ability to pin an icon to the home screen and launch it like an app, more services than people expect are fully served by the web alone. Push notifications, background execution, and certain sensor permissions remain tied to browser and operating system policy, so those need checking before you commit.

In practice the word hybrid covers at least three different things. One is building screens with web technology and running them inside an application shell. Another is shared code that calls each platform's real interface components. A third is a framework that draws every screen itself with its own graphics engine. The three differ in performance behaviour, in how quickly they catch up with new operating system features, and in how design work has to be handled.

That is why judging by the framework name printed on a quote tends to go wrong. Names rise and fall over a few years, and each version behaves differently from the last. The questions that stay useful are elsewhere. Who draws the screen in this approach, how long after a new operating system feature ships can our product use it, and when something breaks, which layer do we look in.

When Hybrid Fits and When It Does Not

The deciding factor is what your screens do. If most of them are lists, detail views, input forms, search, and data rendered from a server, a single codebase fits well. If the product has to draw every frame, read sensors continuously, or use a brand new operating system capability on launch day, platform specific development is the safer call.

The good fit deserves detail. Services whose core work is reading and writing data belong here: booking, ordering, attendance, recruitment, membership management, internal business tools. So do products still testing market response, where features change often, products that must appear in both stores on the same date, and small teams where one person covers many screens. Under those conditions the cost of carrying two parallel codebases outweighs what you get back.

The poor fit is equally clear. It applies whenever drawing quality is the product itself: real time camera processing, video and audio editing, three dimensional graphics, and games. Background work such as recording location second by second or holding a long connection to a Bluetooth device is also awkward. Sectors with tightly specified security requirements, finance and healthcare among them, and organisations that already run established iOS and Android teams, usually have little reason to merge.

The ambiguous middle is the widest band of all. Maps, payments, push, biometric authentication, and file uploads generally have a connection path available, but their quality and maintenance state vary. The more essential the feature, the more it should be verified with something running before a contract is signed. Building one screen with that feature wired up and running it on real devices takes a few days, and those days can redirect the following months.

None of this has to be an all or nothing choice either. Keeping most screens in shared code while pulling one or two heavy screens into platform specific modules is a common arrangement. Launching on the web first to gather users and building the app once demand is evident also works often. Rather than settling everything up front, delay the decisions that are hard to reverse.

What a Single Codebase Genuinely Saves

What you save is not lines of code but duplicated judgement. The gain comes from not interpreting the same specification twice, not reproducing the same defect twice, not reviewing the same change twice. The popular claim that a shared codebase halves the work swings widely depending on screen type, but this removal of duplication holds up in most projects.

Building two versions is not twice the work so much as slightly more than twice. Every specification change requires checking that both implementations understood it the same way, and when the two behave differently, someone has to run a meeting to decide which one is correct. Small divergences accumulate until support answers and test cases split in two, and eventually the team is unsure which platform to describe as the reference.

The strongest effect appears after the initial build rather than during it. A service spends far longer being maintained than being created. Operating systems move up every year, policies shift, screens multiply. Across that long stretch, maintaining one codebase behaves less like a discount and more like interest returned in small amounts every month.

It matters just as much to know what is not saved. Store review still happens separately for each platform. Real device testing still happens on both sides. Interface conventions differ, so design adaptation remains, and the server and database were shared to begin with, which means they never belonged in the savings column. The same applies to localisation, accessibility, notification delivery, and release automation. What a shared codebase removes is one portion of the schedule, not the schedule.

Yeowubie Interaction has worked through this judgement on its own products. onSpots, our attendance service, is published for both iOS and Android and supports English, Vietnamese, and Korean. In those conditions it is obvious where repeated cost appears. Change a single line of copy and it has to be verified across three languages and two platforms, and the number of checks grows by multiplication. When we set the structure, the problem we actually spent time on was that multiplication rather than raw performance.

What You Give Up on Performance and Device Features

In most business applications, perceived speed is governed by server response time, image size, and list handling rather than by rendering approach. Differences do surface in specific places, though: the time from tap to usable screen, smoothness while scrolling quickly through long lists, screen transition animation, and installer size.

Each approach pays a different price. Running web technology inside an application incurs a handover cost whenever it crosses into device features such as the camera or the file system, and when a lot of data moves through that boundary it shows up as stutter. A framework that draws screens itself carries less of that burden, but small differences can remain in default system fonts, text selection behaviour, and cooperation with screen reading tools. Neither is categorically better. What matters is which burden the screens you are building happen to be sensitive to.

On device features, the practical friction is support lag. When an operating system ships something new, native code can use it immediately, while shared code waits for a connecting layer to appear. Many of those connectors are community maintained, and when a maintainer steps away, updates stop at some point. At that stage you write platform specific code yourself anyway. This is exactly why choosing a shared codebase still requires some real iOS and Android knowledge inside the team.

There is also a recurring cost to budget for. When a framework moves to a major version, connectors and libraries have to move with it, and that work occupies schedule without producing features. If the budget never accounts for it, versions fall behind, and the further behind they fall the harder the upgrade becomes.

Avoid nailing any of this down with numbers. Framework performance varies by version, by device, and by how a screen is composed, so yesterday's comparison table carries no guarantee for today. The recommendation is simpler. Build the one or two screens you expect to be heaviest, then run them on the devices you are actually targeting. If most of your users are on mid range hardware, do not draw conclusions from a single high end handset. That measurement answers your decision more directly than any published material.

Questions to Settle Before You Decide

These questions put the decision on facts instead of documents. What the product does, who maintains it and for how long, and what devices your users hold. When answers across those three axes converge, the approach usually narrows on its own. When they scatter, that scatter marks exactly where a prototype is needed.

On the product side, ask this. What share of your screens involves real time graphics, camera processing, or continuous location tracking. Does anything have to work offline. Among push notifications, payments, maps, and biometric authentication, which are mandatory, and has that one been proven on the approach you are considering. Could the first version ship as a web service reached by link, with no store listing at all. Do regulatory or security requirements force a particular implementation.

Organisational questions are more practical still. What is the team already fluent in. Can you keep hiring for that skill in your region. Who owns this code for the two years after launch. If it is outsourced, how are handover scope and source ownership written into the contract. Who performs framework version upgrades, and on what cadence. Choose a technology without answering those five and you end up with a well built application and nobody to look after it.

The user side needs checking too. Do not guess what devices your users hold, confirm it with data. If a web service already exists, the access logs hold the answer, and if it does not, asking a handful of early users is enough. Decide now whether multiple languages are required and whether the language count is likely to grow. Languages and platforms multiply against each other, so adding them late gets expensive quickly.

Finally, leave yourself a way back. Separating the layer that draws the interface from the layer that handles data means that swapping one screen to platform specific code later does not force a rebuild. Yeowubie Interaction develops for clients across Korea and Vietnam while running its own products, and has passed through this decision more than once. The conclusion has been the same each time. There is no approach that is correct in the abstract, only the one that suits this product and this team. And that answer tends to show up on real devices before it shows up in a meeting room.

Related posts