IOS SDK Upptäcka nätverksändringar med Reachability

De flesta mobila applikationer går åt webben av någon anledning eller annan. Detta innebär att dessa applikationer kommer att - eller borde - beter sig olika när ingen nätverksanslutning är tillgänglig. I det här snabba tipset visar jag hur du upptäcker ändringar i nätverksgränssnittet med hjälp av Tony Millions Reachability-klass.


lösningar

Även om Apple tillhandahåller provkod för övervakning av ändringar i nätverks tillgänglighet är Apples Reachability-klass lite föråldrad och stöder inte ARC (Automatic Reference Counting). Om du använder AFNetworking kanske du vill överväga AFHTTPClient, vilket också låter dig övervaka ändringar i nätverksgränssnittet.

Men min föredragna lösning är den underbara Reachability-klassen skapad och underhållen av Tony Million. Den stöder ARC och använder GCD (Grand Central Dispatch). Låt mig visa dig hur du kan integrera Tonys Reachability-klass.


1. Ställa in projektet

Skapa ett nytt projekt i Xcode genom att välja Enkel visningsprogram mall från listan med mallar (figur 1). Namn på din ansökan Nåbarhet, Ange en företagsidentifierare, inställd iPhone för enhetsfamiljen och kontrollera Använd automatisk referensräkning. Resten av kryssrutorna kan lämnas obekant för detta projekt (figur 2). Berätta Xcode där du vill spara projektet och klicka Skapa.


Figur 1: Välja en projektmall
Figur 2: Konfigurera projektet

2. Integrerande Reachability

Steg 1: Lägga till Reachability Class

Att integrera Tony Millions Reachability-klass är trivial. Besök projektets GitHub-sida, hämta den senaste versionen och dra Reachability.h / .m in i ditt Xcode-projekt (figur 3). Om du tar den här sökvägen, se till att kopiera klassfilerna till ditt Xcode-projekt (figur 4). Du kan också använda CocoaPods för att lägga till Reachability för ditt projekt.


Figur 3: Lägga till Reachability Class till ditt projekt
Figur 4: Se till att kopiera klassfilerna till ditt projekt

Steg 2: Koppling mot systemkonfigurationsramen

Reachability-klassen beror på Systemkonfiguration ram för vissa funktioner. Med ditt projekt valt i Project Navigator, Välj Nåbarhet mål i listan över mål, öppna Bygga faser fliken och expandera Länk binär med bibliotek låda. Klicka på plusknappen och sök efter SystemConfiguration.framework (figur 5).


Figur 5: Länk ditt projekt mot systemkonfigurationsramen

3. Reachability Basics

De Nåbarhet klassen ger två sätt att övervaka förändringar i nätverks tillgänglighet: block och meddelanden. Låt mig visa dig hur det här fungerar.

Steg 1: Importera Reachability.h

För att hålla sakerna enkla, lägger vi till tillgänglighetslogiken till programdelegationen. Börja med att lägga till en importdeklaration för Reachability.h till MTAppDelegate.m enligt nedanstående.

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

Steg 2: Block

Vi behöver först skapa en instans av Nåbarhet klass i applikations: didFinishLaunchingWithOptions: (MTAppDelegate.m) enligt nedanstående. Vi ställer sedan in reachableBlock och unreachableBlockNåbarhet exempel. De reachableBlock påkallas när nätverks tillgängligheten ändras från oåtkomligt för att nås. Det omvända gäller för unreachableBlock. Det är nyckeln att skicka Nåbarhet Exempel ett meddelande om startNotifier så att den vet att den bör börja övervaka förändringsförändringar. Det är också viktigt att veta att samtalet till startNotifier orsakar Nåbarhet exempel att behålla sig, vilket innebär att du inte behöver lagra en referens till Nåbarhet objekt. Jag är dock inte en fan av detta tillvägagångssätt och kommer visa dig en alternativ lösning lite senare.

 - (BIA) ansökan: (UIApplication *) ansökan gjordeFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Initialis Reachability Reachability * reachability = [Reachability reachabilityWithHostname: @ "www.google.com"]; reachability.reachableBlock = ^ (Reachability * reachability) NSLog (@ "Nätverket är nåbart."); ; reachability.unreachableBlock = ^ (Reachability * reachability) NSLog (@ "Nätverket är oåtkomligt."); ; // Starta övervakning [reachability startNotifier]; // Initiera View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bunt: noll]; // Initiera fönster self.window = [[UIWindow alloc] initWithFrame: gränser för [[UIScreen mainScreen]]; // Konfigurera fönstret [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; returnera JA; 

Innan vi tittar på meddelanden måste jag betona att de nåbara och oåtkomliga blocken är påkallad på en bakgrundsgänga. Tänk på detta när du behöver uppdatera programmets användargränssnitt när nätverksgränssnittet ändras.

Steg 3: Meddelanden

Fördelen med att använda meddelanden för ändringar av nåbarhet är att alla objekt i din ansökan kan registrera sig som observatör för dessa meddelanden. I motsats till användningen av block, rapporteras nåbarhetsmeddelandena och levereras på huvudtråden. Som du kan se nedan, i applikations: didFinishLaunchingWithOptions:, vi skapar en förekomst av Nåbarhet klass och berätta för att börja övervaka nätverksändringar.

 - (BIA) ansökan: (UIApplication *) ansökan gjordeFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Initialis Reachability Reachability * reachability = [Reachability reachabilityWithHostname: @ "www.google.com"]; // Starta övervakning [reachability startNotifier]; // Initiera View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bunt: noll]; // Initiera fönster self.window = [[UIWindow alloc] initWithFrame: gränser för [[UIScreen mainScreen]]; // Konfigurera fönstret [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; returnera JA; 

Till exempel, om visningsansvarig måste informeras om ändringar i nätverks tillgänglighet, måste vi lägga till det som observatör av meddelandena Nåbarhet instansstolpar. Öppna MTViewController.m, lägg till en importrapport för Reachability.h, och uppdatera initWithNibName: bunt: enligt nedanstående.

 #import "MTViewController.h" #import "Reachability.h"
 - (id) initWithNibName: (NSString *) nibNameOrNil bunt: (NSBundle *) nibBundleOrNil self = [super initWithNibName: nibNameOrNil bunt: nibBundleOrNil]; om (själv) // Lägg till Observer [[NSNotificationCenter defaultCenter] addObserver: självväljare: @selector (reachabilityDidChange :) namn: kReachabilityChangedNotification object: nil];  återvänd själv 

Varje gång nätverksgränssnittet ändras, reachabilityDidChange: är påkallad och vykontrollanten kan svara på lämpligt sätt. De objekt egenskapen för anmälan är den Nåbarhet exempel som skickade meddelandet. De Nåbarhet klassen ger ett antal användbara instansmetoder, till exempel isReachable, isReachableViaWWAN, och isReachableViaWiFi. Du kan till och med berätta för Nåbarhet exempel om det borde överväga WWAN som oåtkomligt genom att ställa in reachableOnWWAN egendom i enlighet därmed.

 - (tomt) reachabilityDidChange: (NSNotification *) notification Reachability * reachability = (Reachability *) [anmälningsobjekt]; om ([reachability isReachable]) NSLog (@ "Reachable");  else NSLog (@ "Unreachable"); 

4. Reachability Manager

För applikationer som kräver en nätverksanslutning använder jag vanligtvis ett alternativt sätt att hantera nåbarhet. Jag skapar en separat klass som heter ReachabilityManager som adopterar singleton mönstret. Singleton-objektet hanterar a Nåbarhet exempel och ger ett antal användbara klassmetoder. Låt mig gå dig igenom internalerna i den här klassen.

Steg 1: Gränssnitt

Som jag nämnde, MTReachabilityManager klass adopterar singleton mönstret och det ger åtkomst till singleton objektet genom sharedManager klassmetod. Detta är användbart om ett objekt behöver direkt åtkomst till nåbarhet Exempel på att singleton-objektet hanteras.

Genom ett antal klassmetoder kan objekt begära tillgänglighetshanteraren om det aktuella nätverksgränssnittet. Dessutom kan objekt fortfarande lägga sig som observatörer för kReachabilityChangedNotification anmälningar som vi såg tidigare.

 #importera  @ class Reachability; @interface MTReachabilityManager: NSObject @property (stark, icke-atomisk) Reachability * reachability; #pragma markera - #pragma markera Shared Manager + (MTReachabilityManager *) sharedManager; #pragma mark - #pragma markeringsmetoder + (BOOL) isReachable; + (BOOL) ärUåterkallelig; + (BOOL) isReachableViaWWAN; + (BOOL) isReachableViaWiFi; @slutet

Steg 2: Implementering

Genomförandet av MTReachabilityManager är inte för förvånande. Om du inte är bekant med singleton mönstret, då genomförandet av sharedManager kan verka lite udda. Även om MTReachabilityManager klassen använder sig av singleton mönstret, det är tekniskt möjligt att skapa instanser av klassen. Vi kunde förhindra detta genom att kontrollera värdet av _sharedManager i i det, men jag antar att den som använder MTReachabilityManager klassen har tittat på klassens gränssnittsfil och avslöjar att den adopterar singletonmönstret.

 #import "MTReachabilityManager.h" #import "Reachability.h" @implementation MTReachabilityManager #pragma mark - #pragma markera Standard Manager + (MTReachabilityManager *) sharedManager static MTReachabilityManager * _sharedManager = nil; statisk avsändning_once_t onceToken; dispatch_once (& onceToken, ^ _sharedManager = [[self alloc] init];); returnera _sharedManager;  #pragma markera - #pragma markera Memory Management - (void) dealloc // Stop Notifier om (_reachability) [_reachability stopNotifier];  #pragma mark - #pragma markeringsmetoder + (BOOL) isReachable return [[[MTReachabilityManager sharedManager] reachability] isReachable];  + (BOOL) isUnreachable return! [[[MTReachabilityManager sharedManager] reachability] isReachable];  + (BOOL) isReachableViaWWAN return [[[MTReachabilityManager sharedManager] reachability] isReachableViaWWAN];  + (BOOL) isReachableViaWiFi return [[[MTReachabilityManager sharedManager] reachability] isReachableViaWiFi];  #pragma markera - #pragma markera Privat Initialisering - (id) init self = [super init]; om (själv) // Initialisera Reachability self.reachability = [Reachability reachabilityWithHostname: @ "www.google.com"]; // Starta övervakning [self.reachability startNotifier];  återvänd själv  @slutet

Om du bestämmer dig för att anta detta alternativa tillvägagångssätt och använd en handlingschef som hanterar en instans av Nåbarhet klass, glöm inte att instansera singleton-objektet när din ansökan startar. Du kan göra det genom att ringa sharedManagerMTReachabilityManager klass.

 - (BOOL) ansökan: (UIApplication *) ansökan didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Instantiate Shared Manager [MTReachabilityManager sharedManager]; // Initiera View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bunt: noll]; // Initiera fönster self.window = [[UIWindow alloc] initWithFrame: gränser för [[UIScreen mainScreen]]; // Konfigurera fönstret [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; returnera JA; 

Slutsats

Om du anmäler användaren eller uppdaterar programmets användargränssnitt när nätverksgränssnittet ändras, resulterar inte bara en bättre användarupplevelse, men Apple kräver att du gör detta om din ansökan är beroende av nätverksanslutning. Det gör en viss insats, men Reachability-klassen gör det mycket lättare.