"It only happens on that one phone"
Every team has one. A bug that reproduces reliably on a single handset, on nobody else’s, and survives every attempt to explain it away as user error.
It is almost never magic. It is almost always a device-state difference nobody has enumerated. Here is the list, roughly in order of how often it turns out to be the answer.
1. iOS version
The first thing to check and the most frequently skipped, because everyone assumes they know. A point release changes behaviour more often than people expect: WebKit, the network stack, the keyboard, background scheduling, and the memory limits a process gets.
Get the exact build, not “iOS 17”. 17.4 and 17.4.1 are different software.
2. Free storage
A device with a nearly-full disk behaves badly in ways that look like anything but a storage problem:
- Writes fail, sometimes silently depending on how the error is handled
- Caches are evicted the moment they are written, so caching appears not to work at all
- Installing a build fails partway
- The system is more aggressive about terminating background processes
Ask for the free space number. Under a couple of gigabytes, treat it as the prime suspect.
3. Thermal state
A hot phone throttles. If the device lives in a case, on a desk in the sun, or has been running a capture for twenty minutes, it is a slower device than the same model somewhere cool.
The tell is that the problem gets worse the longer the session runs, and disappears after the phone has been left alone for ten minutes.
4. Battery health
An old battery cannot deliver peak current the way a new one can, and iOS will limit performance to avoid unexpected shutdowns. A device at 78% capacity with 900 cycles is not the same machine as the same model at 100%.
Read the capacity and the cycle count, not just “the battery seems fine”.
5. Configuration profiles
The one nobody checks, and the one that produces the strangest results. A profile can install a root certificate, route traffic through a VPN, disable a system capability, or enrol the device in an MDM with its own policies.
If a device has a VPN profile you did not know about, every network-related symptom on that device is suspect — different apparent region, different latency, requests failing that succeed everywhere else.
6. Language, region and locale
Number formatting, date parsing, text direction, sort order, and the length of every string in the interface. A layout that only breaks in German is a real category of bug, and so is a date parser that only fails in a locale using a different calendar.
7. Accessibility settings
Larger text, bold text, reduce motion, reduce transparency, increased contrast, VoiceOver. Each changes layout or behaviour, and each is common enough among real users that “only on that phone” often means “only with Dynamic Type at maximum”.
8. Time and time zone
A device with the clock set manually, or in a time zone across the date line, exposes every off-by-one in date handling you have. Cache expiry, token refresh and “today’s” content are all common casualties.
9. Network
Not just Wi-Fi versus cellular. Captive portals, IPv6-only carriers, corporate DNS, an app-level VPN, low-data mode. Low-data mode alone disables background refresh and downgrades video, which changes app behaviour substantially without anything on the device looking unusual.
10. Model and memory
A phone with 3 GB of RAM gets a smaller memory allowance than one with 8 GB. Code that is fine on the flagship gets jetsam-killed on the budget model — which shows up as a crash report with no exception. Screen size and safe-area insets belong here too.
How to run this
- Write the device state down before you touch anything. iOS build, storage, battery health and cycles, installed profiles, locale, accessibility settings. Half the investigations end here.
- Find one difference. Compare against a device where the bug does not reproduce.
- Reproduce the difference elsewhere. If you think it is the storage, fill up another device. This is the step that converts a theory into a finding.
- Then read the logs and captures, now that you know what you are looking for.
The one that is not on the list
Sometimes it really is the user’s data. An account with fifty thousand records, a corrupted local database, a half-finished migration from a version two years old. When every device attribute matches and the bug still follows the person rather than the phone, look at what the app has stored — the container is where that answer lives.
