iOS vs Android testing differences QA should know
Testing the same app on iOS and Android isn't the same test run twice. The platforms differ in fragmentation, permissions, navigation, and lifecycle — and a pass on one tells you surprisingly little about the other.
A recurring mistake in mobile QA is treating "we tested it on iOS" as roughly equivalent to "we tested it." The two platforms diverge in ways that produce genuinely different bugs, so a clean pass on one is not evidence for the other. You don't need to be an expert in both OSes, but you do need to know where they differ — because that's where the platform-specific bugs live. This is the concrete substance behind why mobile bugs escape web-first teams.
Where the platforms actually differ
Fragmentation. iOS is a short, controlled list of devices and OS versions; most users update quickly. Android is a vast spread of manufacturers, screen sizes, OS versions, and vendor skins, with much slower update adoption. Practically: on Android you test a range and worry about old versions and odd OEM behaviour; on iOS you test a tighter set but can't ignore the latest version on day one. Your device coverage strategy differs by platform.
Permissions. The permission models differ — prompt timing, the "limited"/"while using" options, and the revoke experience aren't the same. iOS has options Android doesn't and vice versa, so the permission matrix has to be run on both, not assumed to carry over.
Navigation and the back behaviour. Android has a system back gesture/button that affects every screen; iOS leans on in-app back and edge-swipe. The same flow can behave differently — Android back can exit a flow, dismiss a modal, or leave the app in a way iOS never will. Back-button behaviour is a whole class of Android-specific bugs.
App lifecycle and background handling. How the OS suspends, kills, and restores a backgrounded app differs. Android is more aggressive about killing background processes (and varies by OEM battery optimisation); state restoration and offline/resume behaviour can break on one platform while working on the other.
Platform UI conventions. Date pickers, share sheets, default fonts, system dialogs, keyboard behaviour, safe areas and notches/cutouts — all render and behave per platform. A layout that's perfect on iOS can clip or misalign on an Android cutout, and vice versa.
Notifications. Push delivery, channels (Android), grouping, and permission handling differ enough that notification testing must be done separately on each.
Cross-platform testing checklist
- Android: test a range of devices/OS versions and at least one heavy OEM skin; don't assume one device represents all
- iOS: cover the latest OS on day one plus your supported-version floor
- Run the full permission matrix on both — models and revoke behaviour differ
- Test Android system-back on every flow (exit, dismiss, navigate) — it has no clean iOS equivalent
- Test background-kill and state restoration per platform (Android is more aggressive)
- Check layout against notches/cutouts and safe areas on both
- Verify platform UI (pickers, share sheets, keyboard, dialogs) behaves natively on each
- Test notifications separately on each platform
What this means for your test plan
The takeaway isn't "do twice the work" — it's "don't assume coverage transfers." Some tests genuinely are the same on both and a single pass suffices; the value is in identifying the platform-divergent areas — permissions, back navigation, lifecycle, layout against device hardware, notifications — and explicitly running those on both. A test plan that says "tested on iOS, Android assumed equivalent" is quietly skipping exactly the cases where the platforms behave differently, which are exactly the cases where the platform-specific bugs hide. Know the divergence points, cover them on both, and let the truly identical cases run once.
// RELATED QA.CODES RESOURCES
// related
Mobile permissions testing: camera, location, photos, notifications
Permission bugs live in deny, revoke, and 'ask every time' — not the grant happy path. The per-permission, per-platform matrix that catches them.
Testing app updates without breaking existing users
QA fresh-installs; real users upgrade in place over old data. Test the upgrade path — schema migrations, stored settings, sessions, multi-version jumps.