Reachability: این چیست، کتابخانه بررسی دسترسی شبکه

نویسنده: IT Sectr منتشر شده: 2026-03-11 زمان مطالعه: 10 دقیقه

Reachability — کتابخانه‌ای برای iOS و macOS است که بر پایه فریم‌ورک SystemConfiguration ساخته شده و به شما امکان بررسی دسترسی اتصال اینترنت و پیگیری تغییرات آن را می‌دهد. به استناد به Apple Developer Documentation (2025)، Reachability از SCNetworkReachability برای نمایش ناهمزمان شبکه استفاده می‌کند. کتابخانه Reachability تا ظاهور NWPathMonitor اصلی، برای مدت‌ها استاندارد پروژه‌های iOS بود.

نکات کلیدی

  • Reachability — پیچونده‌ای بر روی فریم‌ورک SystemConfiguration برای نمایش دسترسی شبکه در iOS و macOS.
  • SCNetworkReachability — C-API سطح پایین که دسترسی میزان یا آدرس را بررسی می‌کند.
  • انواع اتصال — Reachability برای سازگاری رفتار برنامه، Wi-Fi و داده موبایل (WWAN) را تمایز می‌دهد.
  • اعلام‌ها — از طریق SCNetworkReachabilitySetCallback، کتابخانه تغییرات شبکه را با RunLoop مشترک می‌شود.
  • NWPathMonitor — جایگزین مدرن Reachability، از iOS 12 قابل دسترس و توصیه‌شده توسط Apple.

Reachability چیست؟

Reachability — یک کتابخانه نمونه از Apple است که استفاده از فریم‌ورک SystemConfiguration برای نمایش شبکه را نشان می‌دهد. کد منبع در Apple Developer Documentation به عنوان یک نمونه منتشر شده است، اما جامعه آن را به عنوان ابزار استاندارد بررسی اتصال در پروژه‌های iOS پذیرفته است.

این کتابخانه بر اساس SCNetworkReachability — تابع C از SystemConfiguration که دسترسی میزان یا آدرس IP را بررسی می‌کند — کار می‌کند. هنگام ایجاد Reachability، یا نام میزان (مثل google.com) یا آدرس IP مشخص می‌شود و کتابخانه به صورت ناهمزمان بررسی می‌کند که آیا این میزان از طریق رابط‌های شبکه فعلی دسترس است.

محبوبیت Reachability به دلیل سادگی آن است: کافیست یک اینستانس ایجاد کرده، از طریق NotificationCenter در اعلام‌ها مشترک شوید و به kReachabilityChangedNotification گوش دهید. در پاسخ، برنامه وضعیت را دریافت می‌کند: NotReachable، ReachableViaWiFi یا ReachableViaWWAN (داده موبایل).

تاریخچه و وضعیت کتابخانه

Reachability ابتدا در iPhone OS 2 (2008) همراه با فریم‌ورک SystemConfiguration منتشر شد. به مدت یک دهه، آن تنها روش اصلی نمایش شبکه در iOS بود. با عرضه iOS 12 و فریم‌ورک Network، Apple NWPathMonitor را به عنوان جایگزین توصیه می‌کند، اما Reachability هنوز پشتیبانی می‌شود.

بسیاری از پیچونده‌های شخص ثالث — AFNetworking، Alamofire، AshleyDodd/Reachability.swift — از مکانیسم داخلی SCNetworkReachability استفاده می‌کنند. این کتابخانه‌ها رابط راحت Swift/Objective-C، ذخیره‌سازی وضعیت و callbackهای thread-safe اضافه می‌کنند، همان پایه SystemConfiguration را حفظ می‌کنند.

Reachability در پشتصحنه چگونه کار می‌کند

مکانیسم اصلی Reachability — تابع SCNetworkReachabilityCreateWithName است که یک شیئِ پیگیری برای میزان مشخص ایجاد می‌کند. سپس SCNetworkReachabilityGetFlags فراخوانده می‌شود — یک بررسی همزمان که ماسک بیتی SCNetworkReachabilityFlags را با وضعیت فعلی شبکه بازمی‌گرداند.

برای نمایش ناهمزمان، از SCNetworkReachabilitySetCallback استفاده می‌شود که یک تابع بازگشت C را ثبت می‌کند. Callback در RunLoop فعلی انجام می‌شود زمانی که وضعیت دسترسی میزان تغییر کند. Reachability این C-callback را در یک متد Objective-C می‌پیچد و از طریق NotificationCenter اعلامی ارسال می‌کند.

swift
import SystemConfiguration

class Reachability {
    private var reachabilityRef: SCNetworkReachability?

    init?(hostname: String) {
        reachabilityRef = SCNetworkReachabilityCreateWithName(
            nil, hostname
        )
    }

    func checkReachability() -> Bool {
        var flags = SCNetworkReachabilityFlags()
        SCNetworkReachabilityGetFlags(
            reachabilityRef!, &flags
        )
        return isReachable(with: flags)
    }

    private func isReachable(with flags: SCNetworkReachabilityFlags) -> Bool {
        let reachable = flags.contains(.reachable)
        let connectionRequired = flags.contains(.connectionRequired)
        return reachable && !connectionRequired
    }
}

فلگ‌های دسترسی شبکه

SCNetworkReachabilityFlags — ماسک بیتی است که وضعیت شبکه را کدگذاری می‌کند. فلگ kSCNetworkReachabilityFlagsReachable نشان می‌دهد که میزان دسترس است. kSCNetworkReachabilityFlagsConnectionRequired — برای اتصال، برقراری ارتباط لازم است. ترکیب فلگ‌ها مشخص می‌کند که آیا برنامه می‌تواند داده ارسال کند.

فلگ‌های اضافی: kSCNetworkReachabilityFlagsIsWWAN — اتصال از طریق شبکه موبایل (iOS)، kSCNetworkReachabilityFlagsInterventionRequired — نیاز به ورود کاربر (مثلا برای VPN). Reachability این فلگ‌ها را برای تعیین نوع رابط در نظر می‌گیرد.

مصالیه استفاده از Reachability

الگوی استاندارد استفاده از Reachability در یک برنامه iOS شامل ایجاد یک اینستانس، مشترک شدن در اعلام‌ها و واکنش به تغییر وضعیت است. مثال زیر ادغام با NotificationCenter را برای به‌روزرسانی UI در زمان تغییر شبکه نشان می‌دهد.

swift
import Reachability
import UIKit

class ViewController: UIViewController {
    var reachability: Reachability?

    override func viewDidLoad() {
        super.viewDidLoad()
        reachability = Reachability(hostname: "google.com")
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(reachabilityChanged),
            name: .reachabilityChanged,
            object: nil
        )
        reachability?.startNotifier()
    }

    @objc func reachabilityChanged(notification: Notification) {
        if let reachability = notification.object as? Reachability {
            switch reachability.connection {
            case .wifi:
                print("متصل شد از طریق Wi-Fi")
            case .cellular:
                print("متصل شد از طریق شبکه موبایل")
            case .unavailable:
                print("بدون اتصال")
            }
        }
    }
}

بررسی شبکه قبل از درخواست

قبل از اجرای درخواست HTTP، می‌توان دسترسی شبکه را به صورت همزمان بررسی کرد: reachability.connection != .unavailable. این موفقیت درخواست را تضمین نمی‌کند (سرور ممکن است دسترس نباشد)، اما از درخواست‌های محکوم به شکست جلوگیری می‌کند و UX را بهبود می‌بخشد — برنامه در حالت آفلاین اسپینر نشان نمی‌دهد.

برای بررسی دقیق‌تر، Reachability را با مهل‌های URLSession ترکیب کنید. اگر Reachability دسترسی را نشان می‌دهد اما درخواست در مهل اجرا نمی‌شود — احتمالا مشکل از طرف سرور یا پرتال کپتیو است. در این صورت، می‌توان به کاربر پیامی درباره دسترس نبودن سرور نشان داد.

انواع اتصالات در Reachability

Reachability سه وضعیت اصلی اتصال را تمایز می‌دهد: Wi-Fi، داده موبایل (WWAN) و عدم دسترسی. WWAN همه انواع ارتباط موبایل را شامل می‌شود — 2G، 3G، 4G/LTE، 5G. کتابخانه داخل WWAN جزئیاتی ارائه نمی‌دهد، بنابراین برای تمایز 4G و 5G به CoreTelephony نیاز است.

وضعیتفلگ SCNetworkتوضیح
ReachableViaWiFiReachable + !IsWWANاتصال از طریق شبکه Wi-Fi با دسترسی به میزان
ReachableViaWWANReachable + IsWWANاتصال از طریق شبکه موبایل (2G-5G)
NotReachable!Reachableمیزان از طریق هیچ رابطی دسترس نیست
ConnectionRequiredReachable + ConnectionRequiredبرقراری اتصال مورد نیاز است (VPN، PPPoE)

محدودیت‌های Reachability بر اساس نوع شبکه

Reachability Ethernet، تنول‌های VPN یا اتصالات multipath را تمایز نمی‌دهد — تمام رابط‌های غیر WWAN به عنوان Wi-Fi طبقه‌بندی می‌شوند. این محدودیت ناشی از معماری SystemConfiguration است که اطلاعات جزئی درباره رابط‌های شبکه فراتر از طبقه‌بندی اساسی ارائه نمی‌دهد.

برای تعیین نوع مشخص ارتباط موبایل (4G vs 5G)، CTTelephonyNetworkInfo از CoreTelephony مورد نیاز است. ترکیب Reachability با CoreTelephony به برنامه امکان انتخاب کیفیت محتوا را می‌دهد: در 5G پخش 4K، در 4G/LTE HD، در 3G SD یا تنها صوت.

مهاجرت از Reachability به NWPathMonitor

Apple توصیه می‌کند در تمام پروژه‌های جدید، از iOS 12 به بعد، Reachability را با NWPathMonitor جایگزین کنید. دلیل اصلی این است که NWPathMonitor بخشی از فریم‌ورک مدرن Network است، به Swift نوشته شده، Combine را پشتیبانی می‌کند و اطلاعات جزئی درباره مسیر شبکه بدون نیاز به سازگاری با C ارائه می‌دهد.

فرایند مهاجرت شامل جایگزینی SCNetworkReachability با NWPathMonitor، انتقال از NotificationCenter به pathUpdateHandler closure یا Combine publisher است. الگوریتم و منطق پردازش وضعیت شبکه ثابت می‌ماند — تنها API نمایش تغییر می‌کند.

swift
protocol NetworkMonitorProtocol {
    var isReachable: Bool { get }
    var connectionType: ConnectionType { get }
    func startMonitoring()
    func stopMonitoring()
}

enum ConnectionType {
    case wifi, cellular, ethernet, unavailable
}

// پیاده‌سازی مدرن با استفاده از NWPathMonitor
class ModernNetworkMonitor: NetworkMonitorProtocol {
    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue("Network")
    private var currentPath: NWPath?

    var isReachable: Bool {
        currentPath?.status == .satisfied
    }

    func startMonitoring() {
        monitor.pathUpdateHandler = { [weak self] path in
            self?.currentPath = path
        }
        monitor.start(on: queue)
    }

    func stopMonitoring() {
        monitor.cancel()
    }
}

توصیه‌های مهاجرت

برای پروژه‌هایی که از iOS 12+ پشتیبانی می‌کنند، Reachability را کاملاً با NWPathMonitor جایگزین کنید. برای پروژه‌هایی که iOS 11 را پشتیبانی می‌کنند، از کامپایل شرطی #available(iOS 12, *) با NWPathMonitor و Reachability به عنوان fallback استفاده کنید. این امکان را می‌دهد بدون از دست دادن پشتیبانی دستگاه‌های قدیمی، به تدریج مهاجرت کنید.

مزیت اصلی مهاجرت جزئیات مسیر شبکه است. NWPathMonitor فقط گزارش „دسترس/غیرقابل دسترس” نمی‌دهد، بلکه نوع هر رابط، هزینه‌های آن، اولویت، پشتیبانی از proxy و VPN را نیز مشخص می‌کند. این به توسعه‌دهنده داده‌های بیشتری برای سازگاری رفتار برنامه با شرایط فعلی شبکه می‌دهد.

سوالات متداول

حداقل نسخه iOS پشتیبانی کننده Reachability چیست؟

Reachability بر پایه SCNetworkReachability از iPhone OS 2 (iOS 2) در دسترس است. این کتابخانه در تمام نسخه‌های iOS، از جمله نسخه‌های فعلی، کار می‌کند. محدودیت‌ها مربوط به نسخه سیستم‌عامل نیست، بلکه به جزئیات اطلاعات است — در نسخه‌های قدیمی تمایز 4G و 5G وجود ندارد.

تفاوت Reachability با یک بررسی ساده ping چیست؟

Reachability از SCNetworkReachability — یک خدمت سیستمی که دسترسی میزان را در سطح پیش‌خان شبکه بدون ارسال بسته ارزیابی می‌کند — استفاده می‌کند. Ping بسته‌های ICMP ارسال می‌کند و ترافیک مصرف می‌کند، همچنین ممکن است توسط دیوارآتش بلوک شود. Reachability برای بررسی مکرر سریع‌تر و ایمن‌تر است.

آیا می‌توان از Reachability در پروژه‌های SwiftUI استفاده کرد؟

بله، Reachability در SwiftUI از طریق ObservableObject یا Combine کار می‌کند. آن را در یک کلاس مشترک در NotificationCenter بپیچید و وضعیت را از طریق @Published منتشر کنید. برای پروژه‌های جدید SwiftUI، NWPathMonitor را با Combine publisher برای به‌روزرسانی واکنشی View توصیه می‌کنیم.

Reachability چگونه Wi-Fi را از داده موبایل تمایز می‌دهد؟

Reachability فلگ kSCNetworkReachabilityFlagsIsWWAN را در ماسک بیتی SCNetworkReachabilityFlags بررسی می‌کند. اگر فلگ تنظیم شده باشد — اتصال از طریق شبکه موبایل (WWAN)، در غیر این صورت و میزان Reachable است — از طریق Wi-Fi. این تنها راه تمایز انواع بدون CoreTelephony است.

چرا Reachability دسترسی را نشان می‌دهد اما درخواست‌ها کار نمی‌کنند؟

SCNetworkReachability دسترسی میزان را در سطح شبکه بررسی می‌کند، اما کارکرد پروتکل‌های سطح بالا را تضمین نمی‌کند. دلایل ممکن: پرتال کپتیو، بلوک DNS، پروکسی سرور یا فایروال. Reachability یک فیلتر اولیه است، اما جایگزین یک درخواست واقعی HTTP نیست.

نتیجه

  • Reachability — کتابخانه‌ای بر پایه SystemConfiguration برای نمایش شبکه iOS که از طریق SCNetworkReachability C-API کار می‌کند.
  • سه وضعیت — Wi-Fi، داده موبایل (WWAN) و عدم دسترسی — از طریق فلگ‌های بیتی SCNetworkReachabilityFlags تعیین می‌شوند.
  • اعلام‌های ناهمزمان از طریق SCNetworkReachabilitySetCallback با RunLoop و NotificationCenter اجرا می‌شوند.
  • محدودیت‌ها — Reachability 4G/5G، VPN، Ethernet را تمایز نمی‌دهد و اطلاعاتی درباره هزینه ترافیک نمی‌دهد.
  • NWPathMonitor — جایگزین مدرن Reachability برای iOS 12+، ارائه‌دهنده NWPath جزئی با نوع، هزینه‌ها و multipath.
  • مهاجرت شامل جایگزینی SCNetworkReachability با NWPathMonitor و حفظ منطق از طریق پروتکل NetworkMonitorProtocol است.
  • Reachability هنوز برای پروژه‌هایی که از iOS 11 و پایین‌تر پشتیبانی می‌کنند یا برای بررسی سریع همزمان مورد نیاز است.

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

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

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

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