Mobile Accessibility

Mobile accessibility testing checks that people with disabilities can use an Android or iOS app with the assistive technologies and settings built into their phone: the TalkBack and VoiceOver screen readers, voice control, switch access, larger text, higher contrast and reduced motion. The WCAG 2.2 success criteria from the accessibility testing guide apply to app screens as well, and Android and Apple add their own platform guidance on top.

A concrete example: a blind user opens a shopping app with VoiceOver on, moves to the quantity control and hears only "button". She cannot tell whether it adds or removes an item, so she cannot finish the order. A sighted tester tapping the same icon sees nothing wrong, which is why the checks in this lesson are made with the screen reader and the system settings switched on.

Why it matters

For many people the phone is the main computer, and many disabled users rely on it precisely because the assistive technology is built in. When an app ignores that technology, the result is not a cosmetic defect but a blocked task: a payment that cannot be confirmed, a form that cannot be sent. Accessibility is also a legal or contractual requirement in many markets, for example for public-sector apps and, in the European Union, for services such as e-commerce and consumer banking under the European Accessibility Act.

For the tester, most mobile accessibility defects come from a few repeating patterns: icon buttons without names, text in fixed sizes, small targets, gesture-only actions and colours that fail in dark mode. A short pass with the screen reader and the system settings on each new screen finds them while they are one-line fixes; after release, the same patterns are spread across every screen of the app.

TalkBack and VoiceOver: what to listen for

TalkBack on Android and VoiceOver on iOS change how touch works. A single tap selects an element and reads it aloud, a double tap anywhere activates the selected element, swiping right or left moves to the next or previous element, and scrolling takes two fingers with TalkBack and three with VoiceOver. Before you switch either one on, set up the accessibility shortcut (holding both volume keys on Android, a triple click of the side or Home button on an iPhone) so that you can switch it off again, and go through the built-in tutorial once.

Then move through each screen from the top, one swipe at a time, and compare what you hear with what you see. Developers set the spoken text through platform properties, such as contentDescription on Android and accessibilityLabel, accessibilityValue and accessibilityTraits on iOS, so most defects come down to one missing or wrong property.

  • Name: every control has a short, meaningful accessible name. Icon-only buttons such as plus, minus, heart or share are the most common failure (4.1.2 Name, Role, Value; 1.1.1 Non-text Content for meaningful images).
  • Role and state: you hear what the element is (button, switch, checkbox, tab) and its state (on, selected, expanded, disabled), and the state changes when you act.
  • Value: after you change a quantity or move a slider, the new value is announced.
  • Order and grouping: the swipe order follows the visual and logical order (right to left in Arabic), and a product card is read as one item, not as four fragments.
  • Focus and messages: focus moves into a dialog when it opens and back to the control that opened it when it closes, and messages such as "Added to cart" are announced (4.1.3 Status Messages).
  • Voice users: with Voice Access on Android or Voice Control on iOS people say the visible label, so the spoken name must contain the visible text (2.5.3 Label in Name).

Touch target size, text size and contrast

WCAG 2.2 sets a floor for targets: 2.5.8 Target Size (Minimum), level AA, asks for at least 24 by 24 CSS pixels, or enough space around a smaller target; 2.5.5 Target Size (Enhanced), level AAA, asks for 44 by 44. The platforms measure in density-independent units, dp on Android and points on iOS, which keep roughly the same physical size on every screen density, and they recommend more: at least 48 × 48 dp on Android, and in Apple’s Human Interface Guidelines a default control size of 44 × 44 points on iOS, with 28 × 28 as the minimum. On a mobile web page laid out at the device width, the browser draws one CSS pixel as one dp on Android or one point on iOS, so the numbers compare directly. Measure the touch area, not the drawn icon: a 24 dp icon with 12 dp of padding on each side has a 48 dp target.

Users who need larger text set it once for the whole phone: the font size setting on Android (up to 200% from Android 14) and Dynamic Type on iOS, whose larger accessibility sizes go beyond 200%. 1.4.4 Resize Text (AA) asks for text that can grow to 200% without loss of content or functionality. Text follows the setting only when the app uses scalable units: sp on Android (dp that also grow with the font size setting) and the Dynamic Type text styles on iOS; text sized in dp or in fixed points stays small. At the largest sizes, look for clipped or truncated labels, overlapping text, buttons pushed off the screen and screens that no longer scroll.

Contrast follows 1.4.3 Contrast (Minimum): 4.5:1 for normal text and 3:1 for large text (at least 18 point, or 14 point bold). WCAG means typographic points, which Understanding WCAG puts at about 24 and 18.5 CSS pixels, so text of 18 dp or 18 iOS points is not yet large by WCAG; Apple’s HIG applies 3:1 from 18 of its own points, so agree with your team which threshold you test against. 1.4.11 Non-text Contrast asks for 3:1 for icons, field borders and the visual state of controls. Measure every screen in light and dark mode: the grey #616161 reaches 6.19:1 on white but only 3.02:1 on the dark background #121212, so a colour that passes in one theme can fail in the other.

Try it: Color Converter

Pointer, gesture and orientation criteria on a touch screen

Guideline 2.5 Input Modalities in WCAG 2.2 was written with touch screens in mind, and the lesson on pointer and motion accessibility teaches its criteria in depth. Screen reader users meet the same problem from another side: with TalkBack or VoiceOver on, a swipe moves the focus instead of reaching the app, so gesture actions must also be offered as accessibility actions, which VoiceOver lists under Actions in its rotor and TalkBack in its actions menu. On a phone, each criterion becomes a concrete test:

  • 2.5.1 Pointer Gestures (A): anything done with a multipoint or path-based gesture, such as pinch to zoom, swipe to delete or swipe between cards, can also be done with one finger and no path, such as single taps: plus and minus buttons, a Delete button, next and previous buttons.
  • 2.5.7 Dragging Movements (AA): reordering a list, moving a map or moving a slider thumb also works without dragging, for example with move up and move down buttons, pan buttons or a tap on the slider track.
  • 2.5.2 Pointer Cancellation (A): the action happens when the finger lifts, not when it touches. Press a button, slide the finger off it and lift: nothing should happen, or the action can be undone afterwards. Standard platform buttons behave this way; custom touch handlers often do not.
  • 2.5.4 Motion Actuation (A): a feature triggered by shaking or tilting the phone also has an on-screen control, and the motion response can be turned off so that a tremor or a moving wheelchair does not trigger it.
  • 1.3.4 Orientation (AA): screens work in portrait and landscape unless one orientation is essential, as for a piano keyboard app. People with a phone fixed to a wheelchair or bed mount cannot rotate it.

Platform checkers and what they cannot judge

Each platform has a free checker. Android’s Accessibility Scanner app scans the screen you are on and suggests fixes for missing content labels, small touch targets, clickable items and low text and image contrast. Xcode’s Accessibility Inspector shows the label, value and traits of any element of an app running in the iOS Simulator, runs an audit that reports issues such as missing descriptions, small hit regions, low contrast, clipped text and missing Dynamic Type support, and includes a colour contrast calculator. The same kind of checks can run inside UI tests, with AccessibilityChecks.enable() in Espresso and performAccessibilityAudit() in XCUITest.

These tools check rules on one screen state at a time; they do not judge meaning. They find a button with no name, but not a name that is wrong. They cannot tell whether the reading order makes sense, whether a swipe has an alternative, where the focus lands after a dialog closes, or whether a long form still works at the largest text size. Let them catch the mechanical defects early, and spend your manual time on the screen reader pass, the settings and the gesture checks.

Nine mobile accessibility checks with their WCAG 2.2 criteria and how to run each on Android and iOS: checkers flag names, target size and contrast; order, gestures, motion and orientation need a person.
CheckWCAG 2.2AndroidiOS
Spoken name, role and state4.1.2A · Name, Role, ValueScanner flags missing labels; TalkBack tells you if a name makes senseInspector audit flags missing descriptions; VoiceOver tells you if a name makes sense
Reading and focus order1.3.2 · 2.4.3A · Meaningful Sequence, Focus OrderBy ear: swipe through the whole screen with TalkBackBy ear: swipe through the whole screen with VoiceOver
Touch target size2.5.8AA · at least 24 × 24 CSS pxScanner flags targets under 48 × 48 dpInspector audit flags small hit regions; HIG default: 44 × 44 pt
Text size1.4.4AA · Resize Text to 200%By eye: font size at maximum, then look for clipped textInspector audit flags text without Dynamic Type; then check the larger sizes
Contrast1.4.3 · 1.4.11AA · 4.5:1 text, 3:1 large text and iconsScanner flags low text and image contrast; repeat in dark modeInspector audit and contrast calculator; repeat in dark mode
Gesture and drag alternatives2.5.1 · 2.5.7A · AA · Pointer Gestures, Dragging MovementsBy hand: a tap alternative exists; TalkBack offers it in its actions menuBy hand: a tap alternative exists; VoiceOver offers it under Actions in the rotor
Pointer cancellation2.5.2A · Pointer CancellationBy hand: press, slide off, lift; nothing happensBy hand: the same press, slide off and lift
Shake and tilt2.5.4A · Motion ActuationBy hand: an on-screen control does the same, and motion can be turned offBy hand: as on Android, also with Shake to Undo turned off in Settings
Orientation1.3.4AA · OrientationBy hand: rotate with auto-rotate on; the screen followsBy hand: rotate with Portrait Orientation Lock off; the screen follows
  • A platform checker reports it; a person still confirms
  • No checker decides it: test by ear or by hand

Checker names as in Android’s Accessibility Scanner and Xcode’s Accessibility Inspector; what they flag can change between versions.

Worked example: a cart screen on both platforms

A shopping app’s cart lists products with a quantity stepper (minus and plus icons, where minus stops at 1), removes an item with a swipe to the left and ends with a Checkout button. The tester walks the screen with TalkBack on an Android phone and VoiceOver on an iPhone, repeats the walk at the largest text size and in dark mode, runs the platform checkers and rotates the phone. Each finding is recorded with the criterion or guideline it fails:

  • Minus and plus are announced as "button" with no name on both platforms: 4.1.2. Expected: "Decrease quantity, Blue shirt" and "Increase quantity, Blue shirt".
  • After a tap on plus, the new quantity is not announced: 4.1.2, because the change does not reach the screen reader.
  • Swipe to delete is the only way to remove an item, and the custom swipe is not offered as an action: 2.5.1. Expected: a Remove button in each row, also available as an accessibility action.
  • The stepper buttons are 32 × 32 (dp on Android, points on iOS): they meet 2.5.8 but are below Android’s 48 dp and Apple’s 44-point default, and Accessibility Scanner flags them. Reported against the target the team agreed.
  • At 200% font size the price is cut off and the Checkout label is truncated: 1.4.4.
  • The "Free delivery" note in #616161 passes on white but drops to 3.02:1 in dark mode: 1.4.3, in dark mode only.
  • The screen is locked to portrait: 1.3.4, since nothing about a cart needs one orientation.

Try it: Test Case Generator Try it: Pairwise Testing Generator

Common mistakes

  • Checking accessibility only by looking at the screen: missing names and wrong announcements are invisible until TalkBack or VoiceOver is on.
  • Testing one platform and assuming the other behaves the same: Android and iOS use different properties, even when the app is built with a cross-platform framework.
  • Treating a clean Accessibility Scanner or Accessibility Inspector result as proof: the checkers test rules on one screen state, not the whole experience.
  • Measuring the drawn icon instead of the touch area, or mixing up physical pixels with dp and points.
  • Testing text size and contrast only at the default settings and in light mode.
  • Closing a gesture-only action as "works" because the tester can swipe: the question is whether there is a single-tap alternative.

The QA perspective

On a real team, mobile accessibility starts in refinement: ask for the names of icon buttons, target sizes and text styles to be part of the design and the acceptance criteria, and agree which bar the team tests against; WCAG 2.2 level AA plus the platform guidance is a common choice. Each new screen then gets a short pass with TalkBack, VoiceOver, the largest text size and dark mode before the story is done. Settings multiply quickly (platform, screen reader, text size, theme, orientation), so a pairwise selection keeps the combinations few, and the platform checks can run in CI where the team has UI tests.

A good mobile accessibility bug report names the device, the OS version, the assistive technology or setting and its value (TalkBack, font size 200%, dark mode), the steps, what was announced or shown, what was expected and the criterion. To capture what was spoken, turn on Display speech output in TalkBack’s developer settings or the Caption Panel in VoiceOver’s settings, and attach a screen recording. After the fix, retest with the same setting and keep the case in the regression set: a later redesign can remove a label as easily as the fix added it.

Practice exercise

Audit a store locator screen

Your task

A retail app adds a store locator screen on Android and iOS, described in the developer’s notes below. Without running the app, list the accessibility problems you expect, name the WCAG 2.2 criterion or platform guideline for each, and say how you would confirm it on a device.

Then write bug titles for the three findings you would report first.

Material
Screen: StoreLocator (Android and iOS), locked to portrait

map            map view, full screen
               zoom: pinch only    move: drag only
storeCard      card at the bottom, swipe left/right to change store
btnCall        phone icon, no label, 36 x 36 dp / pt
               icon #FFFFFF on #4CAF50
txtHours       opening hours, textSize 12dp (Android), fixed 12 pt (iOS)
               #9E9E9E on #FFFFFF
btnDirections  text button "Directions", 120 x 48 dp / pt
               #FFFFFF on #1565C0
Steps
  1. Go through the elements one by one and ask the screen reader questions: name, role, state and order.
  2. Compare each size, font unit and colour pair with the numbers in this lesson, and calculate the contrast ratios.
  3. Check every gesture and the orientation lock against the pointer, gesture and orientation criteria.
  4. For each finding, write how you would confirm it: TalkBack, VoiceOver, a platform checker or by hand.
Show the model answer
Model answer

btnCall: it has no name, so TalkBack and VoiceOver announce only "button" (4.1.2); confirm by swiping to it, and both checkers flag the missing label. The white icon on #4CAF50 is 2.78:1, below the 3:1 of 1.4.11. At 36 × 36 it meets 2.5.8 but is below Android’s 48 dp and Apple’s 44-point default.

txtHours: #9E9E9E on white is 2.68:1, below 4.5:1 (1.4.3); check it with the Color Converter or the Inspector’s contrast calculator. Its size is fixed in dp and points, so it will not grow with the font size or Dynamic Type setting (1.4.4); confirm at 200% on Android and at the larger accessibility sizes on iOS.

Map: pinch-only zoom fails 2.5.1 and drag-only moving fails 2.5.7; add zoom and pan buttons, and a searchable store list is a useful extra way to reach every store. storeCard: swiping is the only way to change store (2.5.1); add next and previous buttons and offer them to screen readers as actions.

Portrait lock: fails 1.3.4, because a store locator does not need one orientation; confirm by rotating the phone with auto-rotate on. btnDirections passes: 120 × 48 is large enough and white on #1565C0 is 5.75:1; confirm that it is read as "Directions, button".

Bug titles, starting with the defects that block a task: "Store locator: call button has no accessible name (TalkBack, VoiceOver)"; "Store locator: store can only be changed by swiping, no single-tap alternative (WCAG 2.5.1)"; "Store locator: opening hours text has 2.68:1 contrast, below 4.5:1 (WCAG 1.4.3)". The first two block screen reader users, who cannot tell which button calls the store or move to another store. Report the other findings too, one defect per report, such as the hours text that does not scale with the system font size.

Frequently asked questions

Does WCAG apply to native mobile apps?

WCAG 2.2 is written for web content, but its success criteria are routinely applied to native apps. The W3C note WCAG2ICT explains how to read each criterion for software that is not a web page, and standards such as EN 301 549 apply WCAG-based requirements to software, including mobile apps. In practice, teams test apps against WCAG 2.2 level AA together with the Android and Apple guidance.

Do I need both TalkBack and VoiceOver if the app is built with a cross-platform framework?

Yes. Frameworks such as Flutter and React Native map their components to each platform’s accessibility properties, and the result can differ: a name that VoiceOver reads can be missing for TalkBack, or the reading order can change. Test at least the key journeys on both platforms.

Is 24 by 24 enough for a touch target in an app?

It is the WCAG 2.2 level AA minimum, so a smaller target without enough space around it fails. Android recommends 48 × 48 dp and Apple gives 44 × 44 points as the default size, which are easier to hit for people with tremors or limited dexterity. Agree with your team which value is the acceptance criterion and report deviations against it.

Do I have to be an expert screen reader user to test with one?

No. Learn the basic gestures and test the way users move: swipe from element to element instead of tapping what you see, because tapping can reach items that the swipe order skips. Experienced users with disabilities still notice problems that testers miss, so include them in usability testing when you can.

References

  • Web Content Accessibility Guidelines (WCAG) 2.2W3C · 2024The W3C Recommendation that defines the testable success criteria for accessible web content, organised under four principles and three conformance levels (A, AA, AAA).
  • Understanding WCAG 2.2W3C Web Accessibility Initiative (WAI)The informative explanation of each WCAG 2.2 guideline and success criterion: intent, who benefits, examples and techniques (not normative).
  • Test your app's accessibilityAndroid Developers (Google)How to test an Android app's accessibility manually with TalkBack and other services, and automatically with the platform's testing tools.
  • Accessibility — Human Interface GuidelinesAppleApple's accessibility design guidance for iOS and other platforms: VoiceOver, Dynamic Type, contrast, touch targets and motion.

Practise with Mutqan tools

Convert colors between HEX, RGB(A), HSL(A), HSB/HSV, CMYK and CSS named colors with a live preview.

Utilities

Generate structured test cases (id, title, preconditions, steps, expected result, priority) from a feature description and field list.

Test Design

Generate the same records in multiple languages (English, Arabic, Hindi, and more) to test i18n and RTL/LTR mixing.

Test Data

Go deeper

Your progress on this topic

Part of the QA Roadmap