Accessibility (a11y) — обеспечение доступности мобильного приложения для людей с ограниченными возможностями. Включает поддержку экранных дикторов (VoiceOver на iOS, TalkBack на Android), масштабирование текста (Dynamic Type), достаточный цветовой контраст (WCAG 2.1 уровень AA), навигацию без зрения и альтернативы жестам. По данным ВОЗ (2023), более 1,3 млрд человек (16% населения) живут с той или иной формой инвалидности — accessibility не опция, а необходимость. Подробнее — в официальной документации Apple по accessibility.
Главное
Accessibility (сокращённо a11y — 11 букв между «a» и «y») — практика разработки приложений, доступных для людей с нарушениями зрения, слуха, моторики и когнитивными особенностями. В мобильной разработке accessibility охватывает четыре основных сценария: незрячие пользователи (экранные дикторы), слабовидящие (масштабирование, контраст), глухие и слабослышащие (субтитры, визуальные альтернативы звуку), пользователи с ограниченной моторикой (голосовое управление, Switch Control, большая область касания).
Правовые требования — во многих странах accessibility обязательна по закону. США: Section 508 и ADA. ЕС: European Accessibility Act (2025). Великобритания: Equality Act 2010. Без поддержки accessibility приложение может стать объектом судебного иска — в США за 2023 год подано более 4000 исков о недоступности цифровых продуктов. Apple и Google проверяют accessibility при модерации приложений: App Store Review Guidelines (4.2) и Google Play Store требуют минимальной поддержки доступности.
Бизнес-аргумент — доступность увеличивает аудиторию. По данным Return on Disability (2021), люди с инвалидностью контролируют $13 трлн располагаемого дохода в год. Доступные приложения также лучше ранжируются в поиске (семантический HTML, alt-тексты), имеют более высокий пользовательский рейтинг и меньше отзывов о проблемах с UX. В IT Sectr мы включаем accessibility в definition of done всех проектов — это стандарт качества, а не опциональное улучшение.
VoiceOver — экранный диктор Apple, встроенный в iOS, iPadOS и macOS. Пользователь проводит пальцем по экрану, VoiceOver читает название элемента под пальцем. Двойное касание — активация элемента. VoiceOver поддерживает более 40 жестов: три пальца свайп (листание), два пальца двойное касание (стоп), Z-жест (возврат). Разработчик управляет тем, что и как читает VoiceOver, через протокол UIAccessibility и свойства accessibilityLabel, accessibilityTraits, accessibilityHint.
class CustomButton: UIButton {
override var isAccessibilityElement: Bool {
get { return true }
set {}
}
// override accessibilityLabel
override var accessibilityLabel: String? {
get { return "Кнопка отправки формы" }
set {}
}
// override accessibilityHint
override var accessibilityHint: String? {
get { return "Дважды коснитесь, чтобы отправить данные" }
set {}
}
// override accessibilityTraits
override var accessibilityTraits: UIAccessibilityTraits {
get { return .button }
set {}
}
}
// Dynamic Type — масштабирование текста
titleLabel.font = UIFontMetrics.default.scaledFont(
for: UIFont.systemFont(ofSize: 16)
)
titleLabel.adjustsFontForContentSizeCategory = true
Динамическая типографика — Dynamic Type в iOS позволяет пользователю выбрать размер текста (от XS до XXXL). Разработчик использует UIFontMetrics.scaledFont для автоматического масштабирования. Текст должен корректно отображаться на всех размерах: строки не должны обрезаться, кнопки — расти пропорционально тексту. UITableView автоматически обновляет высоту ячеек при изменении размера текста. Проигнорировать Dynamic Type — значит сделать приложение недоступным для слабовидящих пользователей.
SwiftUI предоставляет модификаторы для accessibility: .accessibilityLabel(), .accessibilityHint(), .accessibilityAddTraits(), .accessibilitySortPriority(). По умолчанию все стандартные элементы SwiftUI (Text, Button, Image) уже являются accessibility-элементами с автоматическими label. Для кастомных View используйте .accessibilityElement(children: .combine) для объединения дочерних элементов в один. SwiftUI автоматически поддерживает Dynamic Type и VoiceOver.
VStack {
Image(systemName: "trash")
.accessibilityLabel(Text("Удалить элемент"))
Text("Корзина")
.font(.body)
}
.accessibilityElement(children: .combine)
.accessibilityAddTraits(.isButton)
.accessibilityHint(Text("Удаляет выбранный элемент без возможности восстановления"))
TalkBack — экранный диктор Google, предустановленный на большинстве Android-устройств (доступен в Google Play для всех версий Android 5+). TalkBack использует те же жесты, что и VoiceOver: свайп для навигации, двойное касание для активации. Разработчик задаёт описание элементов через атрибут android:contentDescription в XML или через setContentDescription() в коде. Для ImageView contentDescription обязателен — без него TalkBack сообщит «не маркировано» или прочитает имя файла.
// XML: contentDescription для ImageView
<ImageView
android:id="@+id/iconDelete"
android:src="@drawable/ic_delete"
android:contentDescription="@string/delete_button_desc"
android:focusable="true"
android:clickable="true" />
// Kotlin: программное задание
iconDelete.contentDescription = getString(R.string.delete_button_desc)
// Accessibility Delegate (кастомный)
iconDelete.accessibilityDelegate = object : View.AccessibilityDelegate() {
override fun onInitializeAccessibilityNodeInfo(
host: View, info: AccessibilityNodeInfo
) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.text = "Кнопка удаления"
info.contentDescription = "Удалить выбранный элемент"
info.className = Button::class.java.name
}
}
// Live Regions для динамических обновлений
textView.accessibilityLiveRegion = View.ACCESSIBILITY_LIVE_REGION_POLITE
Live Regions — механизм Android для уведомления TalkBack об изменении содержимого без фокуса. Атрибут android:accessibilityLiveRegion принимает три значения: none (нет уведомлений), polite (объявить после текущего), assertive (объявить немедленно). Используйте polite для обновления статуса загрузки, assertive — для критических ошибок. Злоупотребление assertive приведёт к хаосу для пользователя — TalkBack будет постоянно прерывать текущее действие.
Accessibility Scanner — бесплатное приложение от Google для тестирования доступности Android-приложений без доступа к исходному коду. Сканер проверяет: контраст текста, размер touch-областей (минимум 48×48dp по Android Accessibility Guidelines), наличие contentDescription для ImageView, корректность иерархии элементов. Для автоматических тестов используйте AccessibilityChecks из Espresso — они интегрируются в CI/CD и проверяют accessibility при каждом билде.
WCAG 2.1 (Web Content Accessibility Guidelines) — международный стандарт доступности, разработанный W3C. Версия 2.1 (2018) включает 13 дополнительных критериев для мобильных приложений. Уровни соответствия: A (минимальный), AA (обязательный для большинства организаций), AAA (максимальный). Apple и Google рекомендуют уровень AA как минимальный для публикации приложений. WCAG 2.2 вышел в 2023 году с уточнениями для фокуса и ввода.
Ключевые критерии для мобильной разработки: контраст текста не менее 4.5:1 (AA) или 7:1 (AAA), размер сенсорных областей минимум 44×44pt (iOS) или 48×48dp (Android), поддержка альбомной и портретной ориентации без потери функциональности, возможность отключения анимации (prefers-reduced-motion), наличие подписей к мультимедиа, совместимость с голосовым управлением (Voice Control на iOS, Voice Access на Android).
| Критерий WCAG 2.1 | Уровень | Требование для iOS | Требование для Android |
|---|---|---|---|
| 1.4.3 Контраст (текст) | AA | 4.5:1 для обычного, 3:1 для крупного | 4.5:1 для обычного, 3:1 для крупного |
| 1.4.11 Контраст (non-text) | AA | 3:1 для иконок, границ | 3:1 для иконок, границ |
| 2.5.5 Размер цели | AAA | 44×44pt | 48×48dp |
| 2.3.3 Анимация | AAA | prefers-reduced-motion | android:animateLayoutChanges |
| 4.1.2 Имя, роль, значение | A | accessibilityLabel, traits | contentDescription, role |
Инструменты проверки контраста — Colour Contrast Analyser (TPGI), WebAIM Contrast Checker, Stark (Figma), Accessibility Inspector (Xcode). В IT Sectr мы проверяем контраст на этапе дизайна (Figma + Stark) и повторно на этапе разработки (Accessibility Inspector / Accessibility Scanner). Минимальное требование — 4.5:1 для всего текста менее 18pt (14pt bold). Для логотипов и декоративных элементов контраст не требуется.
iOS тестирование — Accessibility Inspector в Xcode (Xcode → Open Developer Tool → Accessibility Inspector) проверяет label, traits, hint для каждого элемента. VoiceOver можно включить в настройках или через Accessibility Shortcut (тройное нажатие кнопки). Для автоматических тестов используйте XCUITest с XCTAssertTrue(app.staticTexts["label"].isAccessibilityElement). Apple рекомендует протестировать все экраны приложения с включённым VoiceOver.
Android тестирование — Accessibility Scanner (Play Store) проверяет контраст, размер touch-областей, contentDescription. Для автоматизации: Espresso AccessibilityChecks (импорт: androidTestImplementation 'androidx.test.espresso:espresso-accessibility:3.5.1'). Google рекомендует чеклист: каждый ImageView имеет contentDescription, сенсорные области не менее 48×48dp, текст масштабируется до 200% без обрезания, все элементы достижимы свайпом TalkBack.
IT Sectr чеклист — перед релизом мы проверяем: (1) VoiceOver/TalkBack корректно читает все элементы, (2) текст масштабируется до максимального размера без потери функциональности, (3) все ImageView имеют contentDescription, (4) контраст текста ≥4.5:1 во всех темах, (5) touch-области ≥44pt/48dp, (6) нет контекстного меню, доступного только по долгому нажатию, (7) поддержка Reduce Motion / Remove Animations в системных настройках. Этот чеклист входит в definition of done каждого спринта.
Часто задаваемые вопросы
VoiceOver — экранный диктор Apple для iOS, iPadOS, macOS. Использует жесты одной и несколькими пальцами (свайп, двойное касание). TalkBack — аналог Google для Android с похожими жестами. VoiceOver читает accessibilityLabel, TalkBack — contentDescription. Оба поддерживают брайлевские дисплеи и голосовое управление. Принципиальных различий в функциональности нет.
contentDescription — атрибут View в Android, задающий текстовое описание для TalkBack. Без него TalkBack сообщает «не маркировано» или читает имя класса (ImageView, Button). Добавляется через android:contentDescription="@string/desc" в XML или view.contentDescription = "текст" в коде. Для декоративных изображений используйте contentDescription=@null.
По WCAG 2.1 уровень AA: 4.5:1 для обычного текста и 3:1 для крупного (от 18pt или 14pt bold). Уровень AAA: 7:1 для обычного и 4.5:1 для крупного. Проверяйте контраст в двух темах (светлая/тёмная). Нарушение контраста — самая частая проблема доступности в мобильных приложениях по данным Google.
Да, Apple рекомендует Dynamic Type для всех приложений. Пользователь задаёт размер текста в Настройках. Разработчик использует UIFontMetrics.scaledFont — шрифт масштабируется автоматически. Без Dynamic Type пользователи с ослабленным зрением не смогут читать текст. iOS автоматически проверяет Dynamic Type при модерации в App Store.
WCAG (Web Content Accessibility Guidelines) — международный стандарт доступности контента от W3C. Версия 2.1 (2018) включает критерии для мобильных приложений: контраст, размер touch-областей (44×44pt), поддержка экранных дикторов, альтернативы жестам, субтитры. Уровень AA — минимальный стандарт для публикации в App Store и Google Play.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также