Accessibility (a11y) — تأمین دسترسپذیری برنامه موبایل برای افراد دارای معلولیت. شامل پشتیبانی از صفحهخوانها (VoiceOver در iOS، TalkBack در Android)، مقیاسبندی متن (Dynamic Type)، کنتراست کافی رنگ (WCAG 2.1 سطح AA)، ناوبری بدون بینایی و جایگزینهای حرکات. طبق دادههای سازمان بهداشت جهانی (2023)، بیش از 1.3 میلیارد نفر (16٪ جمعیت) با نوعی معلولیت زندگی میکنند — accessibility یک گزینه نیست، یک ضرورت است. بیشتر — در مستندات رسمی اپل درباره accessibility.
نکات اصلی
Accessibility (به اختصار a11y — 11 حرف بین «a» و «y») — روش توسعه برنامههایی که برای افراد دارای اختلالات بینایی، شنوایی، حرکتی و ویژگیهای شناختی قابل دسترس هستند. در توسعه موبایل، accessibility چهار سناریوی اصلی را پوشش میدهد: کاربران نابینا (صفحهخوانها)، کمبینایان (مقیاسبندی، کنتراست)، ناشنوایان و کمشنوایان (زیرنویسها، جایگزینهای بصری برای صدا)، کاربران با محدودیت حرکتی (کنترل صوتی، Switch Control، ناحیه لمس بزرگ).
الزامات قانونی — در بسیاری از کشورها accessibility از نظر قانونی الزامی است. ایالات متحده: Section 508 و ADA. اتحادیه اروپا: European Accessibility Act (2025). بریتانیا: Equality Act 2010. بدون پشتیبانی accessibility، برنامه میتواند هدف دعوی قضایی قرار گیرد — در ایالات متحده در سال 2023 بیش از 4000 دعوی درباره عدم دسترسپذیری محصولات دیجیتال ثبت شده است. اپل و گوگل هنگام بررسی برنامهها accessibility را بررسی میکنند: App Store Review Guidelines (4.2) و Google Play Store حداقل پشتیبانی از دسترسپذیری را الزامی میدانند.
استدلال تجاری — دسترسپذیری مخاطب را افزایش میدهد. طبق Return on Disability (2021)، افراد دارای معلولیت سالانه 13 تریلیون دلار درآمد قابل تصرف کنترل میکنند. برنامههای قابل دسترس همچنین در جستجو رتبهبندی بهتری دارند (HTML معنایی، متون جایگزین)، رتبه کاربری بالاتری دارند و نظرات کمتری درباره مشکلات UX دریافت میکنند. در IT Sectr ما accessibility را در definition of done همه پروژهها قرار میدهیم — این یک استاندارد کیفیت است، نه یک بهبود اختیاری.
VoiceOver — صفحهخوان اپل، تعبیه شده در iOS، iPadOS و macOS. کاربر انگشت خود را روی صفحه میکشد، VoiceOver نام عنصر زیر انگشت را میخواند. ضربه دو بار — فعالسازی عنصر. VoiceOver بیش از 40 حرکت را پشتیبانی میکند: سه انگشت کشیدن (مرور)، دو انگشت ضربه دو بار (توقف)، حرکت Z (بازگشت). توسعهدهنده از طریق پروتکل UIAccessibility و ویژگیهای accessibilityLabel، accessibilityTraits، accessibilityHint کنترل میکند که VoiceOver چه چیزی و چگونه بخواند.
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 هستند. برای 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 — صفحهخوان گوگل، پیشنصب شده در اکثر دستگاههای 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 — برنامه رایگان از گوگل برای تست دسترسپذیری برنامههای Android بدون دسترسی به کد منبع. اسکنر بررسی میکند: کنتراست متن، اندازه مناطق لمسی (حداقل 48×48dp طبق Android Accessibility Guidelines)، وجود contentDescription برای ImageView، صحت سلسلهمراتب عناصر. برای تستهای خودکار از AccessibilityChecks از Espresso استفاده کنید — آنها با CI/CD ادغام میشوند و در هر build accessibility را بررسی میکنند.
WCAG 2.1 (Web Content Accessibility Guidelines) — استاندارد بینالمللی دسترسپذیری توسعهیافته توسط W3C. نسخه 2.1 (2018) شامل 13 معیار اضافی برای برنامههای موبایل است. سطوح انطباق: A (حداقلی)، AA (اجباری برای اکثر سازمانها)، AAA (حداکثری). اپل و گوگل سطح 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) استفاده کنید. اپل توصیه میکند همه صفحههای برنامه را با VoiceOver روشن تست کنید.
تست Android — Accessibility Scanner (Play Store) کنتراست، اندازه مناطق لمسی، contentDescription را بررسی میکند. برای خودکارسازی: Espresso AccessibilityChecks (import: androidTestImplementation 'androidx.test.espresso:espresso-accessibility:3.5.1'). گوگل چکلیست زیر را توصیه میکند: هر 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 — صفحهخوان اپل برای iOS، iPadOS، macOS. از حرکات یک و چند انگشتی استفاده میکند (کشیدن، ضربه دو بار). TalkBack — معادل گوگل برای 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 برای بزرگ. کنتراست را در دو تم (روشن/تاریک) بررسی کنید. نقض کنتراست — رایجترین مشکل دسترسپذیری در برنامههای موبایل طبق دادههای گوگل.
بله، اپل 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید