Mobile Accessibility & Inclusive App Development
Design and build iOS and Android apps that everyone can use. This guide aligns mobile UI and native APIs with WCAG 2.2 Level AA, platform a11y guidelines, and real-world testing using VoiceOver and TalkBack.
Overview
Mobile accessibility ensures people with disabilities can perceive, operate, and understand native apps. It spans touch targets, gestures, orientation, focus navigation, announcements, color/contrast, scaling, captions, and motion sensitivity. WCAG applies to native apps, with platform-specific guidance from Apple and Google.
Standards & Guides: WCAG 2.2 · Apple Human Interface Guidelines (Accessibility) ·
Android Accessibility · WAI-ARIA for web views · Platform APIs (UIAccessibility / AccessibilityNodeInfo)
WCAG ↔ Mobile Mapping (Highlights)
| WCAG Topic | Mobile Considerations | Notes |
|---|---|---|
| 1.1 Text Alternatives | Provide accessible names/labels for icons, buttons, images, custom controls. | iOS accessibilityLabel, Android contentDescription. |
| 1.3 Adaptable / 1.4 Reflow | Support Dynamic Type/Font Scale and responsive layouts without clipping or overlap. | Respect user font scale; avoid fixed-height text containers. |
| 1.4 Color & Contrast | Meet contrast ratios for text and focus/selection indicators; support Dark Mode/High Contrast. | Don’t use color alone to convey state. |
| 2.1 Keyboard | Provide D-pad/keyboard navigation on TVs/Chromebooks; ensure logical focus order. | Focusable elements must be reachable; avoid hidden focus traps. |
| 2.5 Pointer Gestures/Target Size | Make all actions achievable with a single tap; provide alternatives to multi-finger/drag. | Targets ≥ 44/48; provide hit-slop/padding. |
| 3.3 Error Prevention/Help | Clear labels, inline validation, programmatic announcements of errors/success. | Use polite/live announcements; don’t rely on color/position alone. |
| 4.1 Name, Role, Value | Custom controls expose role and states (selected, expanded, busy). | iOS accessibilityTraits · Android AccessibilityNodeInfo states. |
Platform Guidelines & APIs
iOS (UIKit/SwiftUI)
- Use system controls; set
accessibilityLabel,accessibilityHint,accessibilityTraits. - Support Dynamic Type with scalable text styles (e.g.,
.title,.body). - Respect Reduce Motion, Increase Contrast, Bold Text.
- Announce changes with
UIAccessibility.post(notification: .announcement, …). - Use
.accessibilityHidden(true)to avoid duplicate elements when icons have text labels.
// SwiftUI example
Button("Pay") { submit() }
.accessibilityLabel("Pay now")
.accessibilityHint("Submits your order")
Text("Total: $24.99")
.font(.title) // scales with Dynamic Type
// Announce an error
UIAccessibility.post(
notification: .announcement,
argument: "Card number invalid. Check and try again."
)
Android
- Prefer Material components; set
android:contentDescriptionfor images/icons. - Use
android:hint/TextInputLayoutfor labels; error viasetError()+ accessibility event. - Support large font & Display size; respect Reduce motion/Remove animations.
- Expose roles/states through
AccessibilityNodeInfoor Compose semantics.
<ImageButton
android:id="@+id/btnPay"
android:contentDescription="@string/pay_now"
android:src="@drawable/ic_pay" />
/* Jetpack Compose */
Button(onClick = { submit() }, modifier = Modifier.semantics {
contentDescription = "Pay now"
}) { Text("Pay") }
Key Mobile Accessibility Topics
Touch Targets & Gestures
- Targets ≥ 44×44 pt (iOS) / 48×48 dp (Android); add hit-slop around icons.
- Provide alternatives to drag, long-press, multi-finger, and swipe-only actions.
- Prevent accidental activation; use confirmation for destructive actions.
Focus Order & Navigation
- Logical reading order in accessibility tree; group related items (e.g., cards) as one element if appropriate.
- When showing modals/sheets, move accessibility focus to the sheet and return it on dismissal.
Announcements & Status
- Announce significant UI changes (errors, success, added to cart) using platform notifications.
- Avoid “double speak” by hiding decorative views from accessibility.
Forms, Errors & Media
Forms
- Each field has a visible label and programmatic name; don’t rely on placeholder as label.
- Provide input type (email, number) and helpful hints; auto-advance/focus carefully.
- Errors appear near the field, explained in plain language, and are announced.
Media
- Provide captions for video; transcripts for audio; audio descriptions where needed.
- Don’t autoplay media with sound; give clear play/pause controls and respect system media keys.
Mobile Accessibility Testing Checklist
| Area | Checks | WCAG |
|---|---|---|
| Screen Reader | Run VoiceOver/TalkBack; verify labels, hints, roles, focus order, rotor/Local Context actions. | 4.1.2, 1.3.x |
| Touch Targets | All actionable elements meet 44/48 min size; adequate spacing; one-tap alternatives to complex gestures. | 2.5.x |
| Color & Contrast | Text/controls meet ratios in Light & Dark modes; focus/selected states visible. | 1.4.3, 1.4.11 |
| Text Scaling | Increase font size to max; content reflows without clipping; controls remain usable. | 1.4.4, 1.4.10 |
| Motion & Animations | Respect Reduce Motion; provide non-motion alternatives; no seizure-risk effects. | 2.3.x |
| Forms | Labels, hints, error announcements, proper input types, accessible validation summaries. | 3.3.x |
| Navigation | Back/Close clear and reachable; modal focus managed; no keyboard traps on TV/Chromebook. | 2.1.x, 2.4.x |
Tools: iOS Accessibility Inspector · Xcode Audits · Android Accessibility Scanner ·
TalkBack/VoiceOver · Switch Control · Colour Contrast Analyzers · Lighthouse (for web views).
Developer Handoff Essentials
- Design tokens include contrast-safe colors and spacing for 44/48 targets.
- Component library documents accessible names, roles, states, and examples for iOS + Android.
- Definition of Done: passes SR smoke test, large text, Dark Mode, Reduce Motion, and the checklist above.
- Bug reports reference WCAG criterion, reproduction steps, screenshots/video, and proposed fix.