Mobile — Cross Platform Development

Accessibility Standards for Cross-Platform Apps

Direct answer

Cross-platform apps should target WCAG 2.2 Level AA as the baseline standard, verified against both platform screen readers — VoiceOver on iOS and TalkBack on Android — because React Native's accessibility props map to different native APIs on each platform. The core work is consistent: label every interactive element, maintain sufficient contrast, respect system font scaling, keep touch targets comfortably large, and test real flows with a screen reader on both platforms. Legal exposure (ADA lawsuits in the US, the European Accessibility Act in the EU) has made this table stakes for consumer and commerce apps.

Accessibility in cross-platform apps fails in a specific way: teams add some accessibility props, test only with VoiceOver, and ship an app TalkBack users cannot navigate. Because one React Native codebase feeds two very different native accessibility systems, the standards and the testing both need to be explicitly two-platform. Here is the approach I bring to audits and builds.

Key facts, with sources

  • In the Stack Overflow 2024 Developer Survey, Flutter was used by 9.4% of developers versus React Native's 8.4%, and among professional developers the gap nearly vanishes at 9.21% versus 9.14%. (Nomtek (citing Stack Overflow Developer Survey))
  • Among developers who build cross-platform, Statista-based figures put Flutter at about 46% adoption versus 35% for React Native, with the two frameworks together dominating the cross-platform market. (Tech-Insider)
  • Instagram shares 85 to 99% of its code between iOS and Android using React Native, and Shopify reports 86% unified code across its app portfolio. (CatDoes)
  • According to Flutter.dev data, nearly 30% of new free iOS apps submitted to the App Store in 2025 were built with Flutter, up from roughly 10% in 2021. (Droids on Roids (citing Flutter.dev))
  • The official React Native showcase lists production apps from Meta, Microsoft, Shopify, and Amazon, including desktop targets like Messenger Desktop and Microsoft apps on Windows and macOS. (React Native Showcase)

Which standards actually apply to mobile apps

WCAG — the Web Content Accessibility Guidelines — is the reference standard, and despite the 'web' in the name, WCAG 2.2 Level AA is what auditors, procurement teams, and regulators apply to native mobile apps. It covers the substance: text alternatives, contrast ratios, target sizes, focus order, error identification. Both Apple and Google layer their own human interface guidance on top, which tells you how to meet the standard idiomatically on each platform.

The legal context has sharpened: US ADA litigation extends to mobile apps, and the European Accessibility Act now applies to a broad range of consumer-facing digital products sold in the EU, e-commerce and banking apps prominently included. For client work I treat WCAG 2.2 AA as the contractual target because it is auditable — vague commitments to 'being accessible' are neither testable nor defensible.

The React Native accessibility API: small surface, big leverage

React Native exposes a compact set of props that map to UIAccessibility on iOS and Android's accessibility framework: accessibilityRole tells assistive tech what an element is, accessibilityLabel what it says, accessibilityState its current condition, accessibilityHint what will happen, and accessibilityValue for ranges and progress. The 'accessible' prop groups child elements into one focusable unit — essential for cards and rows, which should read as one coherent announcement, not five fragments.

Most real-world failures I find in audits are not exotic: icon-only buttons with no label, custom pressables missing role='button', toggles whose state is invisible to screen readers, and images of text. Fixing the top twenty interactive components usually transforms the experience.

A properly announced interactive element
import { Pressable, Text } from 'react-native';

export function AddToCartButton({ product, disabled, onAdd }: Props) {
  return (
    <Pressable
      onPress={onAdd}
      disabled={disabled}
      accessibilityRole="button"
      accessibilityLabel={`Add ${product.name} to cart`}
      accessibilityHint="Adds one item to your shopping cart"
      accessibilityState={{ disabled }}
      style={{ minHeight: 44, justifyContent: 'center' }}
    >
      <Text>Add to cart</Text>
    </Pressable>
  );
}

The visual layer: contrast, type scaling, and touch targets

Three visual requirements do the heaviest lifting. Contrast: WCAG AA requires a 4.5:1 ratio for normal text and 3:1 for large text and UI components — I encode this in the design token palette once, so every screen inherits compliant pairings rather than each developer eyeballing gray-on-white. Type scaling: users set large system fonts, and your app must honor them; React Native does so by default, so the actual work is designing layouts that tolerate text at much larger sizes without truncating critical actions. Use maxFontSizeMultiplier sparingly and only where unbounded scaling genuinely breaks the UI — capping everything app-wide is a common audit finding and defeats the feature.

Touch targets: comfortably large tap areas (Apple's guidance is 44 points, Google's 48dp) — met with padding or hitSlop, not by enlarging icons. Small close buttons on modals are the most frequent offender I flag.

Test with both screen readers, not one

Because RN props translate to two different native accessibility systems, VoiceOver and TalkBack can disagree about your app. Focus order, announcement phrasing, gesture conventions, and how grouped elements read differ between them; I have found flows that were fine on iOS and unusable on Android in the same build. The only reliable check is a human pass: screen curtain on, navigating your core flows — sign-up, the money path, settings — by swipe alone on both platforms.

Automation catches the shallow layer: lint rules for missing labels on touchables, component tests asserting roles and states via Testing Library queries, and periodic scans with the platform accessibility inspectors. Useful, and I wire them into CI, but they cannot tell you the announcement order is incoherent or the label is technically present and semantically useless. Budget a manual screen-reader pass per release on each platform; it typically takes under an hour once the team is practiced.

Making it stick: process over heroics

One-off accessibility remediation decays within a couple of quarters if nothing structural changes. What keeps cross-platform apps accessible over time, in my experience: accessibility acceptance criteria in the definition of done ('navigable by screen reader on both platforms' as a checklist item), labels and roles baked into the design system components so product developers inherit correctness by default, and lint enforcement so regressions fail the pull request instead of reaching an audit.

The design-system point is the strongest lever in cross-platform work specifically. If Button, ListRow, TextField, and Modal are accessible once — correct roles, grouped announcements, visible focus, adequate targets — then most feature code becomes accessible by composition. In audits, apps built on a disciplined component library are consistently in far better shape than apps assembling raw Views and Pressables per screen, regardless of how much either team claims to care about accessibility.

When to hire senior help

The framework decision is a one-way door worth a short senior consultation, because switching stacks after a year of development is effectively a rewrite. A senior cross-platform engineer can also audit whether your planned feature set has hidden native-heavy corners, like payments hardware or background location, that change the cost math before you commit. If your stack includes React Native + Python + AI, a senior engineer who owns the full product beats coordinating multiple juniors.

Bottom line

Dhairya Senjaliya ships Mobile — Cross Platform Development projects worldwide — book a scoping call to discuss your specific situation.

Common pitfalls to avoid

  • Picking the framework by hype rather than team composition, such as a React web team adopting Flutter and forfeiting years of transferable JavaScript expertise
  • Budgeting for 100% code reuse and zero platform-specific time, then discovering payments, background tasks, and widgets all require per-platform native work
  • Recreating navigation and interaction patterns generically so iOS swipe-back gestures and Android back-button behavior both feel wrong to native users
  • Ignoring the maintenance tail: never budgeting for framework major-version upgrades, so the app rots on an unsupported runtime within two years

Frequently asked questions

What accessibility standard applies to mobile apps?

WCAG 2.2 Level AA is the standard auditors and regulators apply to mobile apps, despite the web-oriented name. It covers labels, contrast ratios, touch target sizes, focus order, and error handling. In the US, ADA claims extend to apps; in the EU, the European Accessibility Act covers many consumer-facing apps, including e-commerce and banking. Treat WCAG 2.2 AA as the auditable target.

Does React Native support accessibility for VoiceOver and TalkBack?

Yes. Props like accessibilityRole, accessibilityLabel, accessibilityState, and accessibilityHint map to the native accessibility APIs on both iOS and Android. The caveat is that VoiceOver and TalkBack interpret them differently — focus order, grouping, and announcements can diverge — so you must test core flows with both screen readers rather than assuming one platform's behavior implies the other's.

How do you test a cross-platform app for accessibility?

Combine automation with manual screen-reader passes. Automate the shallow layer: lint rules for missing labels, component tests asserting roles and states, and platform accessibility inspector scans. Then manually navigate your core flows by swipe with VoiceOver on iOS and TalkBack on Android each release. Also verify large system font sizes and check color contrast against the 4.5:1 WCAG AA ratio.

Should we choose Flutter or React Native?

Adoption among professional developers is nearly tied (9.21% versus 9.14% in the Stack Overflow 2024 survey), so the deciding factor is your team: React or JavaScript experience strongly favors React Native, while a greenfield team with no web-code-sharing needs can prefer Flutter. Both run massive production apps, so neither choice is inherently risky.

How much money does cross-platform actually save versus two native apps?

Industry cost guides put savings around 30 to 40% versus parallel native builds, driven by one codebase and one team, with production apps sharing 85 to 95% of code. Real savings depend on how much platform-specific work your feature set demands, such as payments, widgets, and background processing.

When is fully native the better choice?

Heavy 3D or AR workloads, advanced camera or audio processing, platform-first experiences like watchOS apps, or a company that already employs strong separate iOS and Android teams. For typical business, marketplace, and content apps, cross-platform is now the default choice at both startups and large companies like Shopify and Microsoft.

Bottom line: Dhairya Senjaliya ships Mobile — Cross Platform Development projects worldwide. Book a scoping call at https://dhairyasenjaliya.com/#book-call.

Sources

Related guides

Keep up with new guides

New deep-dive guides on React Native, Python, and AI ship regularly. Subscribe via RSS or follow on LinkedIn.

Want help implementing this?

30-minute scoping call · Clear milestones · Senior engineer ownership