Реализация поддержки Switch Control в мобильном приложении
Switch Control (iOS) и Switch Access (Android) — технологии управления устройством через внешний переключатель: кнопка, педаль, датчик дыхания. Используется людьми с ограниченной моторикой, которые не могут взаимодействовать с сенсорным экраном.
Механика: система последовательно подсвечивает элементы интерфейса (сканирование); пользователь активирует переключатель в нужный момент. Второй переключатель — или выбор нужного элемента, или вход в подменю действий.
Что нужно для поддержки
iOS — Switch Control
Switch Control использует тот же accessibility tree, что и VoiceOver. Если VoiceOver работает корректно — Switch Control в большинстве случаев тоже. Но есть нюансы.
Группировка элементов. При сканировании система сначала подсвечивает группы (контейнеры), потом входит внутрь. Если карточка товара не сгруппирована как единый элемент — Switch Control последовательно проходит каждый subview: изображение, название, цену, кнопку. Слишком много шагов для одного действия.
accessibilityElements на контейнере + accessibilityActivate() override для кастомного действия по активации — уменьшают количество шагов сканирования.
Кастомные жесты. Свайп по карточке для удаления — стандартный 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 для нестандартных операций.
Тестирование без реального пользователя
На 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 = выбрать.
Полное тестирование требует реального устройства — эмулятор не поддерживает Switch Control/Access в полном объёме.
Сколько это занимает
Если VoiceOver/TalkBack уже реализованы — Switch Control в большинстве случаев работает автоматически. Основная работа — добавить UIAccessibilityCustomAction/AccessibilityActionCompat для жестовых действий и проверить порядок сканирования. 2-3 дня. Если accessibility tree не проработан — нужно начинать с VoiceOver/TalkBack аудита.







