Users keep running old versions of your app for months. How do you evolve the API and decide when to force an update?
What the interviewer wants to hear
- Assume old clients exist; make API changes backward compatible
- Version the API or use additive changes and tolerant parsing
- Send the app version with each request and monitor version adoption
- Remote config for soft and hard minimum versions
- Force updates only for security or breaking reasons, with a clear in-app flow
Model answer
Unlike the web, I cannot redeploy every client, so every API change must assume old app versions are still out there. I prefer additive changes: new optional fields and new endpoints, never renaming or removing fields that old apps parse. Clients parse tolerantly, ignoring unknown fields and handling unknown enum values with a default. When a breaking change is unavoidable, I version the endpoint and keep the old one until usage drops. Each request sends the app version, so we can see adoption per version and remove dead paths with data. I keep two remote values: a soft minimum that shows a dismissible update prompt, and a hard minimum that blocks use, which I reserve for security issues or truly broken versions. On Android I use the Play In-App Updates API, and on iOS a screen linking to the App Store.
Can you answer it under time pressure?
Take a timed hard round and get scored on every answer.
More hard Mobile App Developer questions
- How would you design the mobile client for a chat app like WhatsApp?
- Your app has grown to 40 developers and one huge module. Builds are slow and teams block each other. How would you restructure it?
- A delivery app must track the rider location all day. How do you balance accuracy with battery life and OS limits?
- In a Flutter or React Native app, you need a feature that only exists in native SDKs, such as a payment terminal SDK. How would you integrate it well?
- How would you measure and improve app performance for real users in production, not just on your test phone?
- Your crash reports show rising out-of-memory crashes after a release. How do you find and fix the problem?
- How would you implement secure login with an OAuth or OpenID Connect provider in a mobile app?
- How would you migrate a large UIKit or Android View app to SwiftUI or Jetpack Compose without stopping feature work?
- Millions of users have data in your app local database. How do you change the schema safely?