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 ব্যবহারের মানক প্যাটার্নে একটি ইনস্ট্যান্স তৈরি করা, বিজ্ঞপ্তিতে সাবস্ক্রাইব করা এবং অবস্থা পরিবর্তনে প্রতিক্রিয়া জানানো অন্তর্ভুক্ত। নিচের উদাহরণটি নেটওয়ার্ক পরিবর্তনের সময় UI আপডেট করার জন্য 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 SwiftUI-তে ObservableObject বা Combine-এর মাধ্যমে কাজ করে। এটিকে NotificationCenter-এ সাবস্ক্রাইবড একটি ক্লাসে মোড়ক করুন এবং @Published-এর মাধ্যমে অবস্থা প্রকাশ করুন। নতুন SwiftUI প্রকল্পের জন্য, আমরা প্রতিক্রিয়াশীল View আপডেটের জন্য Combine পাবলিশার সহ NWPathMonitor সুপারিশ করি।
Reachability SCNetworkReachabilityFlags বিটমাস্কে kSCNetworkReachabilityFlagsIsWWAN ফ্ল্যাগ পরীক্ষা করে। যদি ফ্ল্যাগ সেট থাকে — সংযোগ সেলুলার নেটওয়ার্কের (WWAN) মাধ্যমে, যদি না থাকে এবং হোস্ট Reachable হয় — Wi-Fi-এর মাধ্যমে। CoreTelephony ছাড়া ধরনের পার্থক্য করার এটাই একমাত্র উপায়।
SCNetworkReachability নেটওয়ার্ক স্তরে হোস্ট অ্যাক্সেসযোগ্যতা পরীক্ষা করে কিন্তু উচ্চ-স্তরের প্রোটোকল অপারেশনের গ্যারান্টি দেয় না। সম্ভাব্য কারণ: ক্যাপটিভ পোর্টাল, DNS ব্লকিং, প্রক্সি সার্ভার বা ফায়ারওয়াল। Reachability প্রথম ফিল্টার কিন্তু প্রকৃত HTTP অনুরোধের বিকল্প নয়।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন