GuidesMobile apps
Building an iOS and Android mobile app: from mockup to stores
An app, or a site that works well on a phone?
An app is justified when the phone brings something: location, notifications, the camera, offline use, or store presence. Otherwise a well-built site is enough and costs less to keep alive.
Three cases from our projects:
- Tchee, on-demand rides for Bamako: location and real-time tracking are the product.
- Votons: a swipe quiz, designed for the thumb, published on iOS and Android alongside the site.
- Serres Tour App: guided tours on a map, for visitors walking around the town.
Native, React Native or embedded web
| Route | Principle | When to choose it |
|---|---|---|
| Native (Swift, Kotlin) | Two apps, two codebases | Very advanced needs on a single system |
| React Native with Expo | One codebase, native components | Most apps |
| Embedded web (Capacitor) | A web app inside a native shell | A game or a tool that already exists on the web |
Tchee and Votons are built with React Native and Expo. Starship Brick Clash, our brick breaker, uses Capacitor: one codebase for iOS, Android and the web.
API first
The app is only the visible part. Behind it, an API holds the accounts, the data and the rules. We design it first, because it also serves the website, the back office and future versions.
For Tchee, that means two apps (rider and driver) talking to the same API: ride request, assignment, tracking, payment.
- Rider app
- Driver app
- Website
- Back office
- Accounts
- Data
- Rules
Three rules:
- the API never trusts the app, it checks everything;
- it is versioned, because old versions of the app will stay installed for months;
- it answers fast and light, because mobile networks are slow and unstable.
Design for the phone
- The thumb. Main actions at the bottom of the screen.
- The network. Every screen plans for loading, failure and offline mode.
- Permissions. Ask for location or notifications at the moment they are useful, and explain why.
- Languages. Serres Tour App exists in five languages, because its users are tourists.
Payment
Two very different cases.
Real goods and services (a ride, a delivered product) are paid through a provider such as Stripe. Local habits matter too. In Mali, most riders pay with mobile money: Tchee accepts cards and Orange Money, in CFA francs.
Digital content (an in-app subscription, options) must usually go through Apple’s and Google’s in-app purchase, which take a commission. Plan for it in the business model from the start.
Publishing on the stores
Prepare early, because none of this is done in a day:
- $99Appleper year
- $25Google Playone-off
- Developer accounts. Apple (99 dollars a year) and Google Play (25 dollars, once), in the company’s name.
- Listings. Name, description, screenshots for each device size, icon.
- Privacy. A published policy, and the declaration of the data collected.
- A demo account for reviewers, if the app requires sign-in.
- Testing. TestFlight on iOS, testing tracks on Android.
The most common rejections: an incomplete feature, a poorly justified permission, a non-compliant payment method, no account deletion inside the app.
After release
- Crash tracking, version by version.
- Regular updates: systems change every year, and the stores require you to follow.
- Reviews, read and handled.
- A minimum-version policy, so that old API versions can be retired one day.
Frequently asked questions
- Do you need to build two apps, one for iOS and one for Android?
- In most cases, no. With React Native and Expo, a single codebase produces both apps. Separate native development is justified for very specific needs, such as heavy graphics processing.
- How long does publishing on the stores take?
- Review itself usually takes from a few hours to a few days. What takes time is preparation: developer accounts, listings, screenshots, privacy declarations, and the back-and-forth if the app is rejected.
- Can you update the app without going through the stores again?
- Partly. Fixes to the JavaScript code can be delivered directly to users. Anything touching native code or permissions requires a new version reviewed by the stores.


