Swift-də internet əlaqələrinin mövcudluğu ilə məşğul olmaq

Əksər hallarda mobil tətbiqetmələrin düzgün işləməsi üçün aktiv internet bağlantısı tələb olunur. Ancaq internet bağlantısının aşağı düşməsi normaldır. Belə hallarda, təcrübəni dözümlü etmək və ya heç olmasa istifadəçini xəbərdar etmək yollarını tapmaq inkişaf etdiricidən asılıdır.

Bu yazıda Swift-də internet bağlantısı problemlərini necə təyin edəcəyimizi və bunlarla necə məşğul olacağımızı görəcəyik.

Budur, yaratacağımız nümunə tətbiqetmə və fərqli internet bağlantısı ssenarilərini necə idarə edir:

tələb

Bu məqalə ilə birlikdə oxuya bilmək üçün aşağıdakı tələblərə ehtiyacınız var:

  • Kompüterinizdə quraşdırılmış Xcode.
  • Swift proqramlaşdırma dilini bilmə.
  • Kompüterinizdə quraşdırılmış Cocoapods.

Yuxarıda göstərilən tələbləriniz varsa, gəlin dalış edək.

İş yerimizin qurulması

Başlamazdan əvvəl bir oyun sahəsi yaradacağıq. Bütün istifadə vəziyyətlərimizi burada yazırıq və əhatə edirik.

Swift, əlaqə problemlərini aşkarlamaq üçün öz əlçatanlığı tətbiqetmə ilə gəlir. Ancaq üçüncü bir kitabxanadan istifadə edəcəyik. Bunu daha sadə olduğu üçün və API daxili birindən daha mənalı olduğu üçün edirik.

Xcode'u açın və yeni bir layihə qurun.

Bu layihə təcrübə edə biləcəyimiz sadə bir oyun sahəsi olacaqdır.

Bağlantının nə vaxt kəsildiyini öyrənmək üçün Reachability.swift **** paketindən istifadə edirik. Bu, "Apple-ın Swift yenidən yazılmış əlçatanlığının bağlanması ilə əvəzlənməsi" dir.

Terminalınızı açın və aşağıdakı əmri işə salın:

$ pod init

Bu, Cocoapods asılılıqlarının elan edilə biləcəyi yeni bir pod faylı yaradacaqdır. Podfili açın və məzmunu aşağıdakı kodla əvəz edin:

Platforma: iOS, '9.0'
Hədəf 'layihə adı' istifadə_frameworks edin! Pod 'ReachabilitySwift' Pod 'Alamofire' sonu
** layihə adı ** nı layihənizin adı ilə əvəz etməlisiniz.

Layihəni qovluqları quraşdırmaq üçün faylı yazın və aşağıdakı əmri işə salın:

$ Pod quraşdırın

Quraşdırma başa çatdıqdan sonra, * .xcworkspace faylını layihənizin kök qovluğunda açın. Bu Xcode başlayacaq.

Şəbəkə Reachability Manager-in yaradılması

Yeni bir NetworkManager sinfi yaradın. Bu sinif şəbəkə vəziyyətini saxlayır və əlçatanlıq paketi üçün sadə bir vəkildir. Aşağıdakı kodu fayla yapışdırın:

İdxal Vəqfi İdxal əlçatanlığı
NetworkManager sinfi: NSObject {
var mövcudluğu: mövcudluğu!
statik imkan paylaşılan məqam: NetworkManager = {NetworkManager-dan qayıt ()} ()
init () {super.init () üstünə yazın
// erişilebilirliği başlatma = ulaşılabilirlik ()!
// şəbəkə statusu üçün müşahidəçini qeyd edin NotificationCenter.default.addObserver (özünü, seçici: #selector (networkStatusChanged (_ :)), ad: .reachabilityChanged, obyekt: erişilebilirlik)
etmək {// şəbəkə vəziyyəti bildirişini başladın. reachability.startNotifier ()} catch {print ("Bildiriş başlaya bilməz")}}
@objc func networkStatusChanged (_ bildiriş: Bildiriş) {// Burada qlobal bir şey edin! }
statik funksiya stopNotifier () -> etibarsız {etmək {// şəbəkə vəziyyəti bildirişini dayandırın (NetworkManager.sharedInstance.reachability) .startNotifier ()} catch {print ("Notifier-dən çıxma xətası")}}
// şəbəkə əldə edilə bilər statik funksiya isReachable (tamamlandı: @escaping (NetworkManager) -> Boş)) {if (NetworkManager.sharedInstance.reachability) .connection! =. heç biri {tamamlandı (NetworkManager.sharedInstance)}}
// şəbəkə əldə edilə bilməz statik funksiya əldə edilə bilməz (tamamlandı: @escaping (NetworkManager) -> Boş) {if (NetworkManager.sharedInstance.reachability) .connection == .none {başa çatdı (NetworkManager.sharedInstance)}}
// Şəbəkəyə WWAN / Cellular statik funksiyası isReachableViaWWAN (tamamlandı: @escaping (NetworkManager) -> Boş)) {if (NetworkManager.sharedInstance.reachability) .connection == .cellular {başa çatdı (NetworkManager.sharedInstance)}}
// şəbəkəyə WLAN statik funksiyası olan isReachableViaWiFi (tamamlandı: @escaping (NetworkManager) -> Boş)) {if (NetworkManager.sharedInstance.reachability) .connection == .wifi {tamamlandı (NetworkManager.sharedInstance)}}]

Yuxarıdakı sinifdə, şəbəkə vəziyyətini izləməyə başlamağımıza kömək edəcək bəzi köməkçi funksiyaları təyin etdik. NetworkManager sinifinin birdən çox nümunəsini yaratmaq istəmədiyimiz zaman zəng edə biləcəyimiz bir singleInstance var.

Init metodunda Reachability nümunəsi yaradırıq və sonra NotificationCenter sinifindən istifadə edərək bildiriş qeyd edirik. Şəbəkə vəziyyəti hər dəfə dəyişdikdə, NotificationCenter (networkStatusChanged) tərəfindən göstərilən geri çağırış çağırılır. Bunu şəbəkə bitdikdə aktivləşən qlobal bir şey etmək üçün istifadə edə bilərik.

İnternet bağlantımızın vəziyyətindən asılı olaraq icra kodunu asan bir meh halına gətirən əlavə köməkçi funksiyaları təyin etdik. Bizdə * isReachable *, * isUnreachable *, * isReachableViaWWAN * və * isReachableViaWiFi * var.

Bu köməkçilərdən birini istifadə etmək ümumiyyətlə belə görünür:

NetworkManager.isReachable {networkManagerInstance çapda ("Şəbəkə mövcuddur")}
NetworkManager.isUnreachable {networkManagerInstance çapda ("Şəbəkə mövcud deyil")}
Bu hadisə dinləyici deyil və yalnız bir dəfə işləyir. Şəbəkə dəyişikliklərini real vaxtda əldə etmək üçün dinləyicidən istifadə etmək üçün NetworkManager.sharedInstance.reachability.whenReachable ** istifadə etməlisiniz. Bu məqalədə daha sonra bir nümunə göstərəcəyik. **

İndi menecer sinifimiz var, gəlin bunu bir tətbiqdə necə istifadə edə biləcəyimizi görək.

Tətbiqə başlayarkən şəbəkə mövcudluğu ilə məşğul olmaq

Bəzən tətbiqiniz bir İnternet bağlantısından çox asılıdır və işə başladıqda vəziyyətini təyin etməlisiniz. Gəlin bununla məşğul olmaq üçün NetworkManager sinifindən necə istifadə edə biləcəyimizi görək.

LaunchViewController adlı yeni bir nəzarətçi yaradın. Storyboarddakı ilk nəzarətçi görünüşünü bir başlanğıc nəzarətçisi kimi qəbul edəcəyik. İstifadəçinin cihazının onlayn olub olmadığını görməyə çalışacağıq. Əks təqdirdə, istifadəçinin tətbiqetməyə ümumiyyətlə girməməsi üçün bunu idarə etmək üçün oflayn bir səhifə yaradacağıq.

LaunchController'da məzmunu aşağıdakı kodla əvəz edin:

UIKit idxal edin
LaunchViewController sinfi: UIViewController {let network: NetworkManager = NetworkManager.sharedInstance
Func viewDidLoad () {super.viewDidLoad () əvəz
NetworkManager.isUnreachable {_ self.showOfflinePage ()}}
private func showOfflinePage () -> Void {DispatchQueue.main.async {self.performSegue (withIdentifier: "NetworkUnavailable", göndərən: self)}}}

Bu sinifdə, şəbəkə olmadıqda showOffline metodunu işə salmaq üçün NetworkManager's * isUnreachable * metodundan istifadə edirik. Gəlin bu görünüş nəzarətçisini yaradaq. OfflineViewController adlı yeni bir görünüş nəzarətçi yaradın.

Main.storyboard faylını açın və ilk görünüşün xüsusi sinifini LaunchViewController olaraq təyin edin.

Sonra, hekayə lövhəsində yeni bir görünüş nəzarətçi yaradın. OfflineViewController-i bu yeni görünüş nəzarətçi üçün xüsusi sinif olaraq təyin edin. İndi yeni görünüş nəzarətçi ilə LaunchViewController arasında NetworkUnavailable adlı əl seqmenti yaradın. Bitirdikdən sonra belə bir şeyə sahib olmalısan:

İndi tətbiqi işə salaq. Bununla birlikdə, iOS simulyatoru kompüterin internet bağlantısını istifadə edəcəyi üçün tətbiqinizi işə salmadan əvvəl inkişaf kompüterinizin oflayn olması lazım olduğunu unutmayın. Tətbiqi çalıştırdığınız zaman yaratdığımız oflayn səhifəni almalısınız.

İndi bağlandıqda göstəriləcək bir görünüş nəzarətçi yarataq.

Cihaz onlayn olduqda hadisələri idarə edin

Artıq bir oflayn görünüş nəzarətçi yaratdıq və cihaz oflayn olduqda işləyir, cihaz yenidən onlayn olduqda nə olacağına baxa bilərik.

Oflayn görünüş nəzarətçisinin altındakı hekayə panelində yeni bir naviqasiya görünüşü nəzarətçi yaradın. Ən son Reddit yazılarını göstərəcək bir nəzarətçi yaradacağıq. PostsTableViewController adlı yeni bir View Controller sinfi yaradın. İndi bunu naviqasiya görünüşü nəzarətçisinə əlavə edilmiş görüntü nəzarətçisi üçün xüsusi bir sinif halına gətirin.

İndi naviqasiya baxış nəzarətçisindən ev görünüşü nəzarətçisinə və oflayn görünüş nəzarətçisinə MainController adlı bir dərslik yaradın. Bunlara bənzər bir şey olmalıdır:

İndi LaunchViewController sinifini açın və viewDidLoad metodunun sonuna aşağıdakıları əlavə edin:

NetworkManager.isReachable {_ self.showMainPage ()} -da

Sonra nəzarətçiyə aşağıdakı metodu əlavə edin:

private func showMainPage () -> Void {DispatchQueue.main.async {self.performSegue (withIdentifier: "MainController", Göndərən: Selbst)}}

Bu, tətbiq başlayanda əlaqənin yoxlanılmasını təmin edir. Bağlantı varsa, PostsTableViewController göstərilir. Əks təqdirdə OfflineViewController göstərilir.

Əla! Ancaq istifadəçi OfflineViewController düyməsini basdıqda və şəbəkə yenidən onlayn olduqda nə baş verir? Gəlin bu ssenarini əhatə edək.

OfflineViewController açın və kodu aşağıdakı kodla əvəz edin:

UIKit idxal edin
OfflineViewController sinfi: UIViewController {let network = NetworkManager.sharedInstance
Func viewDidLoad () {super.viewDidLoad () əvəz
// Şəbəkə əlçatandırsa, əsas nəzarətçini göstərin network.reachability.whenReachable = {_ in self.showMainController ()}}
func viewWillAppear (_ cizgi: Bool) üzərinə yazın {super.viewWillAppear (animasiya)
naviqasiya idarəsi? .setNavigationBarHidden (doğru, cizgi: cizgi)}
func viewWillDisappear (_ cizgi: Bool) üzərinə yazın {super.viewWillDisappear (animasiya)
naviqasiya idarəsi? .setNavigationBarHidden (yalan, cizgi: cizgi)}
private func showMainController () -> Boşluq {DispatchQueue.main.async {self.performSegue (withIdentifier: "MainController", Sender: self)}}}

Yuxarıdakı nəzarətçidə, əsas tənzimləyicini göstərmək üçün whenReachable başa çatdırdığımızı təyin etdiyimiz viewDidLoad metodunda görə bilərsiniz. Bu o deməkdir ki, cihaz oflayn olduğu müddətdə yenidən onlayn olduqda diqqət yetirəcəksiniz. Əgər belədirsə, PostsTableViewController təqdim edin.

Naviqasiya çubuğunun oflayn görünüş nəzarətçisində görünməməsini təmin etmək üçün viewWillAppear və viewWillDisappear metodlarını da ləğv edirik.

Swift-də Reddit API-dən yazıların alınması

İndi Reddit-dən məlumatları götürən və PostsTableViewController-da göstərən məntiqi əlavə edək. Faylı açın və məzmunu aşağıdakı kodla əvəz edin:

Import UIKit Import Alamofire
struct RedditPost {başlıq olsun: String! subreddit edək: String! }
Class PostsTableViewController: UITableViewController {var posts = [RedditPost] ()
network = NetworkManager.sharedInstance-a icazə verin
Func viewDidLoad () üzərinə yazın {super.viewDidLoad () navigationItem.title = "Son Yazılar"
// Yazıları əldə edin və sonra cədvəli yenidən yükləyin fetchPosts {posts in self.posts = posts self.tableView.reloadData ()}}
private func fetchPosts (tamamlama: @escaping (_ ismarıc: [RedditPost]) -> Boş) -> Boşdur {// Reddit API Alamofire.request-ə sorğu göndərin ("https://api.reddit.com"). doğrulamaq (). ResponseJSON {switch in response response.result {case .success (let JSON): Let data = JSON as! [String: AnyObject] Gözətçi uşaqlara icazə versin = data ["data"]! ["Uşaqlar"] kimi? [AnyObject] else {return} var posts = [RedditPost] ()
// Reddit yazılarını nəzərdən keçirin və 0 ... children.count-1 {post = children [child] ["data"] içərisində icazə verilən postlar sırasına bir yazı təyin edin! [String: AnyObject]
posts.append (RedditPost (title: post ["title"] as! String, subreddit: "/ r /" + (post ["subreddit"] as! String))}}
DispatchQueue.main.async {tamamlanma (ismarıclar)} hal. Xəta (səhv olsun): çap (səhv)}}}
func didReceiveMemoryWarning () {super.didReceiveMemoryWarning ()} üzərinə yazmaq
// MARK: - Cədvəl görünüşünün məlumat mənbəyi func numberOfSections-ın üzərinə yaz (tableView: UITableView-də) -> Int {return 1}
// mövcud yazıların sayını qaytarın func tableView (_ tableView: UITableView, numberOfRowsInSection bölməsi: Int) -> Int {return self.posts.count}
func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {let cell = tableView.dequeueReusableCell (withIdentifier: "PostCell", for: indexPath) Post = posts [indexPath.row] as RedditPel ? .text = post.title cell.detailTextLabel? .text = post post.subreddit cell}}

FetchPosts metodu ilə Reddit API-yə GET sorğusu göndərmək üçün Alamofire istifadə edirik. Sonra cavabı təhlil edib faylın yuxarı hissəsində yaratdığımız RedditPost quruluşuna əlavə edirik. Bu, tableView-ə ötürdüyümüz məlumatları tutarlı edir.

Cihaz oflayn olduqda hadisələri idarə edin

İndi başqa bir ssenarini əhatə edək. Son Reddit yazılarına baxdığınızı və əlaqənizi itirdiyini düşünün. Nə baş verir? Bu vəziyyətdə, oflayn səhifəni yenidən göstərək.

Əvvəlki kimi, PostsTableViewController-dən OfflineViewController-a NetworkUnavailable adlı bir dərslik seqmenti yaradın. İndi bu kodu viewDidLoad metodunun sonuna əlavə edin:

network.reachability.whenUnreachable = {self.showOfflinePage () daxiletmə qabiliyyəti

İndi nəzarətçiyə aşağıdakı metodu əlavə edin:

private func showOfflinePage () -> Void {DispatchQueue.main.async {self.performSegue (withIdentifier: "NetworkUnavailable", Sender: self)}}

Bu cihazın oflayn olub-olmadığını yoxlayacaq və bu halda "Oflayn Səhifə" ni göstərəcəkdir.

Hamısı budur! Swift-də NetworkManager-lə oflayn və onlayn tədbirləri işləyə bildik.

Nəticə

Bu yazıda tətbiqinizin baş verdiyi zaman onlayn və oflayn hadisələri idarə edə biləcəyindən necə əmin olmağı düşündük. İstədiyiniz zaman bunu istənilən vaxt həyata keçirə bilərsiniz. Hər hansı bir sualınız və ya rəyiniz varsa, xahiş edirəm aşağıdakı şərhlərdə yazın.

Bu oyun meydançasının mənbə kodu GitHub-da mövcuddur.

Bu yazı ilk dəfə Pusher-də yayımlandı.