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.
Ä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.
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.
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.
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).
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.
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"
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 unreachableBlock
på Nå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.
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");
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.
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
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 sharedManager
på MTReachabilityManager
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;
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.