Reachability ایک لائبریری ہے جو iOS اور macOS کے لیے SystemConfiguration فریم ورک پر بنائی گئی ہے، جو انٹرنیٹ کنکشن کی دستیابی کی جانچ اور اس کی تبدیلیوں کو ٹریک کرنے کی اجازت دیتی ہے۔ Apple Developer دستاویز (2025) کے مطابق، Reachability غیر ہم وقت ساز نیٹ ورک مانیٹرنگ کے لیے SCNetworkReachability استعمال کرتی ہے۔ Reachability لائبریری طویل عرصے تک iOS پروجیکٹس کے لیے معیار رہی جب تک کہ مقامی NWPathMonitor ظاہر نہیں ہوا۔
اہم نکات
Reachability Apple کی ایک نمونہ لائبریری ہے جو نیٹ ورک مانیٹرنگ کے لیے SystemConfiguration فریم ورک کے استعمال کو ظاہر کرتی ہے۔ سورس کوڈ Apple Developer دستاویز میں ایک مثال کے طور پر شائع کیا گیا تھا، لیکن کمیونٹی نے اسے iOS پروجیکٹس میں کنیکٹیویٹی کی جانچ کے لیے معیاری آلے کے طور پر اپنا لیا۔
لائبریری SCNetworkReachability — SystemConfiguration سے ایک C-فنکشن جو دور دراز میزبان یا 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 انٹرفیس، اسٹیٹس میموئیزیشن، اور تھریڈ سیف کال بیکس شامل کرتی ہیں، اسی SystemConfiguration بنیاد کو برقرار رکھتے ہوئے۔
Reachability کا بنیادی میکانزم SCNetworkReachabilityCreateWithName فنکشن ہے، جو مخصوص میزبان کے لیے ایک ٹریکنگ آبجیکٹ بناتا ہے۔ پھر SCNetworkReachabilityGetFlags کو کال کیا جاتا ہے — ایک ہم وقت ساز جانچ جو موجودہ نیٹ ورک کی حالت کے ساتھ SCNetworkReachabilityFlags کا بٹ ماسک لوٹاتی ہے۔
غیر ہم وقت ساز نگرانی کے لیے SCNetworkReachabilitySetCallback استعمال کیا جاتا ہے، جو ایک C کال بیک فنکشن رجسٹر کرتا ہے۔ جب میزبان کی رسائی کی حالت تبدیل ہوتی ہے تو کال بیک موجودہ RunLoop پر عملدرآمد ہوتا ہے۔ Reachability اس C-کال بیک کو ایک 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 انٹرفیس کی قسم کا تعین کرنے کے لیے ان جھنڈوں کو مدنظر رکھتی ہے۔
iOS ایپلیکیشن میں Reachability کے استعمال کا معیاری نمونہ ایک مثال بنانا، اطلاعات کو سبسکرائب کرنا، اور اسٹیٹس تبدیلیوں پر ردعمل دینا شامل ہے۔ نیچے دی گئی مثال نیٹ ورک تبدیل ہونے پر یوزر انٹرفیس کو اپ ڈیٹ کرنے کے لیے NotificationCenter کے ساتھ انضمام دکھاتی ہے۔
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 ٹنل یا ملٹی پاتھ کنکشن میں فرق نہیں کرتی — تمام غیر WWAN انٹرفیس کو Wi-Fi کے طور پر درجہ بند کیا جاتا ہے۔ یہ حد SystemConfiguration آرکیٹیکچر کی وجہ سے ہے، جو بنیادی درجہ بندی سے آگے نیٹ ورک انٹرفیس کے بارے میں تفصیلی معلومات فراہم نہیں کرتا۔
مخصوص سیلولر کنکشن کی قسم (4G بمقابلہ 5G) کا تعین کرنے کے لیے CoreTelephony سے CTTelephonyNetworkInfo کی ضرورت ہے۔ Reachability کو CoreTelephony کے ساتھ ملانے سے ایپلیکیشن مواد کے معیار کا انتخاب کر سکتی ہے: 5G پر — 4K میں سٹریمنگ، 4G/LTE پر — HD، 3G پر — SD یا صرف آڈیو۔
Apple iOS 12 سے شروع ہونے والے تمام نئے پروجیکٹس میں Reachability کو NWPathMonitor سے تبدیل کرنے کی تجویز کرتا ہے۔ بنیادی وجہ یہ ہے کہ NWPathMonitor جدید Network فریم ورک کا حصہ ہے، Swift میں لکھا گیا ہے، Combine کو سپورٹ کرتا ہے، اور C مطابقت کے بغیر تفصیلی نیٹ ورک پاتھ کی معلومات فراہم کرتا ہے۔
منتقلی کے عمل میں SCNetworkReachability کو NWPathMonitor سے تبدیل کرنا، NotificationCenter سے pathUpdateHandler بندش یا Combine پبلشر پر سوئچ کرنا شامل ہے۔ نیٹ ورک اسٹیٹس ہینڈلنگ کا الگورتھم اور منطق وہی رہتی ہے — صرف مانیٹرنگ 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 کی معاونت کرنے والے پروجیکٹس کے لیے، NWPathMonitor کے ساتھ مشروط تالیف #available(iOS 12, *) استعمال کریں اور Reachability کو فال بیک کے طور پر استعمال کریں۔ یہ پرانے آلات کی حمایت کھوئے بتدریج منتقلی کی اجازت دیتا ہے۔
منتقلی کا بنیادی فائدہ نیٹ ورک پاتھ کی تفصیل ہے۔ NWPathMonitor صرف “قابل رسائی/ناقابل رسائی” ہی نہیں بلکہ ہر انٹرفیس کی قسم، ان کے اخراجات، ترجیح، پراکسی اور VPN سپورٹ بھی رپورٹ کرتا ہے۔ یہ ڈویلپر کو موجودہ نیٹ ورک حالات کے مطابق ایپلیکیشن کے رویے کو ڈھالنے کے لیے مزید ڈیٹا دیتا ہے۔
اکثر پوچھے گئے سوالات
SCNetworkReachability پر Reachability iPhone OS 2 (iOS 2) سے دستیاب ہے۔ لائبریری iOS کے تمام ورژنز پر کام کرتی ہے، بشمول موجودہ ورژنز۔ حدود OS ورژن سے نہیں بلکہ معلومات کی تفصیل سے متعلق ہیں — پرانے ورژن 4G اور 5G میں فرق نہیں کر سکتے۔
Reachability SCNetworkReachability استعمال کرتی ہے — ایک سسٹم سروس جو پیکٹ بھیجے بغیر نیٹ ورک اسٹیک کی سطح پر میزبان کی رسائی کا جائزہ لیتی ہے۔ Ping ICMP پیکٹ بھیجتا ہے اور ٹریفک استعمال کرتا ہے، اور فائر وال کے ذریعے بلاک بھی ہو سکتا ہے۔ بار بار جانچ کے لیے Reachability تیز اور محفوظ ہے۔
ہاں، Reachability ObservableObject یا Combine کے ذریعے SwiftUI میں کام کرتی ہے۔ اسے NotificationCenter پر سبسکرائبڈ کلاس میں لپیٹیں اور @Published کے ذریعے اسٹیٹس شائع کریں۔ نئے SwiftUI پروجیکٹس کے لیے، ہم Reactive View اپ ڈیٹس کے لیے Combine پبلشر کے ساتھ NWPathMonitor تجویز کرتے ہیں۔
Reachability SCNetworkReachabilityFlags بٹ ماسک میں kSCNetworkReachabilityFlagsIsWWAN جھنڈا چیک کرتی ہے۔ اگر جھنڈا سیٹ ہے — کنکشن سیلولر نیٹ ورک (WWAN) کے ذریعے، اگر نہیں اور میزبان Reachable ہے — Wi-Fi کے ذریعے۔ CoreTelephony کے بغیر اقسام میں فرق کرنے کا یہی واحد طریقہ ہے۔
SCNetworkReachability نیٹ ورک کی سطح پر میزبان کی رسائی چیک کرتی ہے لیکن اعلیٰ سطح کے پروٹوکول کے آپریشن کی ضمانت نہیں دیتی۔ ممکنہ وجوہات: کیپٹیو پورٹل، DNS بلاکنگ، پراکسی سرور یا فائر وال۔ Reachability پہلا فلٹر ہے لیکن حقیقی HTTP درخواست کا متبادل نہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں