Accessibility (a11y) — осигуряване на достъпност на мобилното приложение за хора с увреждания. Включва поддръжка на екранни четци (VoiceOver на iOS, TalkBack на Android), мащабиране на текст (Dynamic Type), достатъчен цветови контраст (WCAG 2.1 ниво AA), навигация без зрение и алтернативи на жестове. По данни на СЗО (2023) над 1,3 милиарда души (16% от населението) живеят с някаква форма на увреждане — достъпността не е опция, а необходимост. Повече — в официалната документация на Apple за достъпност.
Основни точки
Accessibility (съкратено a11y — 11 букви между «a» и «y») — практика за разработване на приложения, достъпни за хора с увреждания на зрението, слуха, моториката и когнитивни особености. В мобилната разработка достъпността обхваща четири основни сценария: незрящи потребители (екранни четци), слабовиждащи (мащабиране, контраст), глухи и с увреден слух (субтитри, визуални алтернативи на звук), потребители с ограничена моторика (гласово управление, Switch Control, голяма сензорна област).
Правни изисквания — в много страни достъпността е задължителна по закон. САЩ: Section 508 и ADA. ЕС: European Accessibility Act (2025). Обединеното кралство: Equality Act 2010. Без поддръжка на достъпност, приложението може да стане обект на съдебен иск — в САЩ през 2023 г. са подадени над 4000 иска за недостъпност на цифрови продукти. Apple и Google проверяват достъпността при модериране на приложения: App Store Review Guidelines (4.2) и Google Play Store изискват минимална поддръжка на достъпност.
Бизнес аргумент — достъпността увеличава аудиторията. Според Return on Disability (2021) хората с увреждания контролират 13 трилиона долара разполагаем доход годишно. Достъпните приложения също се класират по-добре в търсенето (семантичен HTML, алтернативни текстове), имат по-висок потребителски рейтинг и по-малко отзиви за проблеми с UX. В IT Sectr включваме достъпността в 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 предоставя модификатори за достъпност: .accessibilityLabel(), .accessibilityHint(), .accessibilityAddTraits(), .accessibilitySortPriority(). По подразбиране всички стандартни SwiftUI елементи (Text, Button, Image) вече са елементи за достъпност с автоматични етикети. За персонализирани 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 приложения без достъп до изходния код. Скенерът проверява: контраст на текста, размер на сензорните области (минимум 48×48dp според Android Accessibility Guidelines), наличие на contentDescription за ImageView, правилност на йерархията на елементите. За автоматизирани тестове използвайте AccessibilityChecks от Espresso — те се интегрират в CI/CD и проверяват достъпността при всяко билдване.
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 Контраст (не-текст) | 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) проверява контраст, размер на сензорните области, contentDescription. За автоматизация: Espresso AccessibilityChecks (import: 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) сензорни области ≥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) включва критерии за мобилни приложения: контраст, размер на сензорните области (44×44pt), поддръжка на екранни четци, алтернативи на жестове, субтитри. Ниво AA — минималният стандарт за публикуване в App Store и Google Play.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също