VoiceOver — встроенный screen reader от Apple, позволяющий незрячим и слабовидящим пользователям взаимодействовать с устройством. Если ваше приложение его не поддерживает, они просто не могут им пользоваться. Мы проводим аудит и внедрение VoiceOver под ключ, гарантируя соответствие стандартам доступности. Наш опыт — более 5 лет в разработке iOS-приложений для различных отраслей. Свяжитесь с нами для оценки вашего приложения.
Почему VoiceOver важен для бизнеса?
По данным Apple, более 15% пользователей iOS активно используют функции доступности. Игнорирование этой аудитории приводит к потере до 15% потенциальных клиентов. Кроме того, многие контракты в государственном секторе, медицине и образовании требуют соответствия WCAG 2.1 или Section 508. Приложения без VoiceOver не проходят эти требования, что ограничивает рынок сбыта. Более того, несоответствие стандартам может повлечь юридические санкции и финансовые штрафы. Автоматизированный аудит сокращает время проверки в 3–5 раз по сравнению с ручным, а исправление ошибок на этапе разработки обходится на 40% дешевле, чем после релиза.
Какие элементы приложения ломаются без VoiceOver?
Кастомные UIView и SwiftUI View
Стандартные UIButton, UILabel, UITextField — VoiceOver понимает из коробки. Кастомные UIView с нарисованным на CALayer контентом — нет. VoiceOver видит весь кастомный view как один элемент без описания.
Для UIKit: isAccessibilityElement = true, accessibilityLabel, accessibilityHint, accessibilityTraits. accessibilityLabel — что это такое («Кнопка добавить в корзину»). accessibilityHint — что произойдёт при активации («Добавляет товар в корзину, переходит к оформлению»). accessibilityTraits — тип элемента (.button, .link, .image, .header, .selected).
| Аспект | UIKit | SwiftUI |
|---|---|---|
| Label | accessibilityLabel |
.accessibilityLabel() |
| Hint | accessibilityHint |
.accessibilityHint() |
| Traits | accessibilityTraits |
.accessibilityAddTraits() |
| Объединение детей | Массив accessibilityElements |
.accessibilityElement(children: .combine) |
Для SwiftUI: модификаторы .accessibilityLabel(), .accessibilityHint(), .accessibilityAddTraits(). Если несколько вложенных View нужно объединить в один accessible элемент — .accessibilityElement(children: .combine) или .accessibilityElement(children: .ignore) + явный label.
Изображения без alt-текста
UIImageView с isAccessibilityElement = false (по умолчанию) — VoiceOver пропускает. Декоративные изображения — правильно. Смысловые — нет, нужен accessibilityLabel. Иконки в кнопках: если UIButton содержит только UIImageView без текста — нужен accessibilityLabel на кнопке, иначе VoiceOver зачитает имя файла или молчит.
Порядок фокуса
VoiceOver обходит элементы по accessibilityActivationPoint — обычно центр frame. Для сложных layout (overlay, absolute positioning в SwiftUI, кастомные контейнеры) порядок может быть хаотичным. Исправляется через accessibilityElements на родительском контейнере — массив в нужном порядке:
override var accessibilityElements: [Any]? {
get { [titleLabel, priceLabel, addButton] }
set { }
}
В SwiftUI — .accessibilitySortPriority() для управления порядком.
Модальные экраны и кастомные оверлеи
UIAlertController — VoiceOver фокусируется автоматически. Кастомный UIView-оверлей поверх контента — нет. Нужно UIAccessibility.post(notification: .screenChanged, argument: firstElement) чтобы перевести фокус на первый элемент оверлея. При закрытии — post(notification: .screenChanged, argument: triggerButton) чтобы вернуть фокус на кнопку, которая открыла оверлей.
accessibilityViewIsModal = true на контейнере оверлея — скрывает фоновой контент от VoiceOver. Без этого пользователь свайпом может «провалиться» сквозь оверлей на задний контент.
Как мы проводим аудит и внедрение: пошаговый процесс
- Включение VoiceOver — Cmd+F5 в Simulator или тройной клик Home/Side Button на устройстве. Проходим все ключевые флоу: онбординг, главный экран, основные actions (оформить заказ, отправить сообщение, воспроизвести медиа).
- Фиксация проблем — элементы без label, неправильный порядок фокуса, недостижимые элементы, модальные оверлеи без управления фокусом.
- Инструменты — Accessibility Inspector (Xcode) проверяет контрасность, находит элементы без label без запуска приложения. XCTest с
XCUIAccessibilityAudit(iOS 17+) даёт автоматизированный аудит в UI-тестах. - Приоритет исправлений — сначала навигация и ключевые CTA, потом списки и формы, потом медиа-контент.
Сравнение ручного и автоматизированного тестирования:
| Критерий | Ручное тестирование | Автоматизированный аудит |
|---|---|---|
| Время на один экран | 10–15 мин | 1–2 мин |
| Охват | Выборочный | Полный (все элементы) |
| Точность | Зависит от тестировщика | Стабильная |
| Повторяемость | Низкая | Высокая (можно в CI) |
Что входит в работу?
- Аудит доступности с отчётом по каждому экрану и приоритетом исправлений.
- Реализация accessibility labels, hints, traits для всех кастомных компонентов.
- Настройка порядка фокуса для сложных layout и модальных окон.
- Интеграция с VoiceOver для динамического контента (например, обновление после загрузки).
- Тестирование с помощью Accessibility Inspector и ручное прохождение ключевых сценариев.
- Документация и рекомендации для команды по поддержке доступности в будущем.
Срок: 3-5 дней для приложения среднего масштаба. Стоимость рассчитывается индивидуально — напишите нам, и мы оценим ваш проект. Получите консультацию по вашему проекту — мы поможем внедрить VoiceOver качественно и в срок.
Типичные ошибки при реализации VoiceOver
- Забывают задать
accessibilityLabelдля кнопок-иконок (только изображение). - Не используют
accessibilityTraits, из-за чего VoiceOver не отличает кнопку от статического текста. - Не обрабатывают dynamic type — шрифты не масштабируются, и текст обрезается.
- Игнорируют порядок фокуса на экранах с кастомной анимацией или overlay.
Избегая этих ошибок, вы делаете приложение доступным для миллионов пользователей.







