Die meisten mobilen Anwendungen greifen aus irgendeinem Grund auf das Internet zu. Dies bedeutet, dass sich diese Anwendungen anders verhalten werden oder sollten, wenn keine Netzwerkverbindung verfügbar ist. In diesem kurzen Tipp zeige ich Ihnen, wie Sie Änderungen an der Netzwerkschnittstelle mithilfe der Reachability-Klasse von Tony Million erkennen können.
Obwohl Apple Beispielcode für die Überwachung von Änderungen der Netzwerkverfügbarkeit bereitstellt, ist die Reachability-Klasse von Apple etwas veraltet und unterstützt ARC (Automatic Reference Counting) nicht. Wenn Sie AFNetworking verwenden, sollten Sie dies in Betracht ziehen AFHTTPClient
, So können Sie auch Änderungen der Netzwerkschnittstelle überwachen.
Meine bevorzugte Lösung ist jedoch die wundervolle Erreichbarkeitsklasse, die von Tony Million erstellt und verwaltet wird. Es unterstützt ARC und nutzt GCD (Grand Central Dispatch). Lassen Sie mich Ihnen zeigen, wie Sie die Erreichbarkeitsklasse von Tony integrieren können.
Erstellen Sie ein neues Projekt in Xcode, indem Sie das auswählen Einzelansicht-Anwendung Vorlage aus der Liste der Vorlagen (Abbildung 1). Benennen Sie Ihre Bewerbung Erreichbarkeit, Geben Sie eine Firmenkennung ein iPhone für die Gerätefamilie und überprüfen Sie Verwenden Sie die automatische Referenzzählung. Die übrigen Kontrollkästchen können für dieses Projekt deaktiviert bleiben (Abbildung 2). Teilen Sie Xcode mit, wo Sie das Projekt speichern möchten, und klicken Sie auf Erstellen.
Die Integration der Erreichbarkeitsklasse von Tony Million ist trivial. Besuchen Sie die GitHub-Seite des Projekts, laden Sie die neueste Version herunter und ziehen Sie sie Erreichbarkeit.h / .m in Ihr Xcode-Projekt (Abbildung 3). Wenn Sie diesen Pfad verwenden, kopieren Sie die Klassendateien in Ihr Xcode-Projekt (Abbildung 4). Sie können CocoaPods auch verwenden, um Ihrem Projekt die Erreichbarkeit hinzuzufügen.
Die Erreichbarkeitsklasse ist abhängig von der Systemkonfiguration Rahmen für einen Teil seiner Funktionalität. Mit Ihrem Projekt in der Projektnavigator, wähle aus Erreichbarkeit Ziel in der Liste der Ziele, öffnen Sie die Baue Phasen Registerkarte und erweitern Sie die Binäres mit Bibliotheken verknüpfen Schublade. Klicken Sie auf das Pluszeichen und suchen Sie nach SystemConfiguration.framework (Abbildung 5).
Das Erreichbarkeit
Die Klasse bietet zwei Möglichkeiten, um Änderungen der Netzwerkverfügbarkeit zu überwachen: Blöcke und Benachrichtigungen. Lassen Sie mich Ihnen zeigen, wie das funktioniert.
Der Einfachheit halber fügen wir dem Anwendungsdelegierten die Erreichbarkeitslogik hinzu. Fügen Sie zunächst eine Importanweisung für hinzu Erreichbarkeit.h zu MTAppDelegate.m Wie nachfolgend dargestellt.
#import "MTAppDelegate.h" #import "Erreichbarkeit.h" #import "MTViewController.h"
Wir müssen zuerst eine Instanz von erstellen Erreichbarkeit
Klasse in Anwendung: didFinishLaunchingWithOptions:
(MTAppDelegate.m) Wie nachfolgend dargestellt. Dann setzen wir die reachableBlock
und nicht erreichbarBlock
auf der Erreichbarkeit
Beispiel. Das reachableBlock
wird aufgerufen, wenn sich die Netzwerkverfügbarkeit von nicht erreichbar in erreichbar ändert. Das Gegenteil gilt für die nicht erreichbarBlock
. Es ist der Schlüssel zum Senden Erreichbarkeit
Beispiel eine Nachricht von startNotifier
damit es weiß, dass es mit der Überwachung auf Änderungen der Erreichbarkeit beginnen sollte. Es ist auch wichtig zu wissen, dass der Anruf zu startNotifier
verursacht das Erreichbarkeit
Instanz, um sich zu behalten, was bedeutet, dass Sie keinen Verweis auf die speichern müssen Erreichbarkeit
Objekt. Ich bin jedoch kein Fan dieses Ansatzes und werde Ihnen später eine alternative Lösung zeigen.
- (BOOL) Anwendung: (UIApplication *) Anwendung didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Initialisieren der Erreichbarkeit Erreichbarkeit * Reachability = [Erreichbarkeit ReachabilityWithHostname: @ "www.google.com"]; reachability.reachableBlock = ^ (Erreichbarkeit * Erreichbarkeit) NSLog (@ "Netzwerk ist erreichbar."); ; reachability.unreachableBlock = ^ (Erreichbarkeit * Erreichbarkeit) NSLog (@ "Netzwerk ist nicht erreichbar."); ; // Überwachung starten [Erreichbarkeit startNotifier]; // Initialize View Controller self.viewController = [[MTViewController-Zuordnung] initWithNibName: @ "MTViewController" -Bündel: nil]; // Fenster initialisieren self.window = [[UIWindow-Zuordnung] initWithFrame: [[UIScreen-MainScreen] -Begrenzungen]]; // Fenster konfigurieren [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; JA zurückgeben;
Bevor wir uns Benachrichtigungen ansehen, muss ich betonen, dass die erreichbaren und nicht erreichbaren Blöcke in einem Hintergrundthread aufgerufen werden. Beachten Sie dies, wenn Sie die Benutzeroberfläche Ihrer Anwendung aktualisieren müssen, wenn sich die Netzwerkschnittstelle ändert.
Der Vorteil der Verwendung von Benachrichtigungen für Änderungen der Erreichbarkeit besteht darin, dass sich jedes Objekt in Ihrer Anwendung als Beobachter für diese Benachrichtigungen registrieren kann. Im Gegensatz zur Verwendung von Blöcken werden die Erreichbarkeitsbenachrichtigungen im Haupt-Thread gebucht und zugestellt. Wie Sie unten sehen können, in Anwendung: didFinishLaunchingWithOptions:
, wir erstellen eine Instanz von Erreichbarkeit
Klasse und sagen Sie es, um die Überwachung auf Netzwerkänderungen zu starten.
- (BOOL) Anwendung: (UIApplication *) Anwendung didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Initialisieren der Erreichbarkeit Erreichbarkeit * Reachability = [Erreichbarkeit ReachabilityWithHostname: @ "www.google.com"]; // Überwachung starten [Erreichbarkeit startNotifier]; // Initialize View Controller self.viewController = [[MTViewController-Zuordnung] initWithNibName: @ "MTViewController" -Bündel: nil]; // Fenster initialisieren self.window = [[UIWindow-Zuordnung] initWithFrame: [[UIScreen-MainScreen] -Begrenzungen]]; // Fenster konfigurieren [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; JA zurückgeben;
Wenn der View-Controller beispielsweise über Änderungen der Netzwerkverfügbarkeit informiert werden muss, müssen wir ihn als Beobachter der Benachrichtigungen hinzufügen Erreichbarkeit
Instanzbeiträge. Öffnen MTViewController.m
, Fügen Sie eine Importanweisung für hinzu Erreichbarkeit.h, und aktualisieren initWithNibName: Bundle:
Wie nachfolgend dargestellt.
#import "MTViewController.h" #import "Erreichbarkeit.h"
- (id) initWithNibName: (NSString *) nibNameOrNil-Bundle: (NSBundle *) nibBundleOrNil self = [super initWithNibName: nibNameOrNil-Bundle: nibBundleOrNil]; if (self) // Observer hinzufügen [[NSNotificationCenter defaultCenter] addObserver: Selbstselektor: @selector (reachabilityDidChange :) Name: kReachabilityChangedNotification-Objekt: nil]; return self;
Jedes Mal, wenn sich die Netzwerkschnittstelle ändert, reachabilityDidChange:
wird aufgerufen, und der View Controller kann entsprechend reagieren. Das Objekt
Eigentum der Benachrichtigung ist der Erreichbarkeit
Instanz, die die Benachrichtigung veröffentlicht hat. Das Erreichbarkeit
class bietet eine Reihe nützlicher Instanzmethoden, wie z isReachable
, isReachableViaWWAN
, und isReachableViaWiFi
. Sie können das sogar sagen Erreichbarkeit
Beispiel, ob es WWAN als nicht erreichbar betrachten soll, indem Sie die Einstellung ReachableOnWWAN
Eigentum entsprechend.
- (void) reachabilityDidChange: (NSNotification *) Benachrichtigung Reachability * Reachability = (Reachability *) [Benachrichtigungsobjekt]; if ([Erreichbarkeit ist erreichbar]) NSLog (@ "Reachable"); else NSLog (@ "Nicht erreichbar");
Für Anwendungen, die eine Netzwerkverbindung erfordern, verwende ich normalerweise einen alternativen Ansatz zum Verwalten der Erreichbarkeit. Ich erstelle eine eigene Klasse mit dem Namen Erreichbarkeits-Manager das nimmt das Singleton-Muster an. Das Singleton-Objekt verwaltet a Erreichbarkeit
Instanz und bietet eine Reihe nützlicher Klassenmethoden. Lassen Sie mich durch die inneren Elemente dieser Klasse gehen.
Wie gesagt, die MTReachabilityManager
Die Klasse übernimmt das Singleton-Muster und ermöglicht den Zugriff auf das Singleton-Objekt über das sharedManager
Klassenmethode. Dies ist nützlich, wenn ein Objekt direkten Zugriff auf die Erreichbarkeit
Instanz, die das Singleton-Objekt verwaltet.
Durch eine Reihe von Klassenmethoden können Objekte den Reachability Manager nach der aktuellen Netzwerkschnittstelle fragen. Darüber hinaus können sich Objekte noch als Beobachter für die kReachabilityChangedNotification
Benachrichtigungen, wie wir zuvor gesehen haben.
#einführen@class Erreichbarkeit; @Interface MTReachabilityManager: NSObject @property (stark, nichtatomar) Erreichbarkeit * Erreichbarkeit; #pragma mark - #pragma mark Shared Manager + (MTReachabilityManager *) sharedManager; #pragma mark - #pragma mark Klassenmethoden + (BOOL) isReachable; + (BOOL) ist nicht erreichbar; + (BOOL) isReachableViaWWAN; + (BOOL) isReachableViaWiFi; @Ende
Die Implementierung von MTReachabilityManager
ist nicht zu überraschend. Wenn Sie mit dem Singleton-Muster nicht vertraut sind, wird die Implementierung von sharedManager
mag etwas seltsam erscheinen. Obwohl die MTReachabilityManager
Wenn die Klasse das Singleton-Muster verwendet, ist es technisch möglich, Instanzen der Klasse zu erstellen. Wir könnten dies verhindern, indem wir den Wert von überprüfen _sharedManager
in dem drin
, aber ich gehe davon aus, dass wer auch immer das benutzt MTReachabilityManager
Die Klasse hat sich die Schnittstellendatei der Klasse angesehen und gezeigt, dass sie das Singleton-Muster verwendet.
#import "MTReachabilityManager.h" #import "Reachability.h" @implementation MTReachabilityManager #pragma mark - #pragma mark Standard-Manager + (MTReachabilityManager *) sharedManager statisch MTReachabilityManager * _sharedManager = nil; static dispatch_once_t onceToken; dispatch_once (& onceToken, ^ _sharedManager = [[selbstzuteilen] init];); return _sharedManager; #pragma mark - #pragma mark Speicherverwaltung - (ungültig) dealloc // Stop Notifier if (_reachability) [_reachability stopNotifier]; #pragma mark - #pragma mark Klassenmethoden + (BOOL) isReachable return [[[[MTReachabilityManager sharedManager] Erreichbarkeit] isReachable]; + (BOOL) ist nicht erreichbar return! [[[[MTReachabilityManager sharedManager] Erreichbarkeit] isReachable]; + (BOOL) isReachableViaWWAN return [[[[MTReachabilityManager sharedManager] Erreichbarkeit] isReachableViaWWAN]; + (BOOL) isReachableViaWiFi return [[[[MTReachabilityManager sharedManager] Erreichbarkeit] isReachableViaWiFi]; #pragma mark - #pragma mark Private Initialisierung - (id) init self = [super init]; if (self) // Initialisieren der Erreichbarkeit self.reachability = [Erreichbarkeit, ReachabilityWithHostname: @ "www.google.com"]; // Überwachung starten [self.reachability startNotifier]; return self; @Ende
Wenn Sie sich für diesen alternativen Ansatz entscheiden und einen Erreichbarkeitsmanager verwenden, der eine Instanz von verwaltet Erreichbarkeit
Vergessen Sie nicht, das Singleton-Objekt zu instanziieren, wenn Ihre Anwendung gestartet wird. Sie können dies tun, indem Sie anrufen sharedManager
auf der MTReachabilityManager
Klasse.
- (BOOL) -Anwendung: (UIApplication *) -Anwendung didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Instantiate Shared Manager [MTReachabilityManager sharedManager]; // Initialize View Controller self.viewController = [[MTViewController-Zuordnung] initWithNibName: @ "MTViewController" -Bündel: nil]; // Fenster initialisieren self.window = [[UIWindow-Zuordnung] initWithFrame: [[UIScreen-MainScreen] -Begrenzungen]]; // Fenster konfigurieren [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; JA zurückgeben;
Wenn Sie den Benutzer benachrichtigen oder die Benutzeroberfläche der Anwendung aktualisieren, wenn sich die Netzwerkschnittstelle ändert, führt dies nicht nur zu einer besseren Benutzererfahrung. Apple verlangt, dass Sie dies tun, wenn Ihre Anwendung auf der Netzwerkverbindung basiert. Es ist zwar ein bisschen anstrengend, aber die Reachability-Klasse macht es viel einfacher.