Реализация поддержки Switch Control в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация поддержки Switch Control в мобильном приложении
Средний
~2-3 дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    871
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    755
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1178
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1051
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    978
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    574

Реализация поддержки Switch Control в мобильном приложении

Пользователь с ограниченной моторикой не может сделать свайп по карусели товаров в вашем приложении. Система сканирования Switch Control на iOS или Switch Access на Android проходит каждый элемент по очереди, но если карточка не сгруппирована, пользователь вынужден активировать переключатель десятки раз, чтобы просто посмотреть описание. По данным ВОЗ, более 1 миллиарда человек в мире имеют инвалидность. Игнорирование Switch Control может отсечь до 15% потенциальной аудитории. Правильная настройка сокращает количество шагов сканирования в 3–4 раза по сравнению с неоптимизированным интерфейсом. Наша команда имеет 5+ лет опыта в разработке доступных мобильных приложений для iOS и Android, реализовала поддержку Switch Control/Access для более чем 30 проектов в сферах e-commerce, fintech и здравоохранения.

Как правильно подготовить интерфейс для Switch Control?

iOS — Switch Control

Switch Control использует тот же accessibility tree, что и VoiceOver. Если VoiceOver работает корректно — Switch Control в большинстве случаев тоже. Но есть нюансы.

Группировка элементов. При сканировании система сначала подсвечивает группы (контейнеры), потом входит внутрь. Если карточка товара не сгруппирована как единый элемент — Switch Control последовательно проходит каждый subview: изображение, название, цену, кнопку. Это увеличивает количество шагов на 50–70%, что сильно замедляет пользователя.

Решение: accessibilityElements на контейнере + accessibilityActivate() override для кастомного действия по активации. Такая группировка сокращает время сканирования в 2–3 раза.

Кастомные жесты. Свайп по карточке для удаления — стандартный UIKit UISwipeGestureRecognizer Switch Control не вызовет. Нужно добавить UIAccessibilityCustomAction:

let deleteAction = UIAccessibilityCustomAction(
    name: "Удалить",
    target: self,
    selector: #selector(deleteItem)
)
accessibilityCustomActions = [deleteAction]

Custom Actions появляются в меню Switch Control при активации элемента.

Scanning style. По умолчанию — автосканирование (элементы подсвечиваются автоматически). Пользователь может включить ручное сканирование. Убедиться, что фокус не «застревает» в бесконечном цикле внутри одного контейнера.

Android — Switch Access

Switch Access настраивается через Settings → Accessibility → Switch Access. Два основных режима: Linear Scanning (последовательный обход) и Row-Column Scanning (сначала строки, потом столбцы).

android:focusable="true" и корректные android:nextFocusDown/Up/Left/Right — определяют порядок навигации. Без явных nextFocus атрибутов система строит порядок по позиции на экране — может быть нелогичным для сложных layout.

В Compose: Modifier.focusRequester() и Modifier.focusOrder { down = nextFocusRequester } — программный контроль порядка фокуса для Switch Access.

Кастомные действия аналогично iOS: ViewCompat.setAccessibilityDelegate с переопределением onInitializeAccessibilityNodeInfo — добавляем AccessibilityActionCompat для нестандартных операций.

Почему тестирование на реальном устройстве критично?

Эмуляторы не поддерживают Switch Control/Access в полном объёме. На iOS: Settings → Accessibility → Switch Control → Add New Switch → Screen → Full Screen. Теперь тап по экрану = активация переключателя. Можно проверить поток сканирования самостоятельно.

На Android: Settings → Accessibility → Switch Access → Use Volume Keys as Switches. Volume Up = переключиться к следующему элементу, Volume Down = выбрать.

Однако эмуляция не заменяет реальный сценарий: различная скорость сканирования, поведение при групповых действиях, работа с динамическим контентом. Поэтому мы в обязательном порядке тестируем на физических устройствах (iPhone, iPad, Galaxy, Pixel) с разными версиями ОС.

Что даёт группировка элементов для пользователя?

Группировка через accessibilityElements (iOS) или nextFocus* (Android) уменьшает количество шагов сканирования в 2–3 раза. Например, карточка товара из шести subview без группировки требует 12 активаций, а с группировкой — всего 4. Пользователь тратит на навигацию в три раза меньше времени — это критично при длительном использовании.

Сравнение iOS и Android для Switch Control

Параметр iOS (Switch Control) Android (Switch Access)
Базовая настройка Использует тот же accessibility tree, что VoiceOver Требует явных nextFocus атрибутов
Кастомные действия UIAccessibilityCustomAction AccessibilityActionCompat
Группировка accessibilityElements + accessibilityActivate() focusable="true" + nextFocus*
Время внедрения (при готовом VoiceOver/TalkBack) 1-2 дня 2-3 дня
Сложность отладки Низкая (инструменты Inspector) Средняя (Layout Inspector + switchLog)

Типичные ошибки и их последствия

Ошибка Последствие Решение
Отсутствие группировки Сканирование 50+ шагов на экране Группировка через accessibilityElements или nextFocus
Игнорирование кастомных жестов Невозможность выполнить свайп UIAccessibilityCustomAction / AccessibilityActionCompat
Неправильный порядок навигации после модалки Зацикливание фокуса Тестирование всех переходов
Только эмулятор Пропуск багов реального устройства Обязательное тестирование на физике

Сколько времени занимает реализация?

Если VoiceOver/TalkBack уже реализованы — Switch Control в большинстве случаев работает автоматически. Основная работа — добавить UIAccessibilityCustomAction/AccessibilityActionCompat для жестовых действий и проверить порядок сканирования. Оценка: 2-3 дня. Если accessibility tree не проработан — нужно начинать с VoiceOver/TalkBack аудита (1-2 недели в зависимости от сложности приложения). Стоимость рассчитывается индивидуально после предварительной оценки объёма работ. Закажите бесплатный аудит accessibility вашего приложения — получите отчёт с рекомендациями за 2 дня. Свяжитесь с нами для консультации.

Подробнее о Switch Control и Switch Access.

Доступность мобильных приложений: VoiceOver, TalkBack и WCAG на практике

Приложение отклонили в App Store по гайдлайну 1.1, или пришёл запрос от корпоративного клиента с требованием WCAG 2.1 AA — обе ситуации означают одно: accessibility не был заложен в архитектуру с самого начала, а теперь его нужно встраивать в готовый продукт. Это больно.

Почему «добавить доступность потом» не работает

Самая частая проблема — разработчики воспринимают VoiceOver и TalkBack как косметику. Расставили accessibilityLabel, запустили Screen Reader и удивились, почему фокус прыгает с кнопки «Купить» на декоративную иконку в углу.

На iOS ошибка живёт в неправильной группировке элементов. Если UIStackView содержит иконку + текст + цену, VoiceOver будет читать их как три отдельных элемента вместо одного. Решение — isAccessibilityElement = false на контейнере + accessibilityElements с нужным порядком, либо shouldGroupAccessibilityChildren = true. Кажется мелочью, но именно это делает разницу между «формально работает» и «слепой пользователь может купить товар за 30 секунд».

На Android ситуация зеркальная: contentDescription ставят везде, включая ImageView, которые несут только декоративную функцию. TalkBack начинает зачитывать «иконка стрелка» между каждым значимым элементом. Правильно — android:importantForAccessibility="no" для декора и явные contentDescription только там, где это несёт смысл.

Dynamic Type и масштабирование шрифтов

iOS Dynamic Type ломает верстку предсказуемо: фиксированные высоты строк в UILabel, захардкоженные frame в Auto Layout, numberOfLines = 1 без adjustsFontSizeToFitWidth. Когда пользователь ставит размер шрифта XXL в настройках, текст обрезается или перекрывает соседние элементы.

Правильная реализация использует .font = UIFont.preferredFont(forTextStyle: .body) с adjustsFontForContentSizeCategory = true и numberOfLines = 0 везде, где контент динамический. В SwiftUI это работает из коробки через .dynamicTypeSize() modifier.

На стороне Flutter эквивалент — textScaleFactor через MediaQuery. Компоненты Material 3 поддерживают масштабирование нативно, но кастомные виджеты требуют явного учёта.

WCAG 2.1 в мобильном контексте

Мобильные приложения формально не обязаны следовать WCAG (он писался для веба), но WCAG 2.1 + дополнения WCAG для мобильных стали де-факто стандартом при корпоративных тендерах и госзакупках.

Критичные критерии применительно к мобилу:

  • 1.4.3 Contrast Minimum — соотношение контраста текста к фону минимум 4.5:1. Проверяем через Xcode Accessibility Inspector или Android Studio Layout Inspector
  • 2.4.7 Focus Visible — при работе с внешней клавиатурой на iPad/Android планшете фокус должен быть виден. Часто забытый сценарий
  • 2.5.8 Target Size (AA) — минимум 24x24dp для интерактивных элементов, рекомендуется 44pt/48dp
  • 4.1.3 Status Messages — уведомления об ошибках форм должны озвучиваться через UIAccessibility.post(notification: .announcement) или AccessibilityNodeInfo.RoleDescription на Android

Как строим процесс

Аудит начинается с Accessibility Inspector в Xcode и TalkBack developer settings на Android — проходим все экраны со Screen Reader включённым и фиксируем каждый случай, когда требуется более 3 действий для выполнения целевой операции.

Дальше — автоматизированные проверки. XCUITest поддерживает accessibility assertions; для Android используем Accessibility Test Framework (ATF), который встроен в Espresso. Это ловит регрессии на CI.

Финальный этап — тестирование с реальными пользователями, использующими вспомогательные технологии. Никакой автоматизацией это не заменить.

Инструмент Платформа Что проверяет
Xcode Accessibility Inspector iOS/macOS Метки, контраст, порядок фокуса
Android Accessibility Scanner Android Контраст, размеры touch targets
Deque axe DevTools Cross-platform WCAG-соответствие
VoiceOver (iOS) iOS Навигация через Screen Reader
TalkBack (Android) Android Навигация через Screen Reader

Сроки

Аудит и базовое исправление существующего приложения — от 2 до 5 недель в зависимости от числа экранов и глубины проблем. Внедрение accessibility с нуля в новый проект практически не влияет на сроки при правильном дизайне компонентной системы — закладываем 10-15% overhead на разработку UI-слоя.