Reachability — کتابخانهای برای iOS و macOS است که بر پایه فریمورک SystemConfiguration ساخته شده و به شما امکان بررسی دسترسی اتصال اینترنت و پیگیری تغییرات آن را میدهد. به استناد به Apple Developer Documentation (2025)، Reachability از SCNetworkReachability برای نمایش ناهمزمان شبکه استفاده میکند. کتابخانه Reachability تا ظاهور NWPathMonitor اصلی، برای مدتها استاندارد پروژههای iOS بود.
نکات کلیدی
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 — تابع SCNetworkReachabilityCreateWithName است که یک شیئِ پیگیری برای میزان مشخص ایجاد میکند. سپس SCNetworkReachabilityGetFlags فراخوانده میشود — یک بررسی همزمان که ماسک بیتی SCNetworkReachabilityFlags را با وضعیت فعلی شبکه بازمیگرداند.
برای نمایش ناهمزمان، از SCNetworkReachabilitySetCallback استفاده میشود که یک تابع بازگشت C را ثبت میکند. Callback در RunLoop فعلی انجام میشود زمانی که وضعیت دسترسی میزان تغییر کند. Reachability این C-callback را در یک متد Objective-C میپیچد و از طریق NotificationCenter اعلامی ارسال میکند.
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 در یک برنامه iOS شامل ایجاد یک اینستانس، مشترک شدن در اعلامها و واکنش به تغییر وضعیت است. مثال زیر ادغام با NotificationCenter را برای بهروزرسانی UI در زمان تغییر شبکه نشان میدهد.
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 سه وضعیت اصلی اتصال را تمایز میدهد: Wi-Fi، داده موبایل (WWAN) و عدم دسترسی. WWAN همه انواع ارتباط موبایل را شامل میشود — 2G، 3G، 4G/LTE، 5G. کتابخانه داخل WWAN جزئیاتی ارائه نمیدهد، بنابراین برای تمایز 4G و 5G به CoreTelephony نیاز است.
| وضعیت | فلگ SCNetwork | توضیح |
|---|---|---|
| ReachableViaWiFi | Reachable + !IsWWAN | اتصال از طریق شبکه Wi-Fi با دسترسی به میزان |
| ReachableViaWWAN | Reachable + IsWWAN | اتصال از طریق شبکه موبایل (2G-5G) |
| NotReachable | !Reachable | میزان از طریق هیچ رابطی دسترس نیست |
| ConnectionRequired | Reachable + ConnectionRequired | برقراری اتصال مورد نیاز است (VPN، PPPoE) |
Reachability Ethernet، تنولهای VPN یا اتصالات multipath را تمایز نمیدهد — تمام رابطهای غیر WWAN به عنوان Wi-Fi طبقهبندی میشوند. این محدودیت ناشی از معماری SystemConfiguration است که اطلاعات جزئی درباره رابطهای شبکه فراتر از طبقهبندی اساسی ارائه نمیدهد.
برای تعیین نوع مشخص ارتباط موبایل (4G vs 5G)، CTTelephonyNetworkInfo از CoreTelephony مورد نیاز است. ترکیب Reachability با CoreTelephony به برنامه امکان انتخاب کیفیت محتوا را میدهد: در 5G پخش 4K، در 4G/LTE HD، در 3G SD یا تنها صوت.
Apple توصیه میکند در تمام پروژههای جدید، از iOS 12 به بعد، Reachability را با NWPathMonitor جایگزین کنید. دلیل اصلی این است که NWPathMonitor بخشی از فریمورک مدرن Network است، به Swift نوشته شده، Combine را پشتیبانی میکند و اطلاعات جزئی درباره مسیر شبکه بدون نیاز به سازگاری با C ارائه میدهد.
فرایند مهاجرت شامل جایگزینی SCNetworkReachability با NWPathMonitor، انتقال از NotificationCenter به pathUpdateHandler closure یا Combine publisher است. الگوریتم و منطق پردازش وضعیت شبکه ثابت میماند — تنها API نمایش تغییر میکند.
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 را نیز مشخص میکند. این به توسعهدهنده دادههای بیشتری برای سازگاری رفتار برنامه با شرایط فعلی شبکه میدهد.
سوالات متداول
Reachability بر پایه SCNetworkReachability از iPhone OS 2 (iOS 2) در دسترس است. این کتابخانه در تمام نسخههای iOS، از جمله نسخههای فعلی، کار میکند. محدودیتها مربوط به نسخه سیستمعامل نیست، بلکه به جزئیات اطلاعات است — در نسخههای قدیمی تمایز 4G و 5G وجود ندارد.
Reachability از SCNetworkReachability — یک خدمت سیستمی که دسترسی میزان را در سطح پیشخان شبکه بدون ارسال بسته ارزیابی میکند — استفاده میکند. Ping بستههای ICMP ارسال میکند و ترافیک مصرف میکند، همچنین ممکن است توسط دیوارآتش بلوک شود. Reachability برای بررسی مکرر سریعتر و ایمنتر است.
بله، Reachability در SwiftUI از طریق ObservableObject یا Combine کار میکند. آن را در یک کلاس مشترک در NotificationCenter بپیچید و وضعیت را از طریق @Published منتشر کنید. برای پروژههای جدید SwiftUI، NWPathMonitor را با Combine publisher برای بهروزرسانی واکنشی View توصیه میکنیم.
Reachability فلگ kSCNetworkReachabilityFlagsIsWWAN را در ماسک بیتی SCNetworkReachabilityFlags بررسی میکند. اگر فلگ تنظیم شده باشد — اتصال از طریق شبکه موبایل (WWAN)، در غیر این صورت و میزان Reachable است — از طریق Wi-Fi. این تنها راه تمایز انواع بدون CoreTelephony است.
SCNetworkReachability دسترسی میزان را در سطح شبکه بررسی میکند، اما کارکرد پروتکلهای سطح بالا را تضمین نمیکند. دلایل ممکن: پرتال کپتیو، بلوک DNS، پروکسی سرور یا فایروال. Reachability یک فیلتر اولیه است، اما جایگزین یک درخواست واقعی HTTP نیست.
نتیجه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید