---
title: "iOS and Android app development · Oxarus Studio"
description: "We build your iOS and Android apps end to end: apps that work offline, send notifications, use the device's camera and location, and stay solid in the stores."
url: https://oxarus.com/en/studio/mobile
key: studio-mobile
route: /studio/mobile
unit: studio
locale: en
status: live
alternates:
  tr: https://oxarus.com/tr/studio/mobile
  en: https://oxarus.com/en/studio/mobile
documents:
  json: https://oxarus.com/machine/en/studio/mobile.json
  jsonld: https://oxarus.com/machine/en/studio/mobile.jsonld
  txt: https://oxarus.com/machine/en/studio/mobile.txt
schema: oxarus.machine/2.0
---

# iOS and Android app development · Oxarus Studio

> We build your iOS and Android apps end to end: apps that work offline, send notifications, use the device's camera and location, and stay solid in the stores.

Breadcrumbs: [Oxarus home](https://oxarus.com/en) › [Oxarus Studio](https://oxarus.com/en/studio) › [Mobile](https://oxarus.com/en/studio/mobile)

## Notices

- Interface data marked as representative is illustrative; it is not a real client, result or measurement.

## Sections

- [in pockets, every day.](#hero)
- [everything the phone can do.](#native)
- [launch is part of the job.](#release)
- [keeping it running is on us.](#health)
- [one codebase or two apps?](#stack)
- [let's put your app in their pockets.](#cta)

<a id="hero"></a>
<!-- section:hero component:MobileHero kind:hero sources:messages:studioMobile.hero -->

## in pockets, every day.

_STUDIO · MOBILE_

End-to-end app development for iPhone and Android. They keep working when the connection drops and send notifications at the right moment, and we run the whole process from store review to launch.

<https://oxarus.com/en/studio/mobile>

- [Tell us about your app](https://oxarus.com/en/studio/mobile#cta-heading) → `open_page(path="/studio/mobile", anchor="cta-heading")`
- [What it can do](https://oxarus.com/en/studio/mobile#native) → `open_page(path="/studio/mobile", anchor="native")`

- iOS and Android at the same time
- Works offline
- App Store and Google Play submissions included

1. Two devices
2. Offline
3. Notification

<!-- demo:start messages:studioMobile.hero.demo -->
_Representative interface data_ · Illustrative app screens.

- **brand:** Brewline
- **hello:** Good morning, Sophia
- **points:** 340 points
- **reward:** 2 more for a free coffee
- **menuTitle:** What are we drinking today?

- **Filter coffee**
  - **price:** ₺85
  > Ethiopia, V60
- **Oat latte**
  - **price:** ₺120
  > Double shot
- **Cold brew**
  - **price:** ₺110
  > 16 hours

- **order:** Place order
- **offline:** Offline
- **queued:** Order queued
- **queuedBody:** It'll send automatically once you're back online.
- **lockTime:** 08:42
- **lockDate:** Tuesday, September 15

**Your oat latte is ready**

- **app:** BREWLINE
- **body:** Moda branch · Pick it up at the counter
- **ago:** now

**Your order**

- **eta:** 2 min

1. Received
2. Preparing
3. Ready

- **store:** Moda branch · Order A-214

- **store:** Moda branch · 350 m

Hot · Iced · Sweets

- **light:** Cream theme
- **dark:** Dark theme

- **queueMeta:** 1 order · ₺120
- **retry:** Waiting for connection

**Your points were updated**

- **body:** +12 points · Total 352
- **ago:** 08:15

<!-- demo:end -->

<a id="native"></a>
<!-- section:native component:NativeCapabilities kind:features anchor:#native sources:messages:studioMobile.native -->

## everything the phone can do.

_DEVICE_

Apps do what websites can't. Pick one and see how it works on a phone.

<https://oxarus.com/en/studio/mobile#native>

- **Camera scanning**
  Scans an invoice, ID or barcode and fills in the form for you.
  - _Representative interface data_ · Illustrative screen
    - **screen:** Place the barcode inside the frame
  - _Representative interface data_ · Illustrative screen
    - Barcode scanned
    - Product · Oat milk 1 L
    - Barcode · 8690000123457
    - Stock · 24 units
- **Location**
  Shows the nearest branch, the field team or a delivery on the map.
  - _Representative interface data_ · Illustrative screen
    - **screen:** Nearest to you: Moda branch · 350 m
  - _Representative interface data_ · Illustrative screen
    - Open · until 22:00
    - 4 min · walk
    - 3 · in line
    - ₺120 · last order
    - Get directions
- **Face ID and fingerprint**
  Secure sign-in and payment approval without typing a password.
  - _Representative interface data_ · Illustrative screen
    - **screen:** Confirming with Face ID
  - _Representative interface data_ · Illustrative screen
    - No password needed
    - Payee · Brewline Moda
    - Amount · ₺240
    - Approved · 0.4 s
  - _Representative interface data_ · Illustrative screen
    - **screenAndroid:** Confirming with fingerprint
- **Smart notifications**
  To the right person, at the right time, without needless repeats.
  - _Representative interface data_ · Illustrative screen
    - **screen:** Your package arrives today between 14:00–16:00
  - _Representative interface data_ · Illustrative screen
    - **label:** Delivery
  - _Representative interface data_ · Illustrative screen
    - now
    - Order
    - Your order has shipped · 2 items
    - 12 min
    - Invoice
    - Your September invoice is ready
    - 1 h
    - Tuesday, September 15
- **Offline mode**
  Keeps recording in elevators, warehouses and construction sites, then syncs once the connection is back.
  - _Representative interface data_ · Illustrative screen
    - **screen:** 3 records waiting to sync
  - _Representative interface data_ · Illustrative screen
    - **label:** Offline
  - _Representative interface data_ · Illustrative screen
    - Field records
    - Stock count · Block B · 09:12
    - Delivery photo · Kadıköy · 09:20
    - Fault note · Elevator 2 · 09:31
    - Morning check · Synced · 08:40
- **Apple Pay and Google Pay**
  One-tap payment without entering card details.
  - _Representative interface data_ · Illustrative screen
    - **screen:** ₺240 · Double-click to confirm
  - _Representative interface data_ · Illustrative screen
    - **label:** Brewline
  - _Representative interface data_ · Illustrative screen
    - Item · 2 × Oat latte
    - Pickup · Moda branch
  - _Representative interface data_ · Illustrative screen
    - **screenAndroid:** ₺240 · Tap to confirm

_Interface labels:_ Platform

<a id="release"></a>
<!-- section:release component:ReleaseTrack kind:steps anchor:#release-heading sources:messages:studioMobile.release -->

## launch is part of the job.

_STORES_

Test builds, store reviews, rejected submissions. We track all of it; you just see that the new version is live.

<https://oxarus.com/en/studio/mobile#release-heading>

<!-- demo:start messages:studioMobile.release.version -->
_Representative interface data_ · Representative

- **version:** 2.4.0

<!-- demo:end -->

- _iPhone and iPad_
  - **store:** App Store
  1. Build
  2. TestFlight
  3. Apple review
  4. Live
  - _Representative interface data_ · Representative
    - 14 min
    - 35 min
    - ~24 h
    - next day
- _Phone and tablet_
  - **store:** Google Play
  1. Build
  2. Closed testing
  3. Google review
  4. Live
  - _Representative interface data_ · Representative
    - 12 min
    - 1 h
    - ~6 h
    - same day

Small fixes reach users the same day through in-app updates, without waiting on the stores.

<!-- demo:start messages:studioMobile.release.status -->
_Representative interface data_ · Representative

- **waiting:** Waiting
- **running:** In progress

> Live

<!-- demo:end -->

<!-- demo:start messages:studioMobile.release.rollout -->
_Representative interface data_ · Representative

- **rollout:** Staged rollout

<!-- demo:end -->

<!-- demo:start messages:studioMobile.release.log -->
_Representative interface data_ · Representative

**release.log**
- _09:02_
  - **tick:** 0
  - **text:** Building 2.4.0 (318) · iOS and Android
- _09:11_
  - **tick:** 0
  - **text:** Automated tests passed, builds signed
- _09:16_
  - **tick:** 1
  - **text:** Uploaded to the Play closed testing track
- _09:18_
  - **tick:** 1
  - **text:** Release notes added · Turkish and English
- _09:51_
  - **tick:** 2
  - **text:** TestFlight · opened to 42 testers
- _10:05_
  - **tick:** 2
  - **text:** Submitted for review on both stores
- _15:20_
  - **tick:** 3
  - **text:** Google review approved
- _15:24_
  - **tick:** 4
  - **text:** Rolled out to 10% of Play users
- _+1d_
  - **tick:** 5
  - **text:** Apple review approved, live on the App Store
- _+1d_
  - **tick:** 5
  - **text:** Crash rate normal, Play rollout raised to 100%

<!-- demo:end -->

- **ota tag:** 2.4.1 · same day

_Interface labels:_ Publish new version · Replay

<a id="health"></a>
<!-- section:health component:AppHealth kind:content anchor:#health-heading sources:messages:studioMobile.health -->

## keeping it running is on us.

_AFTER LAUNCH_

After every release we check the same dashboard: is the app crashing, are users updating, what are the ratings saying?

<https://oxarus.com/en/studio/mobile#health-heading>

<!-- demo:start messages:studioMobile.health.crash -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

- **crash:** Crash-free sessions

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.rating -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

- **rating:** Store rating

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.ratingCount -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

- **ratingCount:** 2,184 ratings

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.adoption -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

- **adoption:** Version adoption

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.versions -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

- 0
  - **v:** 2.4
  - **p:** 78
- 1
  - **v:** 2.3
  - **p:** 18
- 2
  - **v:** Other
  - **p:** 4

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.startup -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

- **startup:** Startup time

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.startupValue -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

- **startupValue:** 0.9 s

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.board -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

- **board:** Brewline · live · v2.4.0

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.periods -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

7 days · 30 days

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.ratingBars -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

86 · 8 · 3 · 1 · 2

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.adoptionNote -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

> First 14 days after release

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.startupRows -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

- 0
  - **platform:** iOS
  - **p50:** 0.8
  - **p90:** 1.3
- 1
  - **platform:** Android
  - **p50:** 1
  - **p90:** 1.7

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.startupStats -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

- **Daily sessions:** 18.4K
- **ANR rate:** 0.21%
- **API errors:** 0.08%

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.events -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

**Recent events**
- _09:40_
  - **text:** 2.4.0 live on the App Store
- _08:12_
  - **text:** Android rollout reached 100%
- _yesterday_
  - **text:** Slow startup on older devices, fixed in 2.4.1
- _yesterday_
  - **text:** Crash rate stayed below threshold

<!-- demo:end -->

<!-- demo:start messages:studioMobile.health.secondsUnit -->
_Representative interface data_ · Illustrative values; the real dashboard is set up per project.

- **secondsUnit:** s

<!-- demo:end -->

<a id="stack"></a>
<!-- section:stack component:StackChoice kind:compare anchor:#stack-heading sources:messages:studioMobile.stack -->

## one codebase or two apps?

_TECHNOLOGY_

There's no single right answer. We choose per project and tell you why up front.

<https://oxarus.com/en/studio/mobile#stack-heading>

- **Single codebase**
  - **tech:** React Native · Expo
  - **source:** Two apps from one source
  **When it fits**
  - When the app and web will evolve together
  - When the first release needs to ship fast
  - When most screens are lists, forms and content
  > The right starting point for most business apps.
  - Scanner.tsx
  - app.json
  - **Shared code**
    85–95%
  - **First release**
    8–12 weeks
  - **Device access**
    Via modules
  - **Workflow**
    One workflow
- **Separate native apps**
  - **tech:** Swift · Kotlin
  - **source:** Each platform from its own source
  **When it fits**
  - When camera, audio or sensors are used heavily
  - When widgets and watch apps matter
  - When interaction is graphics-heavy or game-like
  > For projects that need the deepest device access.
  - ScanView.swift
  - ScanActivity.kt
  - **Shared code**
    0–20%
  - **First release**
    14–20 weeks
  - **Device access**
    Full
  - **Workflow**
    iOS and Android apart

#### Build outputs

<a id="cta"></a>
<!-- section:cta component:StudioCta kind:cta anchor:#cta sources:messages:studioMobile.cta -->

## let's put your app in their pockets.

_MOBILE_

Tell us what you want your users to do on their phones. Together we'll pin down which approach fits and what the first release covers.

<https://oxarus.com/en/studio/mobile#cta>

- [Tell us about your app](https://oxarus.com/en/contact?start=studio) → `start_project_brief(topic="studio")`
- [info@oxarus.com](mailto:info@oxarus.com?subject=Mobile%20app) → `contact(subject="Mobile app")`

## Actions

- [Tell us about your app](https://oxarus.com/en/studio/mobile#cta-heading) → `open_page(path="/studio/mobile", anchor="cta-heading")`
- [What it can do](https://oxarus.com/en/studio/mobile#native) → `open_page(path="/studio/mobile", anchor="native")`
- [Tell us about your app](https://oxarus.com/en/contact?start=studio) → `start_project_brief(topic="studio")`
- [info@oxarus.com](mailto:info@oxarus.com?subject=Mobile%20app) → `contact(subject="Mobile app")`
- [Türkçe](https://oxarus.com/tr/studio/mobile) → `switch_locale(locale="tr", path="/studio/mobile")`

## Related pages

- [Oxarus Studio](https://oxarus.com/en/studio)
