iOS SDK Registrere nettverksendringer med tilgjengelighetsgrad

De fleste mobile applikasjoner får tilgang til nettet av en eller annen grunn. Dette innebærer at disse programmene vil - eller bør - oppføre seg annerledes når det ikke er noen nettverkstilkobling tilgjengelig. I dette raske tipset vil jeg vise deg hvordan du oppdager nettverksgrensesnittendringer ved hjelp av Tony Millions Reachability-klasse.


Solutions

Selv om Apple gir prøvekode for overvåkning av endringer i nettverkstilgjengelighet, er Apples Reachability-klasse litt utdatert og støtter ikke ARC (Automatic Reference Counting). Hvis du bruker AFNetworking, vil du kanskje vurdere AFHTTPClient, som også lar deg overvåke nettverksgrensesnittendringer.

Imidlertid er min foretrukne løsning den fantastiske Reachability-klassen opprettet og vedlikeholdt av Tony Million. Den støtter ARC og utnytter GCD (Grand Central Dispatch). La meg vise deg hvordan du integrerer Tonys Reachability-klasse.


1. Sette opp prosjektet

Opprett et nytt prosjekt i Xcode ved å velge Enkeltvisningsprogram mal fra listen over maler (figur 1). Navn søknaden din reachability, skriv inn en bedriftsidentifikator, sett iPhone for enhetens familie, og sjekk Bruk automatisk referansetelling. Resten av avmerkingsboksene kan stå ukontrollert for dette prosjektet (figur 2). Fortell Xcode hvor du vil lagre prosjektet og klikk Skape.


Figur 1: Velge en prosjektmal
Figur 2: Konfigurere prosjektet

2. Integrerer Reachability

Trinn 1: Legge til Reachability Class

Integrering av Tony Millions Reachability-klasse er trivielt. Gå til prosjektets GitHub-side, last ned den nyeste versjonen, og dra Reachability.h / .m inn i Xcode-prosjektet (figur 3). Hvis du tar denne banen, må du sørge for at du kopierer klassefilene til Xcode-prosjektet (figur 4). Du kan også bruke CocoaPods til å legge til Reachability til prosjektet ditt.


Figur 3: Legge til Reachability Class til prosjektet ditt
Figur 4: Pass på at du kopierer klassefilene til prosjektet ditt

Trinn 2: Kobling mot systemkonfigurasjonsrammen

Reachability-klassen avhenger av Systemkonfigurasjon rammeverk for noen av dens funksjonalitet. Med ditt prosjekt valgt i Prosjektnavigator, velg reachability mål i listen over mål, åpne Bygg faser kategorien, og utvide Link binær med biblioteker skuff. Klikk på pluss-knappen og søk etter SystemConfiguration.framework (figur 5).


Figur 5: Koble prosjektet ditt mot systemkonfigurasjonsrammen

3. Reachability Basics

De reachability klassen gir to måter å overvåke endringer i nettverks tilgjengelighet: blokker og varsler. La meg vise deg hvordan dette fungerer.

Trinn 1: Importerer Reachability.h

For å holde ting enkelt, vil vi legge til nåbarhetslogikken til programdelegatet. Begynn med å legge til en importoppgave for Reachability.h til MTAppDelegate.m som vist under.

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

Trinn 2: Blokker

Vi må først lage en forekomst av reachability klasse i applikasjons: didFinishLaunchingWithOptions: (MTAppDelegate.m) som vist under. Vi setter da reachableBlock og unreachableBlockreachability forekomst. De reachableBlock påberopes når nettverkssituasjonen endres fra utilgjengelig til nås. Det motsatte gjelder for unreachableBlock. Det er nøkkelen til å sende reachability Installer en melding av startNotifier slik at den vet at den skal begynne å overvåke for endringsendringer. Det er også viktig å vite at samtalen til startNotifier forårsaker reachability eksempel å beholde seg selv, noe som betyr at du ikke trenger å lagre en referanse til reachability gjenstand. Jeg er imidlertid ikke en fan av denne tilnærmingen, og vil vise deg en alternativ løsning litt senere.

 - (BOOL) søknad: (UIApplication *) søknad didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Initialize Reachability Reachability * nåbarhet = [Reachability reachabilityWithHostname: @ "www.google.com"]; reachability.reachableBlock = ^ (Reachability * nåbarhet) NSLog (@ "Nettverket kan nås."); ; reachability.unreachableBlock = ^ (Reachability * nåbarhet) NSLog (@ "Nettverket er ikke tilgjengelig."); ; // Start Overvåking [Nåværende startnotiver]; // Initialiser View Controller self.viewController = [[MTViewController alloker] initWithNibName: @ "MTViewController" bundle: null]; // Initialiser Window self.window = [[UIWindow alloc] initWithFrame: grenser for [[UIScreen mainScreen]]; // Konfigurer Window [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; returnere JA; 

Før vi tar en titt på varsler, må jeg understreke at de tilgjengelige og unreachable blokkene er påkalt på en bakgrunnstråd. Vær oppmerksom på dette når du må oppdatere programmets brukergrensesnitt når nettverksgrensesnittet endres.

Trinn 3: Meldinger

Fordelen med å bruke varsler for nåbarhetsendringer er at ethvert objekt i søknaden din kan registrere seg som observatør for disse varslene. I motsetning til bruken av blokker, blir meldingsmeldingene lagt ut og levert på hovedtråden. Som du kan se nedenfor, i applikasjons: didFinishLaunchingWithOptions:, vi lager en forekomst av reachability klasse og fortelle det å begynne å overvåke for nettverksendringer.

 - (BOOL) søknad: (UIApplication *) søknad didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Initialize Reachability Reachability * nåbarhet = [Reachability reachabilityWithHostname: @ "www.google.com"]; // Start Overvåking [Nåværende startnotiver]; // Initialiser View Controller self.viewController = [[MTViewController alloker] initWithNibName: @ "MTViewController" bundle: null]; // Initialiser Window self.window = [[UIWindow alloc] initWithFrame: grenser for [[UIScreen mainScreen]]; // Konfigurer Window [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; returnere JA; 

For eksempel, hvis visningskontrolleren må informeres om endringer i nettverkssituasjonen, må vi legge den til som observatør av varslene på reachability eksempel innlegg. Åpen MTViewController.m, legg til en importerklæring for Reachability.h, og oppdater initWithNibName: bundle: som vist under.

 #import "MTViewController.h" #import "Reachability.h"
 - (id) initWithNibName: (NSString *) nibNameOrNil bundle: (NSBundle *) nibBundleOrNil self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil]; hvis (selv) // Legg til observatør [[NSNotificationCenter defaultCenter] addObserver: selector: @selector (reachabilityDidChange :) navn: kReachabilityChangedNotification object: null];  returner selv; 

Hver gang nettverksgrensesnittet endres, reachabilityDidChange: er påkalt og visningskontrolleren kan svare på riktig måte. De gjenstand egenskapen til varselet er reachability eksempel som postet varselet. De reachability klassen gir en rekke nyttige instansmetoder, for eksempel isReachable, isReachableViaWWAN, og isReachableViaWiFi. Du kan til og med fortelle reachability eksempelvis om det burde vurderes WWAN som uoppnåelig ved å sette inn reachableOnWWAN eiendom tilsvarende.

 - (void) reachabilityDidChange: (NSNotification *) varsel Reachability * reachability = (Reachability *) [varselobjekt]; hvis ([nåbarhet er tilgjengelig]) NSLog (@ "Reachable");  else NSLog (@ "Unreachable"); 

4. Reachability Manager

For programmer som krever en nettverkstilkobling, bruker jeg vanligvis en alternativ tilnærming for å administrere nåbarhet. Jeg oppretter en egen klasse som heter ReachabilityManager som adopterer singleton mønsteret. Singleton-objektet håndterer a reachability eksempel og gir en rekke nyttige klassemetoder. La meg gå deg gjennom internaler i denne klassen.

Trinn 1: Grensesnitt

Som jeg nevnte, den MTReachabilityManager klassen adopterer singleton mønsteret og gir tilgang til singleton objektet gjennom sharedManager klassemetode. Dette er nyttig hvis et objekt trenger direkte tilgang til reachability forekommer at singleton-objektet klarer seg.

Gjennom en rekke klassemetoder kan objekter spørre tilgjengelighetslederen om det nåværende nettverksgrensesnittet. I tillegg kan objekter fortsatt legge til seg som observatører for kReachabilityChangedNotification varsler som vi så tidligere.

 #importere  @ klasse Reachability; @interface MTReachabilityManager: NSObject @property (sterk, ikkeatomisk) Reachability * reachability; #pragma mark - #pragma mark Deler Manager + (MTReachabilityManager *) sharedManager; #pragma mark - #pragma mark Klassemetoder + (BOOL) isReachable; + (BOOL) er uoppnåelig; + (BOOL) isReachableViaWWAN; + (BOOL) isReachableViaWiFi; @slutt

Trinn 2: Implementering

Gjennomføringen av MTReachabilityManager er ikke for overraskende. Hvis du ikke er kjent med singleton mønsteret, så implementeringen av sharedManager kan virke litt rart. Selv om MTReachabilityManager klassen bruker singleton mønsteret, er det teknisk mulig å lage forekomster av klassen. Vi kunne forhindre dette ved å sjekke verdien av _sharedManager i i det, men jeg antar at den som bruker MTReachabilityManager klassen har tatt en titt på klassens grensesnittfil som avslører at den adopterer singleton-mønsteret.

 #import "MTReachabilityManager.h" #import "Reachability.h" @implementation MTReachabilityManager #pragma mark - #pragma mark Default Manager + (MTReachabilityManager *) sharedManager static MTReachabilityManager * _sharedManager = null; statisk dispatch_once_t onceToken; dispatch_once (& onceToken, ^ _sharedManager = [[selvtillit] init];); returnere _sharedManager;  #pragma mark - #pragma markere Memory Management - (void) dealloc // Stop Notifier hvis (_reachability) [_reachability stopNotifier];  #pragma mark - #pragma mark Klassemetoder + (BOOL) isReachable return [[[MTReachabilityManager sharedManager] nåbarhet] isReachable];  + (BOOL) isUnreachable return! [[[MTReachabilityManager sharedManager] nåbarhet] isReachable];  + (BOOL) isReachableViaWWAN return [[[[MTReachabilityManager sharedManager] nåbarhet] isReachableViaWWAN];  + (BOOL) isReachableViaWiFi retur [[[MTReachabilityManager sharedManager] nåbarhet] isReachableViaWiFi];  #pragma mark - #pragma mark Private Initialization - (id) init self = [super init]; hvis (selv) // Initialiserer Reachability self.reachability = [Reachability reachabilityWithHostname: @ "www.google.com"]; // Start Overvåking [self.reachability startNotifier];  returner selv;  @slutt

Hvis du bestemmer deg for å vedta denne alternative tilnærmingen, og bruk en rekkevidde manager som administrerer en forekomst av reachability klasse, så ikke glem å instansere singleton-objektet når søknaden lanseres. Du kan gjøre det ved å ringe sharedManagerMTReachabilityManager klasse.

 - (BOOL) søknad: (UIApplication *) søknad didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Instantiate Shared Manager [MTReachabilityManager sharedManager]; // Initialiser View Controller self.viewController = [[MTViewController alloker] initWithNibName: @ "MTViewController" bundle: null]; // Initialiser Window self.window = [[UIWindow alloc] initWithFrame: grenser for [[UIScreen mainScreen]]; // Konfigurer Window [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; returnere JA; 

Konklusjon

Å varsle brukeren eller oppdatere programmets brukergrensesnitt når nettverksgrensesnittet endres, gir ikke bare en bedre brukeropplevelse, men Apple krever at du gjør dette hvis programmet din er avhengig av nettverkstilkobling. Det tar litt innsats, men Reachability-klassen gjør det mye enklere.