Accessibility — مبانی، VoiceOver و TalkBack برای کاربران نابینا

نویسنده: IT Sectr منتشر شده: 2026-02-26 زمان مطالعه: 9 دقیقه

Accessibility (a11y) — تأمین دسترس‌پذیری برنامه موبایل برای افراد دارای معلولیت. شامل پشتیبانی از صفحه‌خوان‌ها (VoiceOver در iOS، TalkBack در Android)، مقیاس‌بندی متن (Dynamic Type)، کنتراست کافی رنگ (WCAG 2.1 سطح AA)، ناوبری بدون بینایی و جایگزین‌های حرکات. طبق داده‌های سازمان بهداشت جهانی (2023)، بیش از 1.3 میلیارد نفر (16٪ جمعیت) با نوعی معلولیت زندگی می‌کنند — accessibility یک گزینه نیست، یک ضرورت است. بیشتر — در مستندات رسمی اپل درباره accessibility.

نکات اصلی

  • Accessibility — دسترس‌پذیری برنامه برای افراد دارای معلولیت (بینایی، شنوایی، حرکتی)
  • VoiceOver — صفحه‌خوان اپل که عناصر رابط را در iOS و macOS با صدا می‌خواند
  • TalkBack — صفحه‌خوان گوگل برای Android با کنترل حرکتی بدون بینایی
  • WCAG 2.1 — استاندارد بین‌المللی دسترس‌پذیری: کنتراست 4.5:1، اندازه مناطق لمسی 44×44pt
  • contentDescription — ویژگی Android برای توصیف عناصر خوانده شده توسط TalkBack

Accessibility (a11y) در برنامه‌های موبایل چیست؟

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 همه پروژه‌ها قرار می‌دهیم — این یک استاندارد کیفیت است، نه یک بهبود اختیاری.

Accessibility در iOS: VoiceOver و UIAccessibility

VoiceOver — صفحه‌خوان اپل، تعبیه شده در iOS، iPadOS و macOS. کاربر انگشت خود را روی صفحه می‌کشد، VoiceOver نام عنصر زیر انگشت را می‌خواند. ضربه دو بار — فعال‌سازی عنصر. VoiceOver بیش از 40 حرکت را پشتیبانی می‌کند: سه انگشت کشیدن (مرور)، دو انگشت ضربه دو بار (توقف)، حرکت Z (بازگشت). توسعه‌دهنده از طریق پروتکل UIAccessibility و ویژگی‌های accessibilityLabel، accessibilityTraits، accessibilityHint کنترل می‌کند که VoiceOver چه چیزی و چگونه بخواند.

swift
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 یعنی برنامه را برای کاربران کم‌بینا غیرقابل دسترس کردن.

Accessibility در SwiftUI

SwiftUI اصلاح‌کننده‌هایی برای accessibility ارائه می‌دهد: .accessibilityLabel()، .accessibilityHint()، .accessibilityAddTraits()، .accessibilitySortPriority(). به‌طور پیش‌فرض، همه عناصر استاندارد SwiftUI (Text، Button، Image) با برچسب‌های خودکار عناصر accessibility هستند. برای Viewهای سفارشی از .accessibilityElement(children: .combine) برای ترکیب عناصر فرزند در یکی استفاده کنید. SwiftUI به‌طور خودکار از Dynamic Type و VoiceOver پشتیبانی می‌کند.

swift
VStack {
    Image(systemName: "trash")
        .accessibilityLabel(Text("حذف عنصر"))
    Text("سطل زباله")
        .font(.body)
}
.accessibilityElement(children: .combine)
.accessibilityAddTraits(.isButton)
.accessibilityHint(Text("عنصر انتخاب شده را بدون امکان بازیابی حذف می‌کند"))

Accessibility در Android: TalkBack و contentDescription

TalkBack — صفحه‌خوان گوگل، پیش‌نصب شده در اکثر دستگاه‌های Android (موجود در Google Play برای همه نسخه‌های Android 5+). TalkBack از همان حرکات VoiceOver استفاده می‌کند: کشیدن برای ناوبری، ضربه دو بار برای فعال‌سازی. توسعه‌دهنده توصیف عناصر را از طریق ویژگی android:contentDescription در XML یا از طریق setContentDescription() در کد تنظیم می‌کند. برای ImageView، contentDescription اجباری است — بدون آن TalkBack «برچسب‌گذاری نشده» اعلام می‌کند یا نام فایل را می‌خواند.

kotlin
// 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

Accessibility Scanner — برنامه رایگان از گوگل برای تست دسترس‌پذیری برنامه‌های Android بدون دسترسی به کد منبع. اسکنر بررسی می‌کند: کنتراست متن، اندازه مناطق لمسی (حداقل 48×48dp طبق Android Accessibility Guidelines)، وجود contentDescription برای ImageView، صحت سلسله‌مراتب عناصر. برای تست‌های خودکار از AccessibilityChecks از Espresso استفاده کنید — آنها با CI/CD ادغام می‌شوند و در هر build accessibility را بررسی می‌کنند.

WCAG 2.1: کنتراست، اندازه و مناطق لمسی

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 کنتراست (متن)AA4.5:1 برای معمولی، 3:1 برای بزرگ4.5:1 برای معمولی، 3:1 برای بزرگ
1.4.11 کنتراست (غیرمتن)AA3:1 برای آیکون‌ها، مرزها3:1 برای آیکون‌ها، مرزها
2.5.5 اندازه هدفAAA44×44pt48×48dp
2.3.3 انیمیشنAAAprefers-reduced-motionandroid:animateLayoutChanges
4.1.2 نام، نقش، مقدارAaccessibilityLabel, traitscontentDescription, 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 و TalkBack چیست؟

VoiceOver — صفحه‌خوان اپل برای iOS، iPadOS، macOS. از حرکات یک و چند انگشتی استفاده می‌کند (کشیدن، ضربه دو بار). TalkBack — معادل گوگل برای Android با حرکات مشابه. VoiceOver accessibilityLabel را می‌خواند، TalkBack — contentDescription را. هر دو از نمایشگرهای بریل و کنترل صوتی پشتیبانی می‌کنند. تفاوت اساسی در عملکرد وجود ندارد.

contentDescription در Android چیست؟

contentDescription — ویژگی View در Android که توضیح متنی را برای TalkBack تنظیم می‌کند. بدون آن TalkBack «برچسب‌گذاری نشده» اعلام می‌کند یا نام کلاس را می‌خواند (ImageView، Button). از طریق android:contentDescription="@string/desc" در XML یا view.contentDescription = "متن" در کد اضافه می‌شود. برای تصاویر تزئینی از contentDescription=@null استفاده کنید.

حداقل کنتراست برای accessibility چقدر است؟

طبق WCAG 2.1 سطح AA: 4.5:1 برای متن معمولی و 3:1 برای متن بزرگ (از 18pt یا 14pt bold). سطح AAA: 7:1 برای معمولی و 4.5:1 برای بزرگ. کنتراست را در دو تم (روشن/تاریک) بررسی کنید. نقض کنتراست — رایج‌ترین مشکل دسترس‌پذیری در برنامه‌های موبایل طبق داده‌های گوگل.

آیا باید Dynamic Type در iOS پشتیبانی شود؟

بله، اپل Dynamic Type را برای همه برنامه‌ها توصیه می‌کند. کاربر اندازه متن را در تنظیمات تعیین می‌کند. توسعه‌دهنده از UIFontMetrics.scaledFont استفاده می‌کند — فونت به‌طور خودکار مقیاس‌پذیر است. بدون Dynamic Type کاربران با بینایی ضعیف نمی‌توانند متن را بخوانند. iOS به‌طور خودکار Dynamic Type را هنگام بررسی در App Store بررسی می‌کند.

WCAG چیست؟

WCAG (Web Content Accessibility Guidelines) — استاندارد بین‌المللی دسترس‌پذیری محتوا از W3C. نسخه 2.1 (2018) شامل معیارهایی برای برنامه‌های موبایل است: کنتراست، اندازه مناطق لمسی (44×44pt)، پشتیبانی از صفحه‌خوان‌ها، جایگزین‌های حرکات، زیرنویس‌ها. سطح AA — حداقل استاندارد برای انتشار در App Store و Google Play.

خلاصه

  • Accessibility — دسترس‌پذیری برنامه‌ها برای 1.3 میلیارد نفر دارای معلولیت (WHO، 2023)
  • VoiceOver (iOS) و TalkBack (Android) — صفحه‌خوان‌ها برای کاربران نابینا
  • UIAccessibility — پروتکل iOS برای تنظیم label، hint، traits عناصر accessibility
  • contentDescription — ویژگی Android برای توصیف عناصر برای TalkBack
  • WCAG 2.1 — کنتراست 4.5:1، مناطق لمسی 44×44pt، پشتیبانی Dynamic Type
  • Dynamic Type — مقیاس‌بندی متن در iOS از طریق UIFontMetrics.scaledFont
  • تست — Accessibility Inspector (iOS)، Accessibility Scanner (Android)، Espresso Checks

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید