クロスプラットフォームのアクセシビリティを振り返る 2025

Accessibility

この記事は「アクセシビリティ Advent Calendar 2025」7日目の記事です。
誤りや不足事項は、お手数ですが @grgr-dkrk.bsky.social へお願いします。

全般

記事が全体的に長くなってしまったので、世界情勢とかリーガル観点のセクションは削った。
EAA(European accessibility act, 欧州のアクセシビリティ対応に関する指令)の完全施行とか、accessiBe が FTC に目をつけられた話とか、ScreenAudit の話とか、コロラド州のアクセシビリティ対応が頑張ってるとか、色々あった。

WCAG2Mobile のドラフトノート公開

Mobile Accessibility Task Force による WCAG2Mobile のドラフトノートが出た。
WCAG2Mobile は、どうすれば WCAG2.2 をモバイルアプリに適用できるかを説明するもの。Web 以外のテクノロジーに WCAG を適用するための WCAG2ICT があり、それを参照しながら書かれている。
前身に Mobile Accessibility: How WCAG 2.0 and Other W3C/WAI Guidelines Apply to Mobile が存在し、編集者ドラフトから進まなかったが、WCAG2Mobile はグループノートの発行を目指すというところ。
まだ作業中の項目とか言い換えレベルの修正が多いけど、いずれモバイルアプリのアクセシビリティを考える時の資料として役立ちそう。
Mobile Accessibility Task Force Guidance on Applying WCAG 2.2 to Mobile Applications (WCAG2Mobile)
WCAG2ICT

iOS

Apple は今年でアクセシビリティやっていきから 40 周年を迎えるとのこと。
品質面で良くも悪くも話題となった iOS26 だが、アクセシビリティの機能が多数追加された。一部を取り上げる。

ライブキャプションの日本語対応

iOS 26 から、ライブキャプション機能の日本語対応が始まった。これにより、iOS と Android でライブキャプションが使えるようになった(Android はまだベータ版)。
ユーザーはリアルタイム会話の文字起こしにアクセスしやすくなった。とは言っても品質はまだ信頼できるレベルではない。
iPhoneで音声のライブキャプションを表示する - Apple サポート (日本)

点字機能の強化

「点字アクセス」機能を追加し、点字ディスプレイを用いて色々な操作にアクセスできるようになった。点字のファイル形式の一つである BRF ファイルの読み書きや、先に紹介したライブキャプションの出力も対応した。
また、「片手モード」が追加。点字入力と言えば画面を横向きにするイメージがあるが、縦持ちでも操作できるようになった。
iPhoneの点字ディスプレイで点字アクセスを使用する - Apple サポート (日本)
iOS26βで更新されたVoiceOverの新機能をこっそりご紹介🤫 - ラクセステック

アクセシビリティ設定の共有

他端末へアクセシビリティ設定の共有ができるようになった。設定の共有は一時的なものなので、公共の端末に使える。イキリオフィスの受付で iPad を操作させられることになっても安心かもしれない。飯屋や美容院のタブレットは Android だから使えないかも。
共有先の端末にも iOS26 を入れる必要がある。
Share your Accessibility settings with another device on iPhone - Apple

Accessibility Nutrition Labels の追加

App Store では iOS26 以降の OS 向けに "Accessibility Nutrition Labels" が追加された。
一言で言えば、アプリの情報にどんなアクセシビリティ対応をしているか表記できますよ、というもの。また、ガイドを読む限り、表記は今後アプリ提出時の必須要件になる様子。
これによりユーザーが「どんなアクセシビリティ対応を(テスト含めて)しているか」を確認したり、FB しやすくなる、はず。
Overview of Accessibility Nutrition Labels - App Store Connect - Help - Apple Developer

Liquid Glass への不満

Liquid Glass は賛否両論なのか、アクセシビリティ設定の「透明度を下げる」が選択肢として挙げられるようになっていた記憶。しかし、その設定により新たに発生する問題もあり Reddit で結構叩かれている模様(Reddit は何でも叩くが…)。
The iOS 26 implementation of Reduce Transparency and Increase Contrast options makes it look abysmal and broken. Does Apple now hate people with poor eye sight? : r/ios

Android

Android 16 がリリースされた。このバージョンから Quarterly Platform Release 略して QPR が採用され、アップデートが四半期間隔になる。今年は QPR2 までリリースされた。
さらに半年単位で API レベルも更新され、今は Android 16.1 である。

色々なアクセシビリティの改善

端末を補聴器のマイクとして使えるようになったり、最近注目?の Expressive Captions(AI を使った感情などの字幕化)を採用したり、「高コントラスト テキスト」の扱いが変化したり(縁取りから白抜き文字になる)、TalkBack で「表内の移動」が追加されたり、点字ディスプレイでトーストや通知を出力できるようになったり、色々とあった。
Android 16 features and changes list | Android Developers

TalkBack の画像読み上げの進化

Gemini が搭載された TalkBack の画像読み上げにも進化があった。登場時は読み上げのみだったが、現在ではユーザーとの対話もできる双方向なものに。16.1 からは日本語にも対応。
エミュレータからは上手く動作しなかったので、動画をいくつか見た。極端な話 Gemini 乗ってるだけなんだけど、レスポンスもそこまで遅くはないし、シームレスに対話を通して情報にアクセスできる体験は悪くなさそう。
What’s new with TalkBack 16.0 - Android Accessibility Help

前日、前々日の記事は alt がテーマだった。「画像で何を伝えれば良いのか」というテーマがありつつ、それ以上の情報はスクリーンリーダーがなんとかしつつある、という話もあり、この TalkBack の件で現実味を帯びた。
一方でファジーな回答が避けられない現状、alt でしっかり伝えたいことを書くことは、今後も必要だと思った。
「これで合ってる?」と毎回不安だったalt 属性に、やっと指針が持てるようになった話|kayoko_namba
とにかく、私は画像になにが書かれてるか知りたいのです! #HTML - Qiita

拡張ダークモード

QPR2 では全てのアプリにダークモードを強制する機能が追加された。これにより、ダークモードに対応してこなかったアプリも、多少見栄えを意識する必要に迫られる。
やってほしいのは未対応アプリに対する強制化ではなく最適化なんだが…。
Turn on dark theme & color inversion - Android Accessibility Help

API の追加、変更

ラベルの関連付けに変更があった。単一の関連付けから、複数の関連付けが可能になった。そのための addLabeledBy に始まる新しい API が提供され、setLabeledBy など従来の API に対するサポートが終了。
他にもフォームの必須項目を通知できる setFieldRequired や、子 View の内容を上書きせずコンテンツの説明を提供できる setSupplementalDescription、拡張可能な要素の状態を伝えられる setExpandedState などの有用な API が追加された。
Features and APIs | Android Developers

announceForAccessibility の Deprecated

一方で Deprecated になった API もある。それが任意のテキストを割り込みで読み上げる announceForAccessibility である。ライブリージョンとかを適切に使ってね、ということ。
Behavior changes: all apps | Android Developers

React Native

アクセシビリティのラジオ

春には React Native Radio で Karly Lamm 氏をゲストに迎えアクセシビリティをテーマにしたインタビューが配信。トランスクリプトがあるので一読しても良いかと。
氏のアクセシビリティを意識するきっかけとなった「画面サイズを拡大したユーザーがボタンを押せなくなる」というエピソードは、React Native アプリの運用で誰もが通る道。
React Native Radio - RNR 330 - React Native and Accessibility with Karly Lamm

RN Web vs React Strict DOM

更に React Native Radio では、for Web と React Strict DOM を開発する Nicolas 氏と、Expo の Evan 氏を迎えた React Strict DOM についてのインタビューもあった。
RNR 339 - RN Web vs React Strict DOM (Pt 1) w/ Nicolas Gallagher RNR 340 - RN Web vs React Strict DOM: Part 2, with Evan Bacon and James Ide

両者で目指したいところの根底は同じでも、見てるところは違うんだなと思った。Nicolas 氏は RN の Web セマンティクスだったりエコシステムの断片化に課題感を持っていて、Evan 氏はどちらかと言えばモバイルレイアウトの抽象化やエコシステムの成熟に価値を置くところとか。エスケープハッチでもある Expo の DOM Component の良さがあんまりわかってなかったが、思想が垣間見えた気がする。あと Expo 67 に期待。

Strict DOM に寄せる方針って、Org 内にどれだけ浸透しているのかよくわかってない。
aria-labelTextInput に追加されてなかった問題もあったし…。
fix(a11y): TextInput aria-label handling by mdjastrzebski · Pull Request #53051 · facebook/react-native

余談だが Evan 氏がちょっと触れている通り、Expo は Tailwind CSS への対応を予定している。
2025年のReact Nativeを振り返り、2026年に期待すること - Zenn(kazutoyo@TellerNovel)

React Native UITextView の New Architecture 対応

Bluesky 発の React Native UITextView は、2.1.0 で念願の New Architecture に対応した。React Native の Text コンポーネントはテキストを選択できないが、このコンポーネントはそれをサポートするもの。
React Native UITextView - GitHub  

experimental_accessibilityOrder

React Native は支援技術によるフォーカスの順番を制御できない問題があり、昨年は React Native A11y Order を紹介した。
今年、React Native 0.80 は accessibilityOrder という API をリリースした。0.82 現在は experimental_accessibilityOrder として試験的な運用となっている。
Accessibility · React Native

experimental_accessibilityOrder の使い方としては、子の accessible={true} なコンポーネントに nativeID を当て、アクセシビリティコンテナにこの props を指定し、フォーカスさせたい要素の nativeID を配列で指定する、というもの。

example.tsx

// B, F, E, D, A の順番でフォーカスされる
<View experimental_accessibilityOrder={['B', 'C', 'A']}>
  <View accessible={true} nativeID="A"/>
  <View accessible={true} nativeID="B"/>
  <View nativeID="C" experimental_accessibilityOrder={['F', 'E', 'D']}>
    <View accessible={true} nativeID="D"/>
    <View accessible={true} nativeID="E"/>
    <View accessible={true} nativeID="F"/>
  </View>
</View>

パッと見複雑なので、実運用は厳しそうだ。
内部的には、指定した配列と View をもとに iOS は accessibilityElements を、Android は addChildrenForAccessibility に割り当ててフォーカス順を制御している様子。

Flutter

Flutter はブログのリリースノートに毎回セクションがあるのが好印象。
React Native なんかアクセシビリティのアの時もないよ。
ブログにない修正も大量にあるけど、ごく一部を紹介

HTML レンダラの廃止

昨年も触れた Web の HTML レンダラは、今年最初にリリースされた 3.29 にて廃止された。
Intent to deprecate and remove the HTML renderer in Flutter Web #145954

Semantics のパフォーマンス改善

Flutter のアクセシビリティツリーを司る Semantics のパフォーマンスが向上。ツリーが更新される時のステップを分けてキャッシュを設けることで改善した。
Introduce caching mechanism during compile semantics tree monorepo and formatted version by chunhtai · Pull Request #161195 · flutter/flutter

また、Semantics のジオメトリの計算最適化が P1 に入っていてる。
全然噛み砕けてないけど、以下のような話だと解釈した。
ある RenderObjectSemantics の更新が入ると祖先まで dirty(要更新) とマークされ、不要な更新対象が発生する。しかし、単純な親子関係にできない OverlayPortal の例もあり、必要な部分だけ dirty にする対応は難しい。Semantics のツリーは RenderObject のツリーより浅くなるので、ルートから走査しキャッシュをみながらジオメトリを計算してみる。
なるほど(よくわかっていない)
[A11y] Further optimize geometry calculation in semantics · Issue #166173 · flutter/flutter

SemanticsLabelBuilder の登場

ラベルの連結をするための SemanticsLabelBuilder が登場。
Web の aria-labelledby の対応から生まれたもののようで、開発者がラベルの連結を文字列とかでやるとスペースの入れ忘れとか、Right To Left への対応とかでバグになるから、その API を提供するよ、というもの。

dart

// "JohnDoe"
String label = "$firstName$lastName";  

// "John Doe"
final label = (SemanticsLabelBuilder()
  ..addPart(firstName)
  ..addPart(lastName)).build();

Add SemanticsLabelBuilder for Accessible Label Concatenation by flutter-zl · Pull Request #171683 · flutter/flutter

フィードバック

色々と頑張っている Flutter だが、対応はバグを受けての後手になってしまう。リーガル面の懸念と、アクセシビリティ不備の差し込み対応によるスケジュール圧迫を鑑みて、事前に FB を募るための RFC ができた。
RFC: Seeking feedback on improving dev experience when working on accessibility · Issue #176237 · flutter/flutter

Open と Closed の話

アクセシビリティの話とはちょっと脱線するけど…。
FlutterKaigi 2025 での koji-1009 氏の発表と PR も示唆に富むものだった。
氏は MediaQueryData.accessibleNavigation(支援技術を有効化しているかを取得する)が Web で切り替わらない問題に取り組んだ。
Flutterコントリビューションのススメ by koji-1009 | トーク | FlutterKaigi 2025 #FlutterKaigi - fortee.jp
[Web][Engine] Update MediaQuery in response to semanticsEnabled by koji-1009 · Pull Request #166836 · flutter/flutter

氏はこの Issue の優先度が P1 だったのが、P2 になっていたことに言及した。他にも様々なエピソードを紹介し、Flutter には Issue などの Open な情報と、スケジュールなどの Closed な情報がある、と語っている。
これは Flutter というか OSS に限らないテーマではあるなと。組織の構造上コントロールできないことがあり、ソリューションの正しさを示すことは誰もできるけど、それ自体はやってる感しか出てこないんだよな。
自分が大事だと思うことに直接的に関わって、成果を出していくことが課題解決に近づくし、楽しさにも繋がるのかと。
当たり前のようで難しい話ではある。でもアクセシビリティってとりわけ議論が Woke になりやすい分野でもあるし、何をすべきか、というのを色々考えたりした。

終わりに

今年もお疲れ様でした。