Mobile Application Development

Chapter 12
Cross-Platform and Progressive Mobile Development

Bachelors Program in IT
Mobile Application Development   •   Bachelor

Cross-Platform and Progressive Mobile Development

Introduction

Mobile applications can be developed in several ways. A native application is written primarily for one operating system, such as Android or iOS. A hybrid application uses web technologies inside a native container. A progressive web application (PWA) is delivered through the web but can provide installation, offline behavior, and device integration. Cross-platform frameworks allow one project, or a substantial shared codebase, to target multiple operating systems.

The choice among these approaches is an architectural and business decision rather than merely a programming-language preference. It affects performance, user experience, development cost, maintainability, access to device capabilities, release management, security, and the skills required by a team. A technically attractive framework may be inappropriate if it cannot support essential hardware features, if the team cannot maintain it, or if the application has demanding real-time performance requirements.

This chapter compares the principal approaches and evaluates Flutter, React Native, and Kotlin Multiplatform. It also develops a practical decision framework for selecting an approach and applies that framework to an illustrative mobile banking case.

Learning Objectives

By the end of this chapter, students should be able to:

  1. Distinguish native, hybrid, progressive web, and cross-platform development.
  2. Explain how rendering models, platform APIs, and communication layers affect application behavior.
  3. Compare Flutter, React Native, and Kotlin Multiplatform using performance, cost, maintainability, capability, and team-skill criteria.
  4. Select an appropriate development strategy for a stated product context.
  5. Identify risks involving security, accessibility, privacy, governance, and long-term maintenance.
  6. Propose an incremental evaluation process using prototypes and measurable acceptance criteria.

1. The Mobile Development Landscape

1.1 Native development

Native development uses the official tools and languages of a platform. Android applications commonly use Kotlin with Android Studio and Android Jetpack; iOS applications commonly use Swift with Xcode and Apple frameworks. Native applications have direct access to platform APIs, platform conventions, accessibility features, performance tools, and current operating-system capabilities.

The main disadvantage is duplication. A company supporting Android and iOS normally maintains separate user-interface implementations, testing pipelines, and sometimes separate teams. Duplication increases initial and continuing cost, although it can also provide excellent platform-specific experiences.

Native development is generally preferred when an application requires intensive graphics, advanced background processing, specialized hardware, immediate access to new operating-system features, or highly platform-specific interaction patterns.

1.2 Hybrid development

Traditional hybrid applications use HTML, CSS, and JavaScript rendered in an embedded web view. A bridge or plugin layer exposes selected device services such as cameras, storage, notifications, and geolocation. This approach permits web developers to produce installable applications, but performance and interaction quality depend heavily on the web view and bridge.

Hybrid applications are suitable for content-oriented products, internal business tools, forms, and applications whose interface resembles a responsive website. They may be less suitable for complex animation, high-frequency touch interaction, or demanding graphics. The term “hybrid” is sometimes used loosely; therefore, architecture should be described precisely rather than inferred from a framework’s marketing label.

1.3 Progressive web applications

A PWA is a web application enhanced with web-platform capabilities. Typical elements include responsive design, a web app manifest, secure HTTPS delivery, and a service worker that can mediate caching and selected offline behavior. Installation and feature support vary by browser and operating system.

PWAs can reduce distribution friction because users may open a URL rather than visit an application store. They are particularly effective for publishing, commerce, education, reservations, and services that must work across many device types. Limitations may include restricted background execution, inconsistent support for hardware APIs, storage constraints, and differences in installation behavior across browsers.

A service worker is not simply an offline switch. The development team must design cache invalidation, data synchronization, authentication renewal, conflict handling, and failure states. Poorly designed caching can expose stale or sensitive data.

1.4 Cross-platform application development

Cross-platform development seeks to share code across platforms while producing installable mobile applications. “Code sharing” can occur at several levels:

  • Shared business logic only.
  • Shared data, networking, and domain layers.
  • Shared user-interface declarations that are rendered by platform widgets.
  • A common rendering engine that draws most of the interface itself.

Cross-platform development is therefore a spectrum rather than a single architecture. A project may share 90 percent of its domain logic but retain native interfaces for camera, payments, accessibility-sensitive screens, or platform-specific workflows.

2. Architectural Models and Their Consequences

2.1 Rendering models

A framework’s rendering model strongly influences behavior.

Native-widget rendering uses the operating system’s controls. It usually offers strong platform fidelity and accessibility, but differences between platforms can make a single visual design harder to reproduce.

Custom rendering draws controls through a framework-owned engine. It can provide consistent appearance and animation across platforms. However, the framework must reproduce platform semantics, accessibility behavior, text input, gestures, and other details correctly.

Web-view rendering delegates display to a browser engine. It benefits from web standards and web tooling, but performance and device integration depend on the embedded browser and bridge.

Shared logic with native UI separates domain behavior from presentation. It often gives a team native user experiences while reducing duplicated validation, networking, persistence, and business rules.

2.2 Communication boundaries

Cross-platform systems commonly communicate across boundaries: JavaScript to native code, shared Kotlin to platform code, or a framework runtime to a rendering engine. Each boundary introduces concerns about data conversion, asynchronous behavior, error propagation, thread confinement, and version compatibility.

A camera request illustrates the issue. The shared layer may request an image, the platform layer may require permission, the operating system may cancel the operation, and the result may arrive asynchronously. A robust abstraction must represent success, cancellation, denial, and technical failure rather than returning only a nullable image.

2.3 Performance as a multidimensional concept

Performance is not equivalent to a single benchmark score. Relevant dimensions include:

  • Startup time.
  • Frame smoothness during scrolling and animation.
  • Input latency.
  • Memory consumption.
  • Battery and network usage.
  • Time required for background tasks.
  • Package or application size.
  • Reliability on low-end devices.

For a display refreshed at 60 Hz, a frame has approximately 16.7 milliseconds available, calculated as 1 ÷ 60 seconds. This is a useful engineering target, not a universal guarantee: operating-system work, compositing, and device conditions also affect smoothness. A 120 Hz display provides approximately 8.3 milliseconds per frame, making inefficient rendering more visible.

Performance should be measured on representative devices and realistic data sets. A developer workstation or flagship phone can conceal problems experienced by ordinary users.

3. Evaluation Criteria

A disciplined comparison uses explicit criteria rather than general claims.

CriterionQuestions to askEvidence to collect
PerformanceDoes the application meet interaction and startup targets?Profiling, frame-time traces, low-end device tests
CostWhat are development, testing, infrastructure, and migration costs?Estimates, staffing model, prototype results
MaintainabilityCan defects and platform changes be managed efficiently?Code review, modularity, test coverage, release history
CapabilityAre required APIs, accessibility features, and background behaviors available?Capability matrix, proof-of-concept integrations
Team skillsCan the team build and operate the product safely?Skills inventory, training plan, hiring feasibility
Product fitDoes the approach support the desired user experience and distribution model?User research, design review, analytics
RiskWhat happens if a dependency, vendor, or platform policy changes?Dependency analysis and contingency plan

Cost should be considered over the product life cycle, not merely during the first release. A shared codebase can lower feature-development cost but increase the cost of framework upgrades, specialized debugging, or native extensions. Conversely, two native codebases cost more to duplicate but may reduce dependence on a third-party abstraction.

4. Flutter

Flutter is an open-source framework associated with Dart. It generally uses a framework-controlled rendering engine and a widget-based declarative interface. The application describes the desired interface state; the framework rebuilds relevant portions when state changes.

Strengths

  1. A high degree of user-interface sharing.
  2. Consistent visual output across operating systems.
  3. Strong support for custom design systems and animation.
  4. A productive development loop with hot reload.
  5. A mature ecosystem of packages and tools.
  6. A clear separation between widgets, state, and application services when good architecture is followed.

Limitations

Flutter applications may have a larger binary footprint than a minimal native application. The framework must integrate with platform accessibility, text input, navigation, and operating-system conventions. Some device features require plugins or platform-specific code. A package may be poorly maintained, incompatible with a new operating-system release, or insufficient for a regulated product.

Flutter is often attractive when a product requires a consistent branded interface, rich interaction, rapid iteration, and a team willing to learn Dart and Flutter’s rendering model.

5. React Native

React Native uses JavaScript or TypeScript with React’s component and state model. Its interface is associated with native platform components, while application logic runs in a JavaScript environment. Modern versions use an architecture designed to reduce some historical communication overhead and improve interaction between JavaScript and native components, but actual behavior still depends on the application, libraries, and platform implementation.

Strengths

  • Reuse of web-development concepts and, in some organizations, JavaScript or TypeScript skills.
  • A large ecosystem and broad community.
  • Native-oriented user-interface components.
  • Incremental adoption: existing native applications can introduce React Native in selected areas.
  • Good fit for teams already operating React-based web products.

Limitations

The ecosystem contains many third-party packages with varying quality and maintenance. Dependency upgrades can require coordinated changes. A performance problem may originate in JavaScript rendering, native code, a library, or communication between layers, making diagnosis demanding. Complex native integrations still require Kotlin, Java, Swift, or Objective-C knowledge.

React Native is a strong candidate when the team has substantial React and TypeScript expertise and values native component behavior with significant code sharing.

6. Kotlin Multiplatform

Kotlin Multiplatform (KMP) enables Kotlin code to be compiled for multiple targets. Teams commonly share domain logic, networking, serialization, persistence, validation, and synchronization while retaining native Android and iOS user interfaces. Shared UI is also possible through technologies such as Compose Multiplatform, but teams should evaluate its platform coverage and maturity for their particular requirements.

Strengths

  • Excellent sharing of business rules and data-related code.
  • Native user interfaces can preserve platform conventions and accessibility behavior.
  • Strong fit for organizations already using Kotlin on Android or on the server.
  • The architecture makes platform-specific implementation explicit rather than hiding it.
  • Shared tests can protect critical domain behavior.

Limitations

KMP does not automatically eliminate duplicated UI work. iOS development still requires suitable Apple-platform skills when native interfaces are used. Build configuration, interoperability, dependency management, and debugging across targets require expertise. Teams seeking one visual implementation may find a widget-sharing framework more productive.

KMP is particularly appropriate when business logic is complex, native experience matters, and the organization accepts a multiplatform architecture rather than demanding complete UI uniformity.

7. Comparative Analysis

DimensionNativeHybrid/PWAFlutterReact NativeKotlin Multiplatform
Performance ceilingVery highVariable; web constrainedHigh for many applicationsHigh when well designedNative for shared logic and native UI
UI sharingLowHighVery highHighLow to high, depending on UI strategy
Platform fidelityExcellentVariableConsistent but framework-mediatedGenerally native-orientedExcellent with native UI
Hardware accessImmediateBrowser/plugin dependentPlugin or platform codeNative modules or librariesExplicit platform code
Team entry pointPlatform specialistsWeb specialistsDart/Flutter specialistsReact/TypeScript specialistsKotlin plus platform specialists
Main riskDuplicationBrowser and web-view limitsEngine/plugin dependenceDependency and bridge complexityMore than one UI technology
Best fitSpecialized, demanding appsReach and contentBranded shared UIReact-centered organizationsShared domain logic with native UX

No row should be interpreted as an absolute rule. A well-engineered React Native application can outperform a poorly engineered native application, and a PWA can provide a superior experience for a content service whose requirements do not include advanced hardware access.

8. A Practical Selection Framework

A useful decision process has six stages.

Stage 1: Define non-negotiable requirements

List required platforms, offline behavior, accessibility obligations, hardware integrations, security controls, data residency requirements, expected device range, and release deadlines. Separate “must have” capabilities from preferences.

Stage 2: Classify the dominant experience

Determine whether the product is primarily content, forms, transaction processing, real-time interaction, media, graphics, or sensor-driven. A news reader and a location-based augmented-reality tool should not begin with the same assumptions.

Stage 3: Map capability gaps

For each candidate, record whether a requirement is supported directly, through a maintained library, through custom native code, or not adequately supported. “Possible” is not equivalent to “production-ready.”

Stage 4: Build a vertical-slice prototype

A meaningful prototype should include navigation, authentication, a representative data flow, offline or poor-network behavior, at least one difficult hardware feature, accessibility checks, and release builds. A visually attractive screen alone provides weak evidence.

Stage 5: Measure and review

Define acceptance thresholds before testing. Examples include maximum cold-start time, acceptable frame-time distribution, crash-free sessions, memory ceiling, accessibility findings, and time required to implement a platform-specific feature. Results should be recorded by device class and operating-system version.

Stage 6: Decide and govern

Select the approach, document why alternatives were rejected, assign ownership of dependencies, and define an exit or contingency strategy. Architecture decisions should be revisited when requirements—not fashion—change.

9. Illustrative Case: A Mobile Banking Application

This is a fictional illustrative case designed for educational purposes.

Background

HarborBank operates a web portal and separate Android and iOS applications. It wants a new mobile application for account balances, transfers, card controls, biometric reauthentication, transaction alerts, and branch location. The bank has a strong Kotlin Android team, a smaller Swift team, and a web team experienced in TypeScript and React. The product must support older devices, strict accessibility expectations, audit logging, and operation during intermittent connectivity.

Problem

The bank wants to reduce duplicated business logic and release features more quickly, but it cannot compromise security, platform authentication, accessibility, or reliability. A complete rewrite in an unfamiliar framework would create unacceptable operational risk.

Analysis

A PWA would simplify distribution, but background notifications, secure device authentication, and certain platform security behaviors would be difficult to guarantee consistently. A fully shared custom UI could reduce duplication, but banking workflows must follow platform conventions and be thoroughly accessible. React Native is plausible because of the web team’s skills, but the bank would still need native expertise for authentication and secure storage. Flutter would provide a consistent interface, yet the organization would need to establish Dart expertise and validate all security-sensitive plugins.

KMP offers a strong fit for sharing transaction validation, networking models, serialization, error handling, and synchronization while retaining native Android and iOS interfaces. The bank can keep security-sensitive integrations explicit in each platform and use shared tests for domain rules.

Approach and solution

The bank chooses KMP for the domain and data layers, native UI for the first release, and a small platform abstraction for biometric authentication, secure storage, push registration, and analytics. It creates a capability matrix and requires two vertical prototypes: a transfer flow and an offline account-history flow. Sensitive data is not placed in general web caches or logs. Each platform receives an accessibility review using screen readers, dynamic text sizes, contrast checks, and keyboard or switch-navigation testing where applicable.

Outcome

The approach produces more than one UI implementation, but shared validation and networking reduce inconsistent business behavior. The team accepts the additional iOS skill requirement because native platform fidelity and governance are more valuable than maximum UI sharing. A future shared UI pilot remains possible for low-risk internal screens, but it is not allowed to dictate the architecture of authentication or money movement.

Learning points

  1. The optimal amount of code sharing depends on risk and capability, not on a universal percentage target.
  2. Security-sensitive platform services should have explicit ownership and failure behavior.
  3. A prototype must exercise difficult requirements rather than merely demonstrate a pleasant screen.
  4. Team composition is an architectural constraint.

10. Maintainability, Testing, and Delivery

Cross-platform systems require layered testing. Shared domain logic should have unit tests for validation, authorization decisions, formatting, and synchronization rules. Platform adapters should have integration tests for permissions, storage, notifications, and lifecycle behavior. User-interface tests should verify critical journeys on representative operating systems.

Continuous integration should build every supported target, run static analysis, execute tests, check dependency licenses, and produce reproducible release artifacts. Teams should monitor framework and plugin updates rather than accepting them automatically. A dependency inventory should identify ownership, license, security advisories, supported versions, and replacement options.

Good maintainability practices include:

  • Keeping business rules independent of UI frameworks.
  • Defining stable interfaces for platform services.
  • Avoiding unnecessary platform-specific conditionals in shared code.
  • Treating accessibility as a design and testing requirement.
  • Documenting lifecycle, threading, permission, and error assumptions.
  • Measuring crash rates and slow interactions after release.
  • Planning framework upgrades as product work.

11. Security, Privacy, and Governance

The selected framework does not remove the developer’s security responsibilities. Mobile applications should minimize collected data, protect credentials and tokens, validate authorization on the server, use secure transport, and avoid placing secrets in source code. Local storage should be selected according to sensitivity and platform controls. Logging must exclude passwords, authentication tokens, full payment data, and unnecessary personal information.

Permissions should be requested in context and only when needed. A user who denies location or notification access must receive a useful alternative where possible. Privacy notices should accurately explain collection, retention, sharing, and deletion. Accessibility is also a governance concern: excluding users through inaccessible controls can create legal, ethical, and commercial consequences.

Organizations should consider software supply-chain risk, open-source license obligations, third-party tracking, export controls where relevant, and platform-store policies. A cross-platform framework may reduce development duplication but does not create a single compliance regime; each target platform and jurisdiction remains relevant.

12. Contemporary Directions and AI-Assisted Development

Current development is moving toward stronger declarative UI models, shared domain modules, improved interoperability, WebAssembly-enabled web experiences, and more capable device APIs. These developments increase choice but also make evaluation more important. A framework’s present feature set is less important than its release discipline, documentation, ecosystem health, and ability to support the product over several years.

AI-assisted tools can generate boilerplate, tests, documentation drafts, and migration suggestions. They can also introduce insecure code, incorrect platform assumptions, licensing uncertainty, or subtle privacy defects. Generated code must undergo human review, static analysis, tests, threat modeling, and dependency inspection. AI should accelerate engineering judgment, not replace it.

Best-Practice Checklist

Before committing to an approach, a team should be able to answer “yes” to the following questions:

  • Have the essential platform capabilities been tested on real devices?
  • Are performance targets measurable and appropriate for low-end devices?
  • Is the ownership of native integrations clear?
  • Can the team maintain dependencies and respond to operating-system changes?
  • Are accessibility, privacy, and security included in acceptance criteria?
  • Does the architecture isolate business rules from presentation technology?
  • Has the total life-cycle cost been compared rather than only initial development effort?
  • Is there a documented contingency if a framework or plugin becomes unsuitable?

Chapter Summary

Native development provides direct platform access and the highest potential for platform-specific optimization, but it duplicates substantial implementation work. Hybrid applications and PWAs exploit web skills and broad distribution, although browser, web-view, and hardware limitations must be considered. Cross-platform frameworks occupy a range: they may share UI, shared logic, or both.

Flutter is strong for consistent, custom, and animated interfaces. React Native is attractive to teams with React and TypeScript expertise and provides a native-oriented component model, while still requiring native knowledge for difficult integrations. Kotlin Multiplatform is especially effective for sharing business and data logic while retaining native user interfaces. None is universally superior.

A sound selection evaluates performance, cost, maintainability, capability, team skills, product fit, and risk. Vertical-slice prototypes, real-device measurement, capability matrices, layered testing, and dependency governance provide better evidence than popularity or superficial benchmark claims. Security, privacy, accessibility, and long-term ownership must be treated as architectural requirements.

Key Terms

Native development: Building primarily with the official tools and APIs of one operating system.

Hybrid application: An installable application that commonly uses web technologies within a native container.

Progressive web application: A web application enhanced with installation, caching, and selected device capabilities.

Cross-platform development: Creating software that targets multiple platforms through shared code or shared architecture.

Rendering engine: Software responsible for converting interface descriptions into visible pixels.

Web view: An embedded browser component used to display web content inside an application.

Declarative UI: An interface style in which code describes the desired state of the interface.

Platform API: An operating-system service available to application developers.

Bridge: A communication mechanism between shared or managed code and platform-native code.

Flutter: A Dart-based framework with a framework-controlled widget and rendering model.

React Native: A React-based framework for building mobile applications with JavaScript or TypeScript.

Kotlin Multiplatform: A technology for sharing Kotlin code across multiple targets.

Vertical slice: A prototype that exercises a complete, representative path through a system.

Capability matrix: A structured comparison of required features and implementation support.

Frame time: The time available or required to produce one displayed frame.

Maintainability: The ease with which software can be corrected, adapted, tested, and extended.

Progressive enhancement: Adding advanced capabilities while retaining a useful basic experience.

Service worker: A browser-managed script that can mediate requests, caching, and selected background tasks.

Platform fidelity: The degree to which an application follows a platform’s interaction and visual conventions.

Review Questions

Short Answer Questions

  1. What is the principal difference between a native application and a PWA?
  2. Why can a cross-platform application still require native platform code?
  3. Name three dimensions of mobile performance.
  4. What is the purpose of a capability matrix?
  5. Why should framework selection consider team skills?

Long Answer Questions

  1. Compare native, hybrid, PWA, Flutter, React Native, and Kotlin Multiplatform development across performance, cost, maintainability, capability, and team skills.
  2. Explain how rendering models influence platform fidelity, accessibility, and performance.
  3. Describe a complete framework-selection process from requirements analysis to governance.
  4. Evaluate the advantages and disadvantages of sharing business logic while retaining native user interfaces.
  5. Explain the security, privacy, accessibility, and supply-chain responsibilities of a cross-platform mobile team.

Analytical / Application Questions

  1. A university needs a cross-device event application with schedules, maps, notifications, and occasional offline access. It has a web-focused TypeScript team and no advanced graphics requirements. Recommend an approach and justify it using at least five criteria.
  2. A fitness application requires continuous sensor collection, background processing, animated charts, and integration with platform health services. Compare Flutter, React Native, Kotlin Multiplatform, and native development, then recommend a strategy.
  3. Design a vertical-slice evaluation for a proposed mobile payment application. Specify the difficult features to prototype, performance and security evidence to collect, and criteria for accepting or rejecting the framework.

Multiple Choice Questions with Answers

Question 1

Which approach normally provides the most direct access to operating-system APIs and platform-specific behavior?

A. Native development

B. Progressive web development

C. Traditional hybrid development

D. A web-only responsive site

Correct Answer: A. Native development

Question 2

What is a principal characteristic of a progressive web application?

A. It must be written in Kotlin

B. It uses web technologies enhanced with capabilities such as installation and caching

C. It always has unrestricted access to device hardware

D. It requires two completely separate codebases

Correct Answer: B. It uses web technologies enhanced with capabilities such as installation and caching

Question 3

Flutter is primarily associated with which language?

A. Swift

B. Java

C. Dart

D. C#

Correct Answer: C. Dart

Question 4

Which framework is especially associated with sharing Kotlin business logic while retaining native user interfaces?

A. React Native

B. Flutter

C. A service worker

D. Kotlin Multiplatform

Correct Answer: D. Kotlin Multiplatform

Question 5

At a 60 Hz display refresh rate, the approximate duration of one frame is:

A. 1.7 ms

B. 16.7 ms

C. 60 ms

D. 600 ms

Correct Answer: B. 16.7 ms

Question 6

Why can a cross-platform application still require native programming?

A. Shared code cannot contain any business rules

B. Native code is required for every screen

C. Some hardware services, platform APIs, or specialized behaviors need platform-specific integration

D. Cross-platform frameworks cannot perform network requests

Correct Answer: C. Some hardware services, platform APIs, or specialized behaviors need platform-specific integration

Question 7

Which artifact records whether each candidate technology can meet each required product capability?

A. Capability matrix

B. Color palette

C. Source-code license header

D. Storyboard only

Correct Answer: A. Capability matrix

Question 8

A major advantage of React Native for an organization with an established React web team is:

A. It eliminates all native platform knowledge

B. It uses concepts and skills related to React and JavaScript or TypeScript

C. It guarantees identical performance on every device

D. It requires no third-party dependencies

Correct Answer: B. It uses concepts and skills related to React and JavaScript or TypeScript

Question 9

Which practice gives the strongest evidence when selecting a mobile framework?

A. Choosing the framework with the most social-media attention

B. Comparing only application icon designs

C. Building a vertical slice and testing it on representative real devices

D. Testing only on a developer workstation

Correct Answer: C. Building a vertical slice and testing it on representative real devices

Question 10

Which statement best describes life-cycle cost in framework selection?

A. It is limited to the cost of writing the first release

B. It includes development, testing, upgrades, staffing, operations, and possible migration

C. It is always lowest when the most code is shared

D. It excludes dependency and platform-upgrade work

Correct Answer: B. It includes development, testing, upgrades, staffing, operations, and possible migration

Mobile Application Development
Chapter 12 of 15