iOS SDK Detectarea modificărilor de rețea cu posibilitatea de a ajunge

Cele mai multe aplicații mobile accesează webul dintr-un motiv sau altul. Aceasta implică faptul că aceste aplicații vor - sau ar trebui - să se comporte diferit atunci când nu este disponibilă nicio conexiune la rețea. În acest sfat rapid, vă voi arăta cum să detectați modificările interfeței de rețea folosind clasa de recrutare Tony Million.


soluţii

Chiar dacă Apple oferă un eșantion de cod pentru monitorizarea modificărilor în disponibilitatea rețelei, clasa Apple Reachability este puțin depășită și nu acceptă ARC (Automatic Counting Counting). Dacă utilizați AFNetworking, atunci vă recomandăm să luați în considerare AFHTTPClient, care vă permite să monitorizați și modificările interfeței de rețea.

Cu toate acestea, soluția mea preferată este minunata clasă Reachability creată și întreținută de Tony Million. Acesta susține ARC și utilizează GCD (Grand Central Dispatch). Permiteți-mi să vă arăt cum să integrați clasa lui Tony Reachability.


1. Configurarea proiectului

Creați un nou proiect în Xcode selectând Vizualizare individuală șablon din lista de șabloane (figura 1). Denumiți aplicația accesibilitate, introduceți un identificator al companiei, setați iPhone pentru familia de dispozitive și verificați Utilizați numărarea automată a referințelor. Restul casetelor de selectare pot fi lăsate neschimbate pentru acest proiect (figura 2). Spuneți Xcode unde doriți să salvați proiectul și faceți clic pe acesta Crea.


Figura 1: Alegerea unui șablon de proiect
Figura 2: Configurarea proiectului

2. Integrarea capacității de reintegrare

Pasul 1: Adăugarea clasei de recuperare

Integrarea clasei Tony Million Reachability este banală. Vizitați pagina GitHub a proiectului, descărcați cea mai recentă versiune și trageți Reachability.h / .m în proiectul dvs. Xcode (figura 3). Dacă luați această cale, asigurați-vă că ați copiat fișierele de clasă în proiectul dvs. Xcode (figura 4). Puteți utiliza, de asemenea, CocoaPods pentru a adăuga Reachability la proiectul dvs..


Figura 3: Adăugarea clasei de accesibilitate la proiectul dvs.
Figura 4: Asigurați-vă că ați copiat fișierele de clasă în proiectul dvs.

Pasul 2: Legarea în fața cadrului de configurare a sistemului

Clasa Reachability depinde de Configuratia sistemului cadru pentru unele dintre funcționalitățile sale. Cu proiectul dvs. selectat în Project Navigator, selectează accesibilitate țintă în lista de obiective, deschideți Construiți faze filă și extindeți Link binar cu bibliotecile sertar. Faceți clic pe butonul plus și căutați SystemConfiguration.framework (figura 5).


Figura 5: Legați-vă proiectul împotriva cadrului de configurare a sistemului

3. Noțiuni de bază privind disponibilitatea

accesibilitate clasa oferă două moduri de a monitoriza modificările în disponibilitatea rețelei: blocuri și notificări. Permiteți-mi să vă arăt cum funcționează.

Pasul 1: Importarea accesibilității.h

Pentru a menține lucrurile simple, vom adăuga logica accesibilității la delegatul aplicației. Începeți prin adăugarea unei declarații de import pentru Reachability.h la MTAppDelegate.m așa cum se arată mai jos.

 #import "MTAppDelegate.h" #import "Reachability.h" #import "MTViewController.h"

Pasul 2: Blochează

Trebuie mai întâi să creați o instanță a accesibilitate clasă în aplicare: didFinishLaunchingWithOptions: (MTAppDelegate.m) așa cum se arată mai jos. Apoi am setat reachableBlock și unreachableBlock pe accesibilitate instanță. reachableBlock este invocată atunci când disponibilitatea rețelei se modifică de la un nivel accesibil la cel ușor accesibil. Reversul este valabil pentru unreachableBlock. Este cheia pentru a trimite accesibilitate exemplu un mesaj de startNotifier astfel încât să știe că ar trebui să înceapă monitorizarea pentru modificările de accesibilitate. De asemenea, este important să știți că apelul către startNotifier cauzează accesibilitate exemplu pentru a se menține, ceea ce înseamnă că nu este necesar să stocați o referință la accesibilitate obiect. Cu toate acestea, nu sunt un fan al acestei abordări și vă va arăta o soluție alternativă un pic mai târziu.

 - (BOOL): aplicație (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Initialize Reachability Reachability * accesibilitate = [Reachability reachabilityWithHostname: @ "www.google.com"]; reachability.reachableBlock = ^ (Reachability * accesibilitate) NSLog (@ Rețeaua este accesibilă); ; reachability.unreachableBlock = ^ (Reachability * accesibilitate) NSLog (@ "Rețeaua este inaccesibilă"); ; // Începeți monitorizarea [reachability startNotifier]; // Inițializați controlerul de vizualizare self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize fereastra self.window = [[UIWindow alocare] initWithFrame: [[UIScreen mainScreen] limite]]; // Configurați fereastra [auto.window setRootViewController: self.viewController]; [auto.window makeKeyAndVisible]; reveniți DA; 

Înainte de a arunca o privire la notificări, trebuie să subliniez faptul că blocurile accesibile și inaccesibile sunt invocate pe un fir de fundal. Țineți cont de acest lucru atunci când trebuie să actualizați interfața de utilizare a aplicației atunci când interfața de rețea se modifică.

Pasul 3: Notificări

Avantajul utilizării notificărilor pentru modificări de accesibilitate este că orice obiect din aplicația dvs. se poate înregistra ca observator al acestor notificări. Spre deosebire de utilizarea blocurilor, notificările privind disponibilitatea sunt afișate și difuzate pe firul principal. După cum puteți vedea mai jos, în aplicare: didFinishLaunchingWithOptions:, vom crea o instanță a accesibilitate clasați și spuneți-i să înceapă monitorizarea pentru modificările de rețea.

 - (BOOL): aplicație (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Initialize Reachability Reachability * accesibilitate = [Reachability reachabilityWithHostname: @ "www.google.com"]; // Începeți monitorizarea [reachability startNotifier]; // Inițializați controlerul de vizualizare self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize fereastra self.window = [[UIWindow alocare] initWithFrame: [[UIScreen mainScreen] limite]]; // Configurați fereastra [auto.window setRootViewController: self.viewController]; [auto.window makeKeyAndVisible]; reveniți DA; 

De exemplu, dacă controlorul de vizualizare trebuie să fie informat cu privire la modificările disponibilității rețelei, atunci trebuie să îl adăugăm ca observator al notificărilor accesibilitate instanțe. Deschis MTViewController.m, adăugați o declarație de import pentru Reachability.h, și actualizare initWithNibName: pachet: așa cum se arată mai jos.

 #import "MTViewController.h" #import "Reachability.h"
 - (id) initWithNibName: (NSString *) pachet nibNameOrNil: (NSBundle *) nibBundleOrNil auto = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil]; dacă (auto) // Add Observer [[NSNotificationCenter defaultCenter] addObserver: selector auto: @selector (accesibilDidChange :) nume: kReachabilityChangedNotification obiect: nil];  întoarce-te; 

De fiecare dată când se modifică interfața de rețea, reachabilityDidChange: este invocată și controlerul de vizualizare poate răspunde în mod corespunzător. obiect proprietatea notificării este accesibilitate instanța care a trimis notificarea. accesibilitate clasa oferă o serie de metode de instanță utile, cum ar fi isReachable, isReachableViaWWAN, și isReachableViaWiFi. Puteți spune chiar accesibilitate dacă ar trebui să considere WWAN ca fiind imposibil de fixat reachableOnWWAN proprietate în consecință.

 - (void) reachabilityDidChange: (NSNotification *) notificare Reachability * accesibilitate = (Reachability *) [obiect notificare]; dacă [[accesibilitatea este accesibilă]) NSLog (@ "Reachable");  altceva NSLog (@ "Unreachable"); 

4. Manager de recuperare

Pentru aplicațiile care necesită o conexiune la rețea, de obicei folosesc o abordare alternativă pentru gestionarea accesibilității. Creez o clasă separată numită ReachabilityManager care adoptă modelul singleton. Obiectul singleton gestionează a accesibilitate exemplu și oferă un număr de metode de clasă utile. Lasă-mă să te trec prin interiorul acestei clase.

Pasul 1: Interfața

După cum am menționat, MTReachabilityManager clasa adoptă modelul singleton și oferă acces la obiectul singleton prin sharedManager clasă. Acest lucru este util dacă un obiect are nevoie de acces direct la accesibilități exemplu, că singurul obiect gestionează.

Printr-o serie de metode de clasă, obiectele pot solicita administratorului de disponibilitate despre interfața de rețea curentă. În plus, obiectele se pot adăuga în continuare ca observatori pentru kReachabilityChangedNotification după cum am văzut mai devreme.

 #import  @ clasă Reachability; @interface MTReachabilityManager: NSObject @property (puternic, nonatomic) Reachability * accesibilitate; Marcajul #pragma - marca #pragma Manager partajat + (MTReachabilityManager *) sharedManager; #pragma mark - #pragma marca Metode de clasă + (BOOL) isReachable; + (BOOL) este imposibil de atins; + (BOOL) esteReachableViaWWAN; + (BOOL) esteReachableViaWiFi; @Sfârșit

Pasul 2: Implementarea

Implementarea sistemului MTReachabilityManager nu este prea surprinzător. Dacă nu sunteți familiarizați cu modelul singleton, atunci implementarea lui sharedManager ar putea părea un pic ciudat. Chiar dacă MTReachabilityManager clasa utilizează modelul singleton, este posibil din punct de vedere tehnic să creați instanțe ale clasei. Am putea preveni acest lucru prin verificarea valorii _sharedManager în init, dar presupun că oricine folosește MTReachabilityManager clasa a aruncat o privire la fișierul de interfață al clasei, dezvăluind că adoptă modelul singleton.

 #import "MTReachabilityManager.h" #import "Reachability.h" @implementarea MTReachabilityManager #pragma marca - #pragma marca Default Manager + (MTReachabilityManager *) sharedManager static MTReachabilityManager * _sharedManager = nil; static dispatch_once_t onceToken; dispatch_once (& onceToken, ^ _sharedManager = [[self alloc] init];); returnați _sharedManager;  #pragma marcă - #pragma marca Memory Management - (void) dealloc // Stop Notifier dacă (_reachability) [_reachability stopNotifier];  #pragma marcă - #pragma marca Metode de clasă + (BOOL) esteReachable return [[MTReachabilityManager sharedManager] accesibilitate] esteReachable];  + (BOOL) esteUnreachable retur! [[MTReachabilityManager sharedManager] accesibilitate] esteReachable];  + (BOOL) esteReachableViaWWAN retur [[MTReachabilityManager sharedManager] accesibilitate] isReachableViaWWAN];  + (BOOL) esteReachableViaWiFi retur [[MTReachabilityManager sharedManager] accesibilitate] isReachableViaWiFi];  #pragma marcă - #pragma marca Inițializare privată - (id) init auto = [super init]; dacă (self) // Initialize Reachability self.reachability = [Accesibilitate la accesibilitateWithHostname: @ "www.google.com"]; // Începeți monitorizarea [self.reachability startNotifier];  întoarce-te;  @Sfârșit

Dacă decideți să adoptați această abordare alternativă și să utilizați un manager de accesibilitate care gestionează o instanță a accesibilitate class, atunci nu uitați să instanțiați obiectul singleton atunci când aplicația dvs. se lansează. Puteți face acest lucru sunând sharedManager pe MTReachabilityManager clasă.

 - (BOOL): aplicație (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Instantiate Shared Manager [MTReachabilityManager sharedManager]; // Inițializați controlerul de vizualizare self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize fereastra self.window = [[UIWindow alocare] initWithFrame: [[UIScreen mainScreen] limite]]; // Configurați fereastra [auto.window setRootViewController: self.viewController]; [auto.window makeKeyAndVisible]; reveniți DA; 

Concluzie

Notificând utilizatorul sau actualizând interfața de utilizator a aplicației atunci când schimbarea interfeței de rețea nu are ca rezultat numai o experiență mai bună a utilizatorului, Apple cere să faceți acest lucru dacă aplicația se bazează pe conectivitate în rețea. E nevoie de ceva efort, dar clasa Reachability o face mult mai ușoară.

Cod