初めてVoiceOverを対応する人におすすめのWWDCセッション

この投稿は Goodpatch Advent Calendar 2022 11日目の記事です。

こんにちは、エンジニアの中田です。とあるプロジェクトでiOS Appを開発しており、アクセシビリティの向上の一環として、VoiceOverの体験を改善させる取り組みを実施しました。私にとって、VoiceOverの対応は初めてで、漠然と「VoiceOver」について知っていたものの、いざ実装しようとした際に、どこから手をつけてよいのか悩みました。その際「VoiceOver」を基礎から学ぼうと思い、過去のWWDCセッションを視聴することから始めました。

この記事では、初めてVoiceOverを対応する人におすすめのWWDCセッションと、その概要を紹介します。

WWDC18 - 226 - VoiceOver App Testing Beyond The Visuals

日本語のタイトルは「VoiceOver:視覚を超えた観点からAppをテストする」です。

このセッションでは、次のことが説明されていて、セッション途中で「VoiceOver」を使ったデモもあり、「VoiceOver」の基礎を学ぶにはとても重要なセッションです。

  • 「VoiceOver」とは何か
  • なぜ「VoiceOver」をサポートすべきなのか
  • どのように「VoiceOver」を使うのか
  • 「VoiceOver」がAppにもたらすメリットとは

「VoiceOver」とは何か

よくある返答は「スクリーンリーダー」「視覚に障がいのある方のための機能」です。正解ではありますが、それだけではありません。それは、私たちが開発しているAppを使う新たな方法です。

すべての人がVoiceOverを使用できますが、VoiceOverユーザーが利用できるAppは限られています。一部のユーザー向けに配置や見た目をシンプルにするということではなく、すべてのユーザーに向けたもの、誰もが体験にアクセスできるようにします。

なぜ「VoiceOver」をサポートすべきなのか

次の理由もありますが、時間やリソースに限りのある多くのDeveloperにとって、VoiceOverをサポートする理由としては不十分でしょう。

  • Appがより包括的(インクルーシブ)になる
  • VoiceOverユーザーが、そのAppを選ぶ
  • VoiceOverユーザーが、コミュニティーの他のユーザーに勧める

また、スクリーンリーダーが役立つのだろうかと、疑問に思うかもしれません。

「VoiceOver」はすべてのユーザーのためにあり、

  • Voice Overを使ったテストは、新しい視点を与えてくれる(新しい体験のチャンスとなる)
  • Voice Overは、アプリケーションの見た目だけではない
  • 新しいチャレンジと発見がある

というものです。

あなたのAppは目を閉じても使えますか?

このスライドを見た時、「目を閉じてても使える」、そんなことが本当にできるようになるのかと不安になりました。

このセッションでは「この問いに答える唯一の方法はVoiceOverで使うこと」であり、テスターだけでなく、デザイナーや開発者など全員に、ユーザーに最高の体験をさせる責任があると話されています。

どのように「VoiceOver」を使うのか

(注:セッションで紹介されている内容を、iOS 16に合わせて設定appのナビゲーションを変更しています)

まず、設定appの[アクセシビリティ]を開きます。[VoiceOver]が一番上にありますが、オフにする方法をまだ知らないため、ここでオンにしません。初めて使用する人には[ショートカット]の設定を推奨します。

ショートカット一覧の[VoiceOver]をチェックします。

チェックしたら、ホームボタンを3回クリックするだけです。ホームボタンがないデバイスは、サイドボタンを3回クリックします。

Tips:操作に迷って、VoiceOverをOffにしたい場合、右側のボタンを3回押すことで抜けられるため、デバッグ時に重宝します。

「VoiceOver」がAppにもたらすメリットとは

VoiceOverによって次の問題が明らかになります。

  1. 正しく聞こえないものは、正しく読めないかもしれない
  2. VoiceOverでナビゲートするのに苦労するなら、おそらく視覚的にも苦労するはず
    • VoiceOverの操作には、多大な労力がかかるため、見出しを細かくすることが大事です。ユーザーの目線に立つことで、より視覚的で聞きやすいAppになります。
  3. Appが順不同に聞こえるなら、コンテンツも順不同になっている可能性がある

大事なこと

  • 目を閉じて使ってみて、実際に体験して、Appの活用を妨げる問題を把握する
  • 目を開けて、体験を確認する
  • VoiceOverを通常のテストに組み込む

WWDC19 - 254 - Writing Great Accessibility Labels

日本語のタイトルは「優れたアクセシビリティラベルを作成する」です。

VoiceOverや画面の読み上げ、音声コントロールを、アプリケーションの操作に使いますが、機能させるにはAppの要素にラベルを付ける必要があります。

このセッションでは、

  • アクセシビリティラベルとは?
  • コンテキストの大切さ
  • ベストプラクティス

について、説明されています。

アクセシビリティラベルとは?

アクセシビリティ要素を簡潔に識別するローカライズされた文字列です。

アクセシビリティ要素とは、アプリケーションの要素にラベルを付け、コンテキストや意味を与えることです。

button.accessibilityLabel = "Delete"

一見、簡単に思えるラベルですが、コンテキストによって変化するため、適切なラベルを付けるのは難しいです。

コンテキストの大切さ

例えば、このボタンにラベルを付けるとしたら?

このボタンにラベルを付けるとしたら?

ストレートに考えると「プラス」でしょう。ですが、コンテキストを加えて、ナビゲーションバーの右側においた場合「追加」、メモappなら「新規メモを追加」と理解します。

ショッピングの場面では「カートに追加」になり、対象が複数ある場合は具体的に「ピーナッツバターを追加」でしょう。

このように、ボタンに付けるラベルは、コンテキストよって異なります。

ベストプラクティス

VoiceOverは要素タイプを認識しているため「ボタン」は不要です。

// ❌ Don't
button.accessibilityLabel = "Add button"

// ✅ Do
button.accessibilityLabel = "Add"

同じアクションを示すボタンが複数ある場合は、ラベルにコンテキストを加えます。

// ❌ Don't
button.accessibilityLabel = "Add"

// ✅ Do
button.accessibilityLabel = "Add Peanut Butter"

不要なラベルは省略します。例えば、音楽プレイヤーの場合、扱うのは「曲」であるため、次のようにします。

// ❌ Don't
playButton.accessibilityLabel = "Play song"
nextButton.accessibilityLabel = "Next song"

// ✅ Do
playButton.accessibilityLabel = "Play"
nextButton.accessibilityLabel = "Next"

ProgressViewのようなアニメーションにラベルを加えます。

// ✅ Do
spinner.accessibilityLabel = "Loading.."

ラベルは、できる限り簡潔にします。

// ❌ Don't
button.accessibilityLabel = "Delete item from the current folder and add it to the trash"

// ✅ Do
button.accessibilityLabel = "Delete"

WWDC19 - 238 - Accessibility in SwiftUI

日本語のタイトルは「SwiftUIにおけるアクセシビリティ」です。

このセッションでは、

  • アクセシビリティについて
  • SwiftUIで、いかに使いやすいアプリケーションが作り出せるか

について、説明されています。

本記事では、アクセシビリティの全般的な話は割愛して、SwiftUIにフォーカスします。

SwiftUIによる自動的なアクセシビリティの実現

SwiftUIでは、自動的にAppにアクセシビリティを組み込むことができます。SwiftUIでは、次のように3つのアクセシビリティ要素が生成されます。

SwiftUIが生成するアクセシビリティ要素

SwiftUIの特徴は、アクセシビリティ機能に、最新の情報を伝えることです。例えば、画面の値が変わり、値は「10」になった場合、VoiceOverに変更の通知が必要です。SwiftUIがアクセシビリティ通知をサポートし、VoiceOverに変更が通知されます。

SwiftUIがアクセシビリティ通知をサポート

SwiftUI Accessibility API

注意:このセッションで紹介されているAPIの多くは、iOS 14以降シグネチャが変わっています。例えば、accessibility(label:)accessibility(value:)accessibility(addTraits:) は、それぞれ、accessibilityLabel()accessibilityValue()accessibilityAddTraits()へ変わっています。

WWDC18 - 226 - VoiceOver App Testing Beyond The Visualsの中で、

VoiceOverの操作には、多大な労力がかかるため、見出しを細かくすることが大事です。

と説明されていますが、次のように isHeader を適用することで、ヘッダ間の移動が速くなります。

TraitとしてisHeaderを適用

iOS 14以降では、.accessibilityAddTraits(.isHeader) となります。

ヘッダ間の移動は、VoiceOver ローターを使って操作性を確かめます。

VoiceOver Roterを使って操作性を確かめる

補足iPhone、iPad、iPod touch の VoiceOver ローターについて - Apple サポート (日本)

Accessibility Tree

例えば、次のようなリストの要素(テーブルビューのセル)を表現するViewでは、テキストから1つ、ボタンから2つのアクセシビリティ要素が生成されます。

セルのアクセシビリティ要素

リストの要素が1つならVoiceOverのナビゲートは簡単ですが、リストの要素が増えると、各アクセシビリティ要素が連なり、ナビゲートが困難になります。

次のようにHStackに対して、combineを指定することで、要素をひとつにまとめ、新しい要素を生成します。これで VoiceOverは1つの要素として作動し、思いどおりにナビゲートできます。

combineを指定することで、アクセシビリティ要素をひとつにまとめる

関連するユーザインターフェイスをまとめるとナビゲーションが向上します。

デバッグを始める前にVoiceOverを練習しましょう

デバッグを始める前に、VoiceOverジェスチャに慣れておきましょう。

VoiceOverをオンにすると、[VoiceOverの操作練習]が表示されます。[VoiceOverの操作練習]をタップすると、ジェスチャを練習するための画面が表示されます。練習画面で「1本指で右にスワイプ」「1本指でダブルタップ」などのジェスチャを行うと、VoiceOverで実行されるアクションを確認できます。

詳しくは、iPhoneでVoiceOverをオンにして練習する - Apple サポート (日本)をご参照ください。

おわりに

この記事では、私が「VoiceOver」を基礎から学ぼうと思い、視聴したWWDCセッションの概要を紹介する形で「VoiceOverとは」「どのようにVoiceOverを使うのか」「アクセシビリティラベルのベストプラクティス」などにふれました。この記事が、初めて「VoiceOver」を対応される際の足がかりになれば幸いです。

あわせて確認しましょう

そのほかのWWDCセッション

Appleのドキュメンテーション