Skip to content
Bugwise
Menu
Mobile Testing

iOS vs Android Differences

The same app behaves differently on iPhone and Android. Learn the platform differences in navigation, UI, permissions, notifications and releases, and what each one means for your testing.

35 min beginner Mobile

A food-delivery startup builds its app on iPhones. Every tester owns an iPhone, every demo runs on an iPhone. Launch day goes well, until the Android reviews arrive: “Pressing Back closes the whole app.” “I can’t get rid of the menu at the bottom.” “It asked for notifications and then said they were on, but nothing ever came.”

None of these bugs existed on iOS. They came from building one design and shipping it to two platforms that work differently. Your job as a tester is to know those differences well enough to spot them, so let’s learn them.

Why it matters

iOS and Android are not just “two skins” of the same thing. They have different navigation models, different UI components, different permission rules, different release processes, and very different device landscapes.

  • Users notice. People expect apps to behave like the rest of their phone. An Android user presses Back dozens of times a day; if your app ignores it, the app feels broken.
  • The code is often different. Even cross-platform apps (React Native, Flutter, Kotlin Multiplatform) use platform-specific code for navigation, permissions and notifications. A fix on one platform does not fix the other.
  • Bugs hide on the platform nobody tests. Teams usually have a “home” platform. The other one gets less attention and collects bugs.

The big differences at a glance

AreaiOSAndroid
Going backBack chevron in the navigation bar + swipe from the left edgeSystem Back (edge swipe or ◁ button) on every screen, plus the arrow in the app bar
Main navigationTab bar at the bottomNavigation bar (bottom), navigation rail or drawer on big screens
Menus of actionsAction sheet with a separate Cancel buttonBottom sheet or menu, dismissed by swipe, tap outside or Back
ConfirmationsCentered alert, must tap a buttonMaterial dialog, usually dismissible by Back or tapping outside
Quick messagesNo built-in toast; banners or inline messagesToasts and snackbars
PermissionsSystem prompt shown once; after that, only SettingsCan ask again; after two denials (Android 11+) the dialog stops appearing
NotificationsAlways needs permissionNeeds permission on Android 13+; users can mute channels
System fontSF ProRoboto in Material, but makers ship their own fonts
Beta testingTestFlightPlay Console testing tracks, Firebase App Distribution
DevicesA few dozen iPhone and iPad modelsThousands of models from hundreds of makers

Explore: same screen, two platforms

Here’s the same order screen built properly for each platform. Switch platforms, pick a situation, and tap the numbered hotspots. Try the System Back and edge swipe controls too: they’re the single most important difference to test.

📱 Same screen, two platforms

Switch between iOS and Android, pick a situation, and tap the numbered hotspots to see what differs and what to test.

9:41
Order #48212

Pizza Place · Arriving 19:40

1 × Margherita, large

2 × Garlic bread

Total€24.70
Contactless delivery
3
Cancel Order
HomeSearchOrdersAccount4

Going back

iOS

A chevron with the previous screen’s title in the navigation bar, plus a swipe from the left edge of the screen. There is no system Back button.

Android

An arrow in the top app bar, plus the system Back: a swipe from the left or right edge (gesture navigation) or the ◁ button (3-button navigation). Android 14+ can show a predictive back preview of where you’ll land.

What to test

  • Android: press system Back on every screen, including with the keyboard, a dialog or a sheet open.
  • iOS: swipe back from the left edge on every pushed screen. Start a swipe, then cancel it halfway.
  • Back never loses typed data without asking, and never exits the app from a deep screen.

Try the edge swipe while a prompt is open, then switch to Android and press System Back in the same spot.

iOS: back chevron and edge swipe

On iOS, screens are stacked on top of each other. Each new screen slides in from the right and shows a back chevron (‹) with the previous screen’s title. Users can also swipe from the left edge to drag the screen away. There is no system-wide Back button.

What breaks:

  • The swipe-back gesture is disabled, often by accident when developers customize the navigation bar or hide the back button. Users swipe and nothing happens.
  • A swipe-back on a screen with unsaved changes discards the data without asking.
  • A half-finished swipe (start swiping, then let go) leaves the screen in a weird state.

Android: system Back everywhere

Android has a system Back that works in every app: a swipe in from the left or right edge in gesture navigation, or the ◁ button in 3-button navigation. Your app must handle it on every screen and every state:

  1. Keyboard open? Back closes the keyboard first.
  2. Dialog, sheet or menu open? Back closes it, like tapping Cancel.
  3. On a deeper screen? Back goes to the previous screen.
  4. On the start screen of the app? Back leaves the app (the user lands on the home screen).

Newer Android versions add predictive back: when the user starts the back gesture, apps that support it show a preview of where they’ll land (the previous screen or the home screen), and the user can cancel by sliding back. Since Android 15 these previews appear for apps that opted in; for apps that target Android 16 they’re on by default. Test that the preview matches where you really end up.

For swipes, long presses and other touch input, see Gestures.

Tabs vs bottom navigation

Both platforms put the main sections at the bottom, but they behave differently:

  • iOS tab bar: tapping the active tab again usually scrolls to the top or returns to that tab’s first screen. Each tab keeps its own history. In iOS 26, Apple’s Liquid Glass design makes the tab bar float over the content, and apps can let it shrink as you scroll.
  • Android navigation bar: the active destination gets a pill-shaped indicator. Pressing Back from another tab normally returns to the start tab before leaving the app.

UI conventions that differ

ComponentiOSAndroid (Material 3)What to look for
Alert / dialogCentered, buttons side by side or stacked; destructive in redRounded dialog, left-aligned text, text buttons bottom-rightBack / tap outside counts as Cancel on Android, never as “Confirm”
Menu of actionsAction sheet with a Cancel buttonModal bottom sheet with a drag handleNo iOS action sheet in an Android app
SwitchGreen pill (toggle switchToggle switchAn on/off control that applies a setting immediately, like Wi-Fi or Dark mode.Open in glossary →)Material switch, theme color, optional check iconState announced by the screen readerScreen readerSoftware that reads the screen aloud for blind and low-vision users, like VoiceOver or TalkBack.Open in glossary →
Date & time pickerCompact field, inline calendar or scrolling wheelsCalendar dialog with a typing mode; clock-dial time pickerThe native picker for each platform, correct first day of week
ShareiOS share sheetAndroid SharesheetThe system sheet opens with the right content
Short feedbackBanner or inline message (no native toast)ToastToastA short, temporary message that appears briefly and disappears on its own, like 'Message sent'.Open in glossary → or snackbarMessage isn’t hidden behind the keyboard or nav bar
FontSF Pro, scales with Dynamic TypeDynamic TypeThe phone setting that lets users make text bigger or smaller across apps.Open in glossary →Roboto or the maker’s font, scales with Font size (up to 200% on Android 14+)No clipped text at the largest size on either
HapticsPrecise, consistent Taptic EngineVibration quality varies a lot between devicesHaptics feel right and can be turned off

Permissions: same idea, different rules

Both platforms ask the user before an app can use the camera, location, microphone, photos, contacts or notifications. These are app permissionsApp permissionsThe user's approval for an app to use things like the camera, location, contacts or notifications.Open in glossary → (see the App permissions feature lesson), and the rules differ in ways that create real bugs.

  • The system prompt appears only once per permission. If the user taps Don’t Allow, the app can never show it again. The only way back is the Settings app.
  • Location offers Allow Once, Allow While Using App and Don’t Allow, plus a Precise on/off switch.
  • Photos can be shared as limited access (only selected photos).
  • The text under the title is the app’s own purpose string. Apple requires it, and App Review rejects vague ones.
  • Good apps show their own explanation screen before triggering the one-shot system prompt.
  • Permissions have been asked at runtime since Android 6. The app can ask again after a denial.
  • Since Android 11, if the user denies the same permission twice, Android stops showing the dialog (it behaves like “Don’t ask again”). The app must then send the user to Settings.
  • Location, camera and microphone offer Only this time (Android 11+). The permission is revoked soon after the user leaves the app.
  • Location offers Precise or Approximate (Android 12+). Photos can be shared partially (“Select photos”, Android 14+).
  • Android may auto-reset permissions of apps that haven’t been used for a few months.

What to test on both: every answer (allow, one-time, deny), revoking the permission in Settings while the app is in the background, and the “permanently denied” state, where the app must explain how to turn it back on instead of failing silently.

Notifications

Push notificationsPush notificationA message an app sends to the device that appears even when the app is closed.Open in glossary → look similar on both platforms, but the setup differs:

  • iOS always needs the user’s permission before showing alerts. The prompt appears once. Users can also choose how notifications appear (banners, lock screen, summary) and turn on Focus modes.
  • Android 13 and newer require the POST_NOTIFICATIONS runtime permission, so notifications are off for a new install until the user allows them. On Android 12 and older, notifications are allowed by default.
  • Android notification channels (Android 8+) group notifications by type, like “Order updates” and “Promotions”. Users can mute one channel and keep the others.

Test that the app’s own notification toggle matches the real system permission (more in Push notifications). A switch that says “On” while the OS blocks notifications is one of the most common bugs in this area.

Keyboards and autofill

  • Android has many keyboards: Gboard, Samsung Keyboard, SwiftKey and others. Each one handles autocorrect, suggestions and emoji differently. Test with at least two.
  • iOS number pads have no Return key. If the app doesn’t add a Done button or tap-outside handling, the user can’t close the keyboard and can’t reach the button below it.
  • The keyboard covers content. Check that the focused field and the main button stay visible on short screens.
  • Autofill: iOS offers Password AutoFill and one-time codes from SMS above the keyboard; Android’s Autofill framework works with Google Password Manager and other password managersPassword managerA tool that stores credentials and fills them into login forms, like Apple Passwords, Google Password Manager or 1Password.Open in glossary →. Fields must be marked correctly (username, new password, one-time code), or autofill won’t appear.

Distribution, review and beta testing

How a buildBuildA specific compiled version of the app or website that is ready to be installed or tested.Open in glossary → reaches users is different too, and testers are often in charge of the beta builds (more in Beta distribution).

App Store (iOS)Google Play (Android)
Beta testingTestFlightTestFlightApple's service for distributing beta builds of iOS apps to testers before App Store release.Open in glossary →: internal testers from your team, external testers after a quick Beta App Review; builds expire after 90 daysTesting tracks: internal (up to 100 testers, available within minutes), closed and open
Other optionsFirebase App DistributionFirebase App DistributionGoogle's service for sending pre-release Android (and iOS) builds to testers.Open in glossary → for ad-hoc buildsFirebase App Distribution, or sharing APKs directly (sideloading)
ReviewEvery version is reviewed by Apple; most are reviewed within a dayAutomated plus manual checks; usually hours, sometimes several days
Gradual releasePhased release over 7 days for automatic updatesStaged rollout to a percentage of users, can be halted
RollbackNo rollback: you must ship a new versionNo rollback either, but you can halt a staged rollout

OS updates and hardware variety

  • iOS users update fast. Most iPhones move to the newest major iOS within a few months, so teams can drop old versions sooner. Apple also supports devices for many years, so a 6-year-old iPhone may still run the newest iOS.
  • Android is spread across many versions. Updates depend on the phone maker and carrier, so at any time your users run five or more different Android versions. See Device fragmentation for how to deal with this.
  • Hardware varies a lot more on Android: screen sizes, cameras, chips, RAM, foldables and makers’ own skins (Samsung One UI, Xiaomi HyperOS). Every OS versionOS versionWhich version of iOS, Android or another operating system a device runs.Open in glossary → and skin can change how permissions, notifications or background work behave.

What to test

Group your platform checks like this:

Common bugs

#BugWhat you seeTypical severity
1System Back not handledAndroid Back closes the app from a deep screen, or does nothing in a dialogHigh
2Swipe-back disablediOS edge swipe does nothing on some screensMedium
3Wrong platform componentiOS action sheet or wheel picker inside an Android appLow–Medium
4Permission state out of syncApp toggle shows “On” but the OS denied the permissionHigh
5Permanently denied = dead endFeature silently fails; no explanation or link to SettingsHigh
6Missing Android 13 notification permissionNo notifications ever arrive on new Android phonesHigh
7Keyboard can’t be dismissediOS number pad covers the Pay buttonHigh
8Dismissing a dialog confirms itBack or tap outside triggers the destructive actionCritical
9Text clipped at large font sizesLabels cut off with Dynamic Type or Android Font size at maxMedium
10Beta build differs from store buildBug only appears in the TestFlight or Play build, not in debugMedium–High

Find the bug

This food-delivery app ships to both platforms, and it has six bugs. Some only appear on Android, some only on iOS. Switch between the two devices, and explore:

  • Open the order, then use System Back (Android) or the edge swipe (iOS).
  • Open the ⋮ / ⋯ menu, the delivery time and the “Cancel order” dialog, and try to close each one in every way you can.
  • Turn on Order updates and answer the notification prompt both ways (use Restart app to start over).

🐞 Bug hunt: FoodNow order screen

This demo has 6 hidden bugs. Explore it like a tester, then check your findings.

Found0/6
9:41

Orders

Order #4790 · Sushi Bar · Delivered yesterday

Device

Gesture navigation: Back = swipe in from the screen edge.

  1. 1

    Hint: On Android, open the order and press System Back.

  2. 2

    Hint: On Android, tap Delivery time.

  3. 3

    Hint: On Android, open the ⋮ menu and tap the dimmed area above it.

  4. 4

    Hint: On Android, open the Cancel order dialog and press System Back.

  5. 5

    Hint: On iOS, open the order and swipe from the left edge.

  6. 6

    Hint: On iOS, turn on Order updates and tap Don’t Allow.

Tools and how-to

Example test cases

TC-PLAT-001Android system Back returns to the previous screen

Preconditions

  • Android device with gesture navigation
  • User has at least one order

Steps

  1. Open the app
  2. Tap an order in the Orders list
  3. Swipe in from the left screen edge (system Back)

Expected result

The Orders list is shown with its scroll position kept. The app does not close.

TC-PLAT-002Android system Back dismisses a dialog without confirming it

Steps

  1. Open an order
  2. Tap "Cancel order"
  3. Press system Back

Expected result

The dialog closes, the order is NOT canceled, and the order screen is still shown.

TC-PLAT-003iOS edge swipe goes back from every pushed screen

Preconditions

  • iPhone

Steps

  1. Open an order
  2. Swipe from the left edge to the middle of the screen and let go
  3. Repeat, but stop halfway and slide back

Expected result

A full swipe returns to the Orders list. A canceled swipe leaves the order screen fully visible and usable.

TC-PLAT-004Denied notification permission is reflected in the app (iOS)

Preconditions

  • Fresh install
  • Notifications never requested

Steps

  1. Open an order
  2. Turn on "Order updates"
  3. Tap "Don’t Allow" in the system prompt
  4. Turn on "Order updates" again

Expected result

The switch stays off after the denial. On the second attempt the app explains that notifications are off and offers to open Settings.

TC-PLAT-005Android 13+ asks for notification permission

Preconditions

  • Android 13 or newer
  • Fresh install

Steps

  1. Open the app and log in
  2. Place an order or turn on "Order updates"

Expected result

The system "Allow FoodNow to send you notifications?" dialog appears at that moment. After "Allow", an order update notification arrives in the "Order updates" channel.

TC-PLAT-006Permanently denied location shows a path to Settings

Steps

  1. Deny location permission twice (Android) or once (iOS)
  2. Tap "Use my current location" on the address screen

Expected result

The app explains why location is needed and shows a button that opens the app’s Settings page. Manual address entry still works.

TC-PLAT-007Number pad can be dismissed on iOS

Preconditions

  • iPhone SE or other small screen

Steps

  1. Open checkout
  2. Tap the "Tip amount" field
  3. Try to close the keyboard

Expected result

A Done button or tapping outside closes the number pad, and the Pay button becomes reachable.

Tip: click a test case to expand it.

Checklist

iOS vs Android checklist

0 of 13 checked

Check your understanding

Quick quiz

0/5 answered · 0 correct

  1. 1.An Android app shows a "‹ Back" chevron at the top. What is the MOST important thing to test?

  2. 2.A user on iOS tapped "Don’t Allow" for notifications. What can the app do?

  3. 3.Notifications never arrive on a new Android 15 phone but work on an Android 12 phone. What is the likely cause?

  4. 4.On Android, a "Delete account?" dialog is open and the user presses Back. What should happen?

  5. 5.Which is TRUE about releases?

Key takeaways

  • iOS and Android differ in navigation, UI components, permissions, notifications, releases and devices. Always test both, and always say which one you tested.
  • The number one cross-platform bug: Android system Back not handled. On iOS, check that the edge swipe works.
  • Each platform should use its own dialogs, sheets, pickers and share sheet. iOS patterns in an Android app (or vice versa) are valid findings.
  • iOS shows each permission prompt once; Android stops asking after two denials. Test the denied path and make sure the app’s toggles match the real OS setting.
  • Android 13+ needs the notification permission; Android channels let users mute types of notifications.
  • Releases can’t be undone instantly, so test the TestFlight / internal-testing build before it goes out.

Finished this page?Nice work, this page is complete!

Mark it as done to track your progress. It's saved in this browser, no account needed.

Its review cards are now in Bites ⚡
Esc

Type to search the whole site.