Fixing & maintaining an app
How to Fix an App That Keeps Crashing (iOS & Android)
Short answer: Install crash reporting (Firebase Crashlytics or Sentry) if it isn't there already. Sort crashes by number of affected users, not number of events. Reproduce the top issue using the stack trace, device and OS version and the user's steps, then fix it, add a test or guard, and release with a staged rollout. The usual culprits are unhandled errors on missing or unexpected data, out-of-memory issues with images and video, OS-version-specific behaviour, and outdated dependencies. On Android, keep crash and ANR rates below Google Play's "bad behaviour" thresholds, or your visibility suffers.
Why do crashes matter so much?
- Ratings: crashes are the fastest route to one-star reviews.
- Revenue: a crash on the paywall or during checkout costs money directly.
- Store visibility: Google Play uses Android vitals (crash rate and ANR rate) in ranking and may warn users or reduce visibility for apps above its thresholds.
- Retention: users rarely give a crashing app a second chance.
Step 1: See the crashes
You can't fix what you can't see. Set up:
- Firebase Crashlytics or Sentry with source maps (React Native) or dSYMs (iOS), so stack traces are readable
- App Store Connect → Crashes and Xcode Organizer for iOS
- Google Play Console → Android vitals for crash and ANR (App Not Responding) rates
Track the crash-free users percentage over time. It's the clearest health metric.
Step 2: Prioritise by impact
Sort crash groups by affected users and look at:
- Is it in a money flow (paywall, checkout, login)? Fix first.
- Is it new in the latest release? That points to a regression and a likely quick fix.
- Is it limited to one OS version or device family? That's usually a compatibility issue.
Step 3: Reproduce
Use the stack trace, breadcrumbs (the user's last actions), device, OS version and app version. Try to reproduce on a matching device or simulator. Many crash tools show the screens visited before the crash, which helps a lot.
What are the most common causes?
Unexpected or missing data
undefined is not an object, null pointer exceptions, and JSON fields that are missing or the wrong type. Often caused by backend changes or old cached data. Fix: validate data at the boundaries, and use TypeScript types plus runtime checks for API responses.
Memory pressure
Large images, long lists without virtualisation, video players that aren't released. Fix: resize images, use virtualised lists (FlashList/FlatList), and clean up media players.
OS-version behaviour changes
New permission models, background restrictions, notification changes. Fix: upgrade SDKs and handle new permission states. (Updating an outdated app)
Outdated or incompatible dependencies
Native modules compiled against old SDKs, or libraries that aren't compatible with React Native's New Architecture. Fix: upgrade or replace them.
Threading and timing (ANRs on Android)
Heavy work on the main thread, like big JSON parsing, synchronous storage or image processing. Fix: move work off the main thread and defer non-critical startup tasks.
Startup crashes
Missing configuration, failed migrations, or bad remote config. These are the most severe because users can't open the app at all. Fix: defensive startup code, safe defaults, and testing upgrades from older app versions.
Step 4: Fix, guard and release
- Fix the root cause, not just the symptom
- Add an error boundary (React Native) so a failed screen shows a recovery state instead of killing the app
- Add a test or check for the case that crashed
- Release with a staged rollout and watch crash-free users for 24–72 hours
- For React Native/Expo apps, over-the-air updates can ship JavaScript fixes within hours
Step 5: Prevent regressions
- Run beta builds (TestFlight, Google Play internal testing) before every release
- Turn on crash alerts for new issues and spikes
- Test on at least one older device and the newest OS before release
- Keep dependencies current as part of regular maintenance
FAQ
What is a good crash-free rate for an app?
Aim for well above 99% crash-free users. Many well-maintained apps run at 99.5% or higher. Watch the trend after each release.
What are Google Play's Android vitals thresholds?
Google Play publishes "bad behaviour" thresholds for user-perceived crash rate and ANR rate, overall and per device. Apps above them can see reduced visibility. Check the current values in Play Console's Android vitals.
Why does my app crash only on some phones?
Usually because of OS-version differences, low memory on older devices, or manufacturer-specific Android behaviour. Crash reports grouped by device and OS will show the pattern.
Can you fix crashes in an app someone else built?
Yes. With code and crash-report access, crashes are usually one of the fastest things to fix in an inherited app. See finding a developer to fix your app.