নিও ইঘোদারো
দ্বারাপ্রায়শই নয়, মোবাইল অ্যাপ্লিকেশনগুলির সঠিকভাবে কাজ করার জন্য একটি সক্রিয় ইন্টারনেট সংযোগের প্রয়োজন। তবে ইন্টারনেট সংযোগ বিচ্ছিন্ন হওয়াটাই স্বাভাবিক। এই ধরনের ক্ষেত্রে, এটি বিকাশকারীর উপর নির্ভর করে যে অভিজ্ঞতা সহনীয় করে তোলার উপায়গুলি নিয়ে আসা, বা অন্ততপক্ষে, ব্যবহারকারীকে অবহিত করা৷
এই নিবন্ধে, আমরা দেখতে যাচ্ছি কিভাবে আমরা সুইফটে ইন্টারনেট সংযোগের সমস্যাগুলি সনাক্ত করতে পারি এবং কিছু উপায়ে আমরা এটি পরিচালনা করতে পারি৷
এখানে নমুনা অ্যাপ্লিকেশনটি আমরা তৈরি করব এবং এটি কীভাবে বিভিন্ন ইন্টারনেট সংযোগের পরিস্থিতি পরিচালনা করে:

প্রয়োজনীয়তা
আপনি এই নিবন্ধটি অনুসরণ করতে সক্ষম হওয়ার জন্য, আপনার নিম্নলিখিত প্রয়োজনীয়তাগুলির প্রয়োজন হবে:
- আপনার মেশিনে 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 ব্যবহার করি s *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 অফলাইন ভিউ কন্ট্রোলারে নেভিগেশন বার দেখা যাচ্ছে না তা নিশ্চিত করার পদ্ধতি।
Swift এ 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-এ যোগ করি struct আমরা ফাইলের শীর্ষে তৈরি করেছি। এটি আমরা 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-এ উপলব্ধ।
এই নিবন্ধটি প্রথম Pusher এ প্রকাশিত হয়েছিল৷
৷বিনামূল্যে কোড শিখুন. freeCodeCamp-এর ওপেন সোর্স পাঠ্যক্রম 40,000-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন