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.
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.
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.
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..
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).
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ă.
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"
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ă.
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");
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.
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
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;
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ă.