<पी> नियो इघोडारो द्वारा <पी> अक्सर, मोबाइल एप्लिकेशन को ठीक से काम करने के लिए एक सक्रिय इंटरनेट कनेक्शन की आवश्यकता होती है। हालाँकि, इंटरनेट कनेक्शन खो जाना सामान्य है। ऐसे मामलों में, यह डेवलपर पर निर्भर है कि वह अनुभव को सहने योग्य बनाने के तरीकों के साथ आए, या कम से कम, उपयोगकर्ता को सूचित करे। <पी> इस लेख में, हम यह देखने जा रहे हैं कि हम स्विफ्ट में इंटरनेट कनेक्शन समस्याओं का कैसे पता लगा सकते हैं, और कुछ तरीकों से हम इसे संभाल सकते हैं। <पी> यहां नमूना एप्लिकेशन है जिसे हम बना रहे हैं और यह विभिन्न इंटरनेट कनेक्टिविटी परिदृश्यों को कैसे संभालता है: <पी>
आवश्यकताएँ
<पी> इस लेख का अनुसरण करने में सक्षम होने के लिए, आपको निम्नलिखित आवश्यकताओं की आवश्यकता होगी: - आपकी मशीन पर Xcode इंस्टॉल हो गया है।
- स्विफ्ट प्रोग्रामिंग भाषा का ज्ञान।
- आपकी मशीन पर कोकोपोड्स स्थापित हैं।
<पी> जब आपके पास उपरोक्त आवश्यकताएं हों, तो आइए गहराई से जानें। हमारा कार्यक्षेत्र स्थापित करना
<पी> शुरू करने से पहले, हम एक खेल का मैदान बनाएंगे। यहीं पर हम अपने सभी उपयोग के मामले लिखेंगे और उन्हें संभालेंगे। <पी> कनेक्शन समस्याओं का पता लगाने के लिए स्विफ्ट अपने स्वयं के रीचैबिलिटी कार्यान्वयन के साथ आती है, लेकिन हम एक तृतीय-पक्ष लाइब्रेरी का उपयोग करेंगे। हम ऐसा इसलिए कर रहे हैं क्योंकि यह आसान है और एपीआई अंतर्निहित एपीआई की तुलना में अधिक अभिव्यंजक है। <पी> Xcode खोलें और एक नया प्रोजेक्ट सेट करें। <पी>
<पी> यह प्रोजेक्ट एक साधारण खेल का मैदान होगा जिसके साथ हम प्रयोग कर सकते हैं। <पी> यह पता लगाने के लिए कि कनेक्शन कब ऑफ़लाइन हो जाता है, हम Reachability.swift का उपयोग करने जा रहे हैं ** पैकेज. यह "एप्पल की रीचैबिलिटी के लिए स्विफ्ट में क्लोजर के साथ दोबारा लिखा गया प्रतिस्थापन" है। <पी> अपना टर्मिनल खोलें और नीचे दिया गया कमांड चलाएँ: $ pod init
<पी> इससे एक नया Podfile बनेगा जहां हम कोकोपोड्स निर्भरता की घोषणा कर सकते हैं। Podfile खोलें और सामग्री को नीचे दिए गए कोड से बदलें: platform :ios, '9.0'
target 'project_name' do use_frameworks! pod 'ReachabilitySwift' pod 'Alamofire'end
<पी> आपको प्रतिस्थापित करने की आवश्यकता है **project_name** आपके प्रोजेक्ट के नाम के साथ. पी> <पी> फ़ाइल को सहेजें और अपने प्रोजेक्ट में पॉड्स इंस्टॉल करने के लिए नीचे दिए गए कमांड को चलाएँ: $ pod install
<पी> जब इंस्टॉलेशन पूरा हो जाए, तो *.xcworkspace खोलें अपने प्रोजेक्ट के रूट में फ़ाइल करें। यह Xcode लॉन्च करेगा. हमारा नेटवर्क रीचैबिलिटी मैनेजर बनाना
<पी> एक नया NetworkManager बनाएं कक्षा. यह वर्ग नेटवर्क स्थिति संग्रहीत करेगा और Reachability के लिए एक सरल प्रॉक्सी होगा पैकेज. फ़ाइल में, नीचे दिया गया कोड चिपकाएँ: import Foundationimport Reachability
class NetworkManager: NSObject {
var reachability: Reachability!
static let sharedInstance: NetworkManager = { return NetworkManager() }()
override init() { super.init()
// Initialise reachability reachability = Reachability()!
// Register an observer for the network status NotificationCenter.default.addObserver( self, selector: #selector(networkStatusChanged(_:)), name: .reachabilityChanged, object: reachability )
do { // Start the network status notifier try reachability.startNotifier() } catch { print("Unable to start notifier") } }
@objc func networkStatusChanged(_ notification: Notification) { // Do something globally here! }
static func stopNotifier() -> Void { do { // Stop the network status notifier try (NetworkManager.sharedInstance.reachability).startNotifier() } catch { print("Error stopping notifier") } }
// Network is reachable static func isReachable(completed: @escaping (NetworkManager) -> Void) { if (NetworkManager.sharedInstance.reachability).connection != .none { completed(NetworkManager.sharedInstance) } }
// Network is unreachable static func isUnreachable(completed: @escaping (NetworkManager) -> Void) { if (NetworkManager.sharedInstance.reachability).connection == .none { completed(NetworkManager.sharedInstance) } }
// Network is reachable via WWAN/Cellular static func isReachableViaWWAN(completed: @escaping (NetworkManager) -> Void) { if (NetworkManager.sharedInstance.reachability).connection == .cellular { completed(NetworkManager.sharedInstance) } }
// Network is reachable via WiFi static func isReachableViaWiFi(completed: @escaping (NetworkManager) -> Void) { if (NetworkManager.sharedInstance.reachability).connection == .wifi { completed(NetworkManager.sharedInstance) } }]
<पी> उपरोक्त कक्षा में, हमने कुछ सहायक कार्यों को परिभाषित किया है जो हमें नेटवर्क स्थिति की निगरानी शुरू करने में मदद करेंगे। हमारे पास एक sharedInstance है वह एक सिंगलटन है और यदि हम NetworkManager के कई उदाहरण नहीं बनाना चाहते हैं तो हम उसे कॉल कर सकते हैं क्लास. <पी> init में विधि, हम Reachability का एक उदाहरण बनाते हैं और फिर हम NotificationCenter का उपयोग करके एक अधिसूचना पंजीकृत करते हैं कक्षा. अब, हर बार नेटवर्क स्थिति बदलने पर, NotificationCenter द्वारा निर्दिष्ट कॉलबैक (जो networkStatusChanged है ) को बुलाया जाएगा. हम इसका उपयोग कुछ वैश्विक कार्य करने के लिए कर सकते हैं जो नेटवर्क के पहुंच से बाहर होने पर सक्रिय हो जाता है। <पी> हमने अन्य सहायक कार्यों को परिभाषित किया है जो आम तौर पर हमारे इंटरनेट कनेक्शन की स्थिति के आधार पर रनिंग कोड को आसान बना देंगे। हमारे पास *isReachable* है , *isUnreachable* , *isReachableViaWWAN* और *isReachableViaWiFi* . <पी> इन सहायकों में से किसी एक का उपयोग आम तौर पर इस तरह दिखेगा: NetworkManager.isReachable { networkManagerInstance in print("Network is available")}
NetworkManager.isUnreachable { networkManagerInstance in print("Network is Unavailable")}
<पी> यह कोई ईवेंट श्रोता नहीं है और केवल एक बार चलेगा। वास्तविक समय में नेटवर्क परिवर्तन लेने के लिए श्रोता का उपयोग करने के लिए, आपकोका उपयोग करना होगा NetworkManager.sharedInstance.reachability.whenReachable <मजबूत>. हम लेख में बाद में एक उदाहरण दिखाएंगे पी> <पी> अब जब हमारे पास एक प्रबंधक वर्ग है, तो आइए देखें कि हम इसे किसी एप्लिकेशन में कैसे उपयोग कर सकते हैं। एप्लिकेशन लॉन्च पर नेटवर्क उपलब्धता को संभालना
<पी> कभी-कभी, आपका एप्लिकेशन इंटरनेट कनेक्शन पर बहुत अधिक निर्भर करता है और आपको लॉन्च पर स्थिति का पता लगाने की आवश्यकता होती है। आइए देखें कि हम NetworkManager का उपयोग करके इसे कैसे संभाल सकते हैं क्लास. <पी> LaunchViewController नामक एक नया नियंत्रक बनाएं . हम स्टोरीबोर्ड पर पहले नियंत्रक दृश्य को लॉन्च नियंत्रक के रूप में मानेंगे। हम यह पता लगाने की कोशिश करेंगे कि क्या उपयोगकर्ता का उपकरण ऑनलाइन है और यदि नहीं, तो हम इसे संभालने के लिए एक ऑफ़लाइन पेज बनाएंगे ताकि उपयोगकर्ता एप्लिकेशन में बिल्कुल भी प्रवेश न कर सके। <पी> LaunchController में , सामग्री को निम्नलिखित कोड से बदलें: import UIKit
class LaunchViewController: UIViewController { let network: NetworkManager = NetworkManager.sharedInstance
override func viewDidLoad() { super.viewDidLoad()
NetworkManager.isUnreachable { _ in self.showOfflinePage() } }
private func showOfflinePage() -> Void { DispatchQueue.main.async { self.performSegue( withIdentifier: "NetworkUnavailable", sender: self ) } }}
<पी> इस कक्षा में, हम अपने NetworkManager का उपयोग करते हैं 'एस *isUnreachable* showOffline को सक्रिय करने की विधि नेटवर्क अनुपलब्ध होने पर विधि। आइए वह व्यू कंट्रोलर बनाएं। OfflineViewController नामक एक नया व्यू कंट्रोलर बनाएं . <पी> Main.storyboard खोलें फ़ाइल करें और पहले दृश्य के कस्टम वर्ग को LaunchViewController पर सेट करें . <पी> इसके बाद, स्टोरीबोर्ड में एक नया व्यू कंट्रोलर बनाएं। OfflineViewController सेट करें इस नए व्यू कंट्रोलर के लिए कस्टम क्लास के रूप में। अब NetworkUnavailable नाम से एक मैनुअल सेग्यू बनाएं नए व्यू कंट्रोलर और LaunchViewController के बीच . जब आपका काम पूरा हो जाए तो आपके पास कुछ इस जैसा होना चाहिए: <पी>
<पी> अब एप्लिकेशन को चलाते हैं। हालाँकि, ध्यान दें कि अपना एप्लिकेशन चलाने से पहले, आपकी विकास मशीन ऑफ़लाइन होनी चाहिए क्योंकि iOS सिम्युलेटर मशीन के इंटरनेट कनेक्शन का उपयोग करता है। जब आप एप्लिकेशन चलाते हैं, तो आपको हमारे द्वारा बनाया गया ऑफ़लाइन पेज मिलना चाहिए। <पी> अब हम एक व्यू कंट्रोलर बनाते हैं जो कनेक्शन होने पर दिखाई देता है। डिवाइस के ऑनलाइन आने पर घटनाओं को संभालना
<पी> अब जब हमने एक ऑफ़लाइन व्यू कंट्रोलर बना लिया है और यह डिवाइस के ऑफ़लाइन होने पर काम करता है, तो आइए देखें कि डिवाइस के वापस ऑनलाइन होने पर क्या होता है। <पी> ऑफ़लाइन व्यू कंट्रोलर के नीचे स्टोरीबोर्ड पर एक नया नेविगेशन व्यू कंट्रोलर बनाएं। हम एक नियंत्रक बनाएंगे जो नवीनतम Reddit पोस्ट प्रदर्शित करेगा। PostsTableViewController नामक एक नया व्यू कंट्रोलर क्लास बनाएं . अब इसे नेविगेशन व्यू कंट्रोलर से जुड़े व्यू कंट्रोलर के लिए कस्टम क्लास बनाएं। <पी> अब MainController नाम से एक मैनुअल सेगमेंट बनाएं नेविगेशन व्यू कंट्रोलर से लेकर लॉन्च व्यू कंट्रोलर और ऑफलाइन व्यू कंट्रोलर तक। आपके पास इसके समान कुछ होना चाहिए: <पी>
<पी> अब, LaunchViewController खोलें क्लास और viewDidLoad के नीचे विधि निम्नलिखित जोड़ें: NetworkManager.isReachable { _ in self.showMainPage()}
<पी> फिर नियंत्रक में नीचे दी गई विधि जोड़ें: private func showMainPage() -> Void { DispatchQueue.main.async { self.performSegue( withIdentifier: "MainController", sender: self ) }}
<पी> इससे यह सुनिश्चित हो जाएगा कि जब ऐप लॉन्च होगा, तो यह कनेक्टिविटी की जांच करेगा और फिर, यदि कनेक्शन उपलब्ध है, तो यह PostsTableViewController प्रस्तुत करेगा। . अन्यथा यह OfflineViewController प्रस्तुत करेगा . <पी> बढ़िया! लेकिन क्या होता है जब उपयोगकर्ता OfflineViewController पर पहुंच जाता है और फिर नेटवर्क वापस ऑनलाइन आ जाता है? आइए उस परिदृश्य को संभालें। <पी> OfflineViewController खोलें और कोड को नीचे दिए गए कोड से बदलें: import UIKit
class OfflineViewController: UIViewController { let network = NetworkManager.sharedInstance
override func viewDidLoad() { super.viewDidLoad()
// If the network is reachable show the main controller network.reachability.whenReachable = { _ in self.showMainController() } }
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(true, animated: animated) }
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated)
navigationController?.setNavigationBarHidden(false, animated: animated) }
private func showMainController() -> Void { DispatchQueue.main.async { self.performSegue(withIdentifier: "MainController", sender: self) } }}
<पी> उपरोक्त नियंत्रक में, आप viewDidLoad में देख सकते हैं विधि, कि हम whenReachable सेट करते हैं मुख्य नियंत्रक को दिखाने के लिए पूर्णता। इसका मतलब यह है कि, जब तक यह ऑफ़लाइन है, आप यह देखते रहेंगे कि डिवाइस कब वापस ऑनलाइन आता है। जब ऐसा हो, तो PostsTableViewController प्रस्तुत करें . <पी> हम viewWillAppear को भी ओवरराइड करते हैं और viewWillDisappear यह सुनिश्चित करने के तरीके कि नेविगेशन बार ऑफ़लाइन व्यू कंट्रोलर पर दिखाई न दे। स्विफ्ट में Reddit API से पोस्ट लाया जा रहा है
<पी> अब हम वह तर्क जोड़ते हैं जो Reddit से डेटा लाएगा और हमारे PostsTableViewController पर प्रदर्शित करेगा . फ़ाइल खोलें और सामग्री को नीचे दिए गए कोड से बदलें: import UIKitimport Alamofire
struct RedditPost { let title: String! let subreddit: String!}
class PostsTableViewController: UITableViewController { var posts = [RedditPost]()
let network = NetworkManager.sharedInstance
override func viewDidLoad() { super.viewDidLoad() navigationItem.title = "Latest Posts"
// Fetch the posts and then reload the table fetchPosts { posts in self.posts = posts self.tableView.reloadData() } }
private func fetchPosts(completion: @escaping (_ posts: [RedditPost]) -> Void) -> Void { // Send a request to the Reddit API Alamofire.request("https://api.reddit.com").validate().responseJSON { response in switch response.result { case .success(let JSON): let data = JSON as! [String:AnyObject] guard let children = data["data"]!["children"] as? [AnyObject] else { return } var posts = [RedditPost]()
// Loop through the Reddit posts and then assign a post to the posts array for child in 0...children.count-1 { let post = children[child]["data"] as! [String: AnyObject]
posts.append(RedditPost( title: post["title"] as! String, subreddit: "/r/" + (post["subreddit"] as! String) )) }
DispatchQueue.main.async { completion(posts) } case .failure(let error): print(error) } } }
override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() }
// MARK: - Table view data source override func numberOfSections(in tableView: UITableView) -> Int { return 1 }
// Return the number of posts available override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.posts.count }
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) let post = posts[indexPath.row] as RedditPost cell.textLabel?.text = post.title cell.detailTextLabel?.text = post.subreddit return cell }}
<पी> fetchPosts में विधि, हम Alamofire का उपयोग करते हैं Reddit API को GET अनुरोध भेजने के लिए। फिर हम प्रतिक्रिया को पार्स करते हैं और इसे RedditPost में जोड़ते हैं संरचना हमने फ़ाइल के शीर्ष पर बनाई है। इससे वह डेटा बन जाता है जिसे हम tableView पर भेज रहे हैं सुसंगत. डिवाइस के ऑफ़लाइन होने पर घटनाओं को संभालना
<पी> अब, आइए एक और परिदृश्य को संभालें। कल्पना करें कि नवीनतम Reddit पोस्ट देखते समय आप कनेक्टिविटी खो देते हैं। क्या होता है? आइए, ऐसा होने पर ऑफ़लाइन पृष्ठ फिर से दिखाएं। <पी> जैसा कि पहले किया गया था, NetworkUnavailable नामक एक मैन्युअल सेगमेंट बनाएं PostsTableViewController से OfflineViewController पर . अब इस कोड को viewDidLoad के नीचे जोड़ें विधि: network.reachability.whenUnreachable = { reachability in self.showOfflinePage()}
<पी> अब कंट्रोलर में नीचे दी गई विधि जोड़ें: private func showOfflinePage() -> Void { DispatchQueue.main.async { self.performSegue(withIdentifier: "NetworkUnavailable", sender: self) }}
<पी> यह डिवाइस के ऑफ़लाइन होने पर सुनेगा और यदि ऐसा होता है, तो यह showOfflinePage हो जाएगा . <पी> बस इतना ही! हम स्विफ्ट में अपने नेटवर्क मैनेजर का उपयोग करके ऑफ़लाइन और ऑनलाइन इवेंट को संभालने में सक्षम हैं। निष्कर्ष
<पी> इस लेख में, हमने इस बात पर विचार किया कि यह कैसे सुनिश्चित किया जाए कि आपका एप्लिकेशन ऑनलाइन और ऑफलाइन घटनाओं के घटित होने पर उन्हें संभाल सके। आप इसे अपनी इच्छानुसार कभी भी कार्यान्वित कर सकते हैं। यदि आपका कोई प्रश्न या प्रतिक्रिया है, तो उन्हें नीचे टिप्पणियों में छोड़ें। <पी> इस खेल के मैदान का स्रोत कोड GitHub पर उपलब्ध है। <पी> यह लेख पहली बार पुशर पर प्रकाशित हुआ था। <पी> मुफ़्त में कोड करना सीखें. फ्रीकोडकैंप के ओपन सोर्स पाठ्यक्रम ने 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी पाने में मदद की है। आरंभ करें