Mobile App Development: iOS, Android & Cross-Platform

Mobile app development is about much more than putting your website into an icon on a home screen. A good app opens instantly, keeps working on a weak signal, sends the right notification at the right moment, passes Apple and Google review on the first try and keeps running after the next iOS and Android release. Getting all of that right takes product thinking, solid frontend engineering and a backend designed for clients that can be offline, outdated or on the other side of the world.

At CodeWiz we build cross-platform apps with React Native and Flutter, native apps in Swift and Kotlin when the product calls for it, and the APIs, databases and infrastructure behind them. Because we are a full-stack team, the app, the backend and the deployment pipeline are designed together instead of being stitched together by three different vendors.

This service is for startups validating a product, companies that want a customer-facing app next to an existing web shop or platform, and teams that need an internal field app for staff, deliveries or inspections. If you already have an app that crashes, lags or keeps getting rejected in review, we can take it over, stabilise it and move it forward.

Mobile developer typing on a laptop with a smartphone and coffee on a wooden desk

React Native & Flutter Apps: One Codebase for iOS and Android

Cross-platform frameworks let one team ship to both stores from a single codebase. For most business apps – catalogues, bookings, loyalty programmes, dashboards, marketplaces, field tools – this is the most cost-effective route, because features, bug fixes and tests are written once.

React Native with Expo

React Native renders real native UI components and is written in TypeScript, so web developers and existing React code can be reused. Since the New Architecture (Fabric renderer, TurboModules and JSI) became the default, the old bridge bottleneck is gone and native modules are faster to call. We build React Native apps on Expo, which gives us EAS Build for cloud builds and signing, EAS Submit for store uploads and EAS Update for over-the-air fixes to the JavaScript layer without waiting for a new store release.

Flutter

Flutter uses Dart and draws every pixel itself with its Impeller rendering engine. That makes the UI look identical on every device and makes heavily animated or custom-branded interfaces easy. Flutter is a strong choice when the design is far from the platform defaults, when you also want desktop or embedded targets, or when your team already knows Dart.

What you get

  • A TypeScript or Dart codebase with a clear structure: navigation, state management (Zustand, TanStack Query, Riverpod or Bloc), API layer and design tokens.
  • Platform-specific touches where they matter: native share sheets, haptics, biometric login, deep links and widgets.
  • Automated tests (Jest, React Native Testing Library, Flutter widget tests, Maestro for end-to-end flows) running in CI.
  • Crash reporting and performance monitoring with Sentry or Firebase Crashlytics from the first build.

Native iOS & Android Development With Swift and Kotlin

Native development means two codebases: Swift with SwiftUI on iOS and Kotlin with Jetpack Compose on Android. It costs more, but it is still the right answer in several situations:

  • Deep hardware access: Bluetooth Low Energy devices, NFC, background location, camera pipelines, audio processing.
  • Platform extensions such as Apple Watch apps, widgets, App Clips, CarPlay, Android Auto or Wear OS.
  • Apps where every millisecond of startup time and every frame of animation matter.
  • Products where the platform look and feel is a selling point and new OS features should be adopted on day one.

There is also a middle ground: Kotlin Multiplatform shares business logic between iOS and Android while keeping fully native UI, and an existing native app can embed React Native or Flutter screens for new features. We also write native modules for cross-platform apps when no library exists for a specific SDK or device.

Mobile App Development Options Compared

There is no universally best framework. The table below summarises the trade-offs we discuss with clients before writing any code:

ApproachLanguageCode sharingPerformanceBest forWatch out for
React Native (Expo)TypeScriptHigh, plus reuse of web logicNear-native for typical business appsTeams with React skills, apps that evolve quicklyThird-party native libraries vary in quality
FlutterDartVery high, including UINear-native, smooth custom animationsStrongly branded UI, multiple targetsUI does not follow platform defaults automatically
Native (Swift, Kotlin)Swift, KotlinNone (two codebases)Best possibleHardware-heavy apps, platform extensionsRoughly double the effort for features and tests
Kotlin MultiplatformKotlin, Swift for iOS UIBusiness logic sharedNative UINative teams that want less duplicationSmaller ecosystem, iOS tooling still maturing
Progressive Web AppJavaScriptShared with the websiteGood, limited device APIsContent and simple tools without store presenceLimited background features, especially on iOS

Our default recommendation for a new business app is React Native with Expo, unless the design, the hardware or your existing team points clearly in another direction.

App Store & Google Play Publishing Without Surprises

Many first-time app owners discover too late that publishing is a project of its own. We handle the whole process and set up the accounts in your company’s name, so you own the listing, the signing keys and the reviews.

Apple App Store

  • An Apple Developer Program membership (99 USD per year) and, for companies, a D-U-N-S number for the organisation account.
  • Privacy nutrition labels, a privacy manifest for apps and SDKs that use sensitive APIs, and in-app account deletion if users can create accounts.
  • TestFlight beta testing, then review against the App Store Review Guidelines. Most reviews finish within a day or two; rejections usually concern missing login credentials for reviewers, incomplete features or digital goods sold outside in-app purchase.

Google Play

  • A one-time 25 USD developer registration, identity verification and a completed Data safety form.
  • New personal developer accounts must run a closed test with at least 12 testers for 14 days before production access; organisation accounts are exempt.
  • Android App Bundles signed with Play App Signing, a target API level that Google raises every year, and staged rollouts that start at a small percentage of users.

Store listing and release management

We prepare screenshots for every required device size, keyword-aware descriptions (app store optimisation), localised listings and release notes. CI pushes builds through internal, beta and production tracks with Fastlane or EAS Submit.

Mobile Backends & APIs Designed for Apps

A mobile backend has requirements a website backend often does not. Old app versions stay installed for months, networks drop mid-request and every screen should load with as few round trips as possible. We build mobile backends in Laravel or Node.js on PostgreSQL or MySQL, with Redis for caching and queues.

  • Versioned APIs: REST or GraphQL endpoints that stay backwards compatible, plus a minimum-version check that can ask users to update when an old build must be retired.
  • Authentication: OAuth 2.0 with PKCE, short-lived access tokens and refresh tokens stored in the iOS Keychain or Android Keystore, plus Sign in with Apple and Google where it helps sign-up.
  • Payloads shaped for screens: pagination, field selection and image resizing through a CDN, so a product list does not download desktop-sized photos.
  • Protection: rate limiting, request validation and abuse detection – the same principles as in our guide to API rate limiting.
  • Payments: Apple and Google in-app purchases for digital goods, and Stripe or PayPal for physical goods and services, following the same practices as our payment gateway integration work.

Firebase or Supabase can speed up an MVP, and we use them when they fit. With complex business rules, existing systems to integrate or strict data residency needs, a custom API is usually cheaper and more flexible over time.

Two hands holding up a smartphone in front of blurred glowing city lights

Push Notifications & Offline Sync Users Can Rely On

Push notifications that people keep enabled

Every notification goes through Apple Push Notification service (APNs) on iOS or Firebase Cloud Messaging (FCM) on Android. iOS and, since Android 13, Android both require the user’s permission, so we ask at a meaningful moment instead of on first launch, and consider provisional notifications on iOS. A typical FCM HTTP v1 message carries both a visible notification and data for deep linking:

{ "message": { "token": "DEVICE_TOKEN", "notification": { "title": "Order shipped", "body": "Your order #1042 is on its way" }, "data": { "type": "order", "orderId": "1042" }, "android": { "priority": "high", "notification": { "channel_id": "orders" } }, "apns": { "payload": { "aps": { "sound": "default", "badge": 1 } } } } }

On the backend we store device tokens per user and platform, remove invalid ones automatically, send through a queue so campaigns never block the API, and let users choose categories (orders, messages, promotions).

Offline-first data and sync

Offline support is a design decision, not a library you add at the end. We keep a local database on the device (SQLite through Expo SQLite, op-sqlite or Drift, WatermelonDB, Room or SwiftData) and treat the network as a way to synchronise rather than a requirement to show data. Changes go into an outbox and are sent with idempotency keys, so a retried request never creates duplicates:

async function flushOutbox() { for (const job of await db.outbox.all()) { const res = await fetch(`${API_URL}/sync`, { method: "POST", headers: { "Content-Type": "application/json", "Idempotency-Key": job.id }, body: JSON.stringify(job.payload), }); if (res.ok) await db.outbox.remove(job.id); else if (res.status === 409) await resolveConflict(job, await res.json()); else break; } }

Conflicts are resolved with rules agreed with you: last write wins for simple fields, server-authoritative for prices and stock, or merge logic for collaborative data. Background sync runs through WorkManager on Android and BGTaskScheduler on iOS, and sync engines such as PowerSync are an option when the data model is large.

Mobile App Security

An app binary is in the hands of every user, including the curious ones. We follow the OWASP Mobile Application Security Verification Standard (MASVS) as a checklist:

  • No API secrets in the app bundle – anything shipped in the binary can be extracted, so sensitive operations happen on the server.
  • Tokens in secure storage, TLS everywhere and certificate pinning for high-risk apps such as finance or health.
  • Play Integrity API and Apple App Attest to make automated abuse of your API harder.
  • Obfuscation with R8 on Android, dependency scanning in CI and minimal permissions, each justified in the store listing.

Common Mobile App Mistakes We Fix

  • Asking for notification, location and tracking permissions on first launch, before the user sees any value.
  • APIs that break old app versions, so users who have not updated suddenly see errors.
  • No crash reporting or analytics, so problems are discovered through one-star reviews.
  • Signing keys and store accounts owned by a former freelancer instead of the company.
  • Loading full-size images and unpaginated lists, which drains battery and mobile data.
  • Testing only on the newest flagship phone, never on an older mid-range Android device.

What Drives the Cost of Mobile App Development

We estimate after a short discovery phase rather than quoting from a feature list alone. The main factors are:

  • The number of screens, user roles and flows, and how custom the design is.
  • Cross-platform or native, and whether tablets, watches or widgets are in scope.
  • Whether a backend already exists or has to be built, and which systems (ERP, CRM, payment providers) must be integrated.
  • Offline requirements and real-time features such as chat or live tracking.
  • Security and compliance needs, and the level of ongoing maintenance after launch.

Apps are never really finished: Apple and Google ship major OS releases every year, and store requirements change with them. We plan maintenance from day one, and our approach to premium development without premium prices keeps it sustainable.

Two people planning at a cafe table with a notebook, smartphone and tablet

How We Work

  1. Discovery: we clarify the users, the core flows, the business goals and the systems the app must connect to, and recommend a framework.
  2. Design and prototype: wireframes and a clickable prototype that you can test on your own phone before development starts.
  3. Build: development in short iterations with regular TestFlight and Play internal builds, together with the backend and APIs.
  4. Test: automated tests, end-to-end flows with Maestro and manual testing on real iOS and Android devices, including older models.
  5. Launch: store listings, review submission and a staged rollout with crash and performance monitoring.
  6. Support: OS and SDK updates, store requirement changes, new features and over-the-air fixes where allowed.

Why CodeWiz

  • App and backend in one team: we build the mobile app, the API, the database and the servers, so nothing gets lost between vendors.
  • Honest technology choices: React Native, Flutter, native or even a PWA – we recommend what fits your product, not what we happen to prefer.
  • Open-source first: Expo, Laravel, Node.js and PostgreSQL keep you free of lock-in, and you own all code, accounts and keys.
  • Performance and security built in: the same team that tunes websites to 100/100 PageSpeed and hardens servers works on your app.
  • Fair pricing: premium development without premium prices, from Banja Luka, working remotely with clients locally and internationally – read more about CodeWiz.

Frequently Asked Questions

How much does it cost to develop a mobile app?

It depends on the number of features, the design, the backend and the integrations. A focused MVP with a handful of core screens is a very different project from a marketplace with payments, chat and offline mode. We give you a clear estimate after discovery, broken down by feature, so you can decide what goes into the first release.

How long does it take to build an app?

A focused MVP usually takes a few months from discovery to store release, while larger products are delivered in phases. Store review itself is quick, but a new personal Google Play account adds the closed testing period.

Should I choose React Native or Flutter?

Both are mature and production-ready. React Native fits teams with JavaScript or React experience and apps that share logic with a web platform; Flutter fits highly customised, animation-rich interfaces. For most business apps either works well, and we explain the trade-offs for your specific case.

Do I need a native app or is a PWA enough?

If you need store presence, reliable push notifications on iOS, background tasks or device features like Bluetooth, a native or cross-platform app is the better choice. For content and simple tools, a progressive web app can be cheaper and faster to launch.

Who owns the app and the source code?

You do. We publish under your developer accounts, hand over the repository, signing keys and documentation, and you can continue with us or any other team.

Can you take over an existing app?

Yes. We start with a code and infrastructure audit, fix crashes and outdated dependencies, update the app to current store requirements and then continue with new features.

Ready to Build Your Mobile App?

Tell us what your app should do and who will use it, and we will propose the right technology, scope and timeline. Contact us to discuss your idea, or explore all of our development services.