La plupart des applications mobiles accèdent au Web pour une raison ou une autre. Cela implique que ces applications se comporteront - ou devraient - se comporter différemment lorsqu'aucune connexion réseau n'est disponible. Dans cette astuce, je vais vous montrer comment détecter les modifications d'interface réseau à l'aide de la classe d'accessibilité de Tony Million..
Même si Apple fournit un exemple de code permettant de surveiller les modifications de la disponibilité du réseau, sa classe Reachability est un peu obsolète et ne prend pas en charge ARC (Automatic Reference Counting). Si vous utilisez AFNetworking, alors vous voudrez peut-être envisager AFHTTPClient
, qui vous permet également de surveiller les changements d'interface réseau.
Cependant, ma solution préférée est la merveilleuse classe de Reachability créée et maintenue par Tony Million. Il prend en charge ARC et exploite GCD (Grand Central Dispatch). Laissez-moi vous montrer comment intégrer la classe d'accessibilité de Tony.
Créez un nouveau projet dans Xcode en sélectionnant le Application à vue unique modèle de la liste des modèles (figure 1). Nommez votre application Accessibilité, entrez un identifiant d'entreprise, définissez iPhone pour la famille d'appareils, et vérifiez Utiliser le comptage automatique des références. Le reste des cases à cocher peut ne pas être coché pour ce projet (figure 2). Indiquez à Xcode où vous souhaitez enregistrer le projet et cliquez sur Créer.
L'intégration de la classe d'accessibilité de Tony Million est triviale. Visitez la page GitHub du projet, téléchargez la dernière version et faites-la glisser Accessibilité.h / .m dans votre projet Xcode (figure 3). Si vous prenez ce chemin, assurez-vous de copier les fichiers de classe dans votre projet Xcode (figure 4). Vous pouvez également utiliser CocoaPods pour ajouter l'accessibilité à votre projet..
La classe d'accessibilité dépend de la Configuration du système cadre pour certaines de ses fonctionnalités. Avec votre projet sélectionné dans le Navigateur de projet, sélectionnez le Accessibilité cible dans la liste des cibles, ouvrez le Phases de construction onglet, et développez le Lien binaire avec les bibliothèques tiroir. Cliquez sur le bouton plus et recherchez SystemConfiguration.framework (figure 5).
le Accessibilité
class fournit deux moyens de surveiller les modifications de la disponibilité du réseau: les blocs et les notifications. Laissez-moi vous montrer comment cela fonctionne.
Pour simplifier les choses, nous allons ajouter la logique d'accessibilité au délégué de l'application. Commencez par ajouter une déclaration d'importation pour Accessibilité.h à MTAppDelegate.m comme indiqué ci-dessous.
#import "MTAppDelegate.h" #import "Reachability.h" #import "MTViewController.h"
Nous devons d’abord créer une instance du Accessibilité
cours en application: didFinishLaunchingWithOptions:
(MTAppDelegate.m) comme indiqué ci-dessous. Nous avons ensuite mis le accessibleBlock
et inaccessible
sur le Accessibilité
exemple. le accessibleBlock
est appelé lorsque la disponibilité du réseau passe d’inaccessible à accessible. L’inverse est vrai pour le inaccessible
. C'est la clé pour envoyer le Accessibilité
par exemple un message de startNotifier
afin qu'il sache qu'il devrait commencer à surveiller les changements d'accessibilité. Il est également important de savoir que l'appel à startNotifier
provoque le Accessibilité
exemple pour se conserver, ce qui signifie que vous n'avez pas besoin de stocker une référence à la Accessibilité
objet. Cependant, je ne suis pas fan de cette approche et vous montrerai une solution alternative un peu plus tard.
- Application (BOOL): application (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Initialisation de l'accessibilité Accessibilité * reachability = [Accessibilité atteinte par l'accessibilité: @ "www.google.com"]; reachability.reachableBlock = ^ (Accessibilité * accessible) NSLog (@ "Le réseau est accessible."); ; reachability.unreachableBlock = ^ (Accessibilité * * accessible) NSLog (@ "Le réseau est inaccessible."); ; // Démarrer la surveillance [accessibilité startNotifier]; // Initialise View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize Window self.window = [[UIWindow alloc]] initWithFrame: [[UIScreen mainScreen]]]]; // Configurer la fenêtre [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; retourner OUI;
Avant d'examiner les notifications, je dois souligner que les blocs accessibles et non accessibles sont invoqués sur un thread d'arrière-plan. Gardez cela à l'esprit lorsque vous devez mettre à jour l'interface utilisateur de votre application lorsque l'interface réseau change..
L'avantage d'utiliser les notifications pour les modifications d'accessibilité est que tout objet de votre application peut s'inscrire lui-même en tant qu'observateur de ces notifications. Contrairement à l'utilisation de blocs, les notifications d'accessibilité sont publiées et livrées sur le thread principal. Comme vous pouvez le voir ci-dessous, dans application: didFinishLaunchingWithOptions:
, nous créons une instance du Accessibilité
classe et lui dire de commencer à surveiller les modifications du réseau.
- Application (BOOL): application (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Initialisation de l'accessibilité Accessibilité * reachability = [Accessibilité atteinte par l'accessibilité: @ "www.google.com"]; // Démarrer la surveillance [accessibilité startNotifier]; // Initialise View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize Window self.window = [[UIWindow alloc]] initWithFrame: [[UIScreen mainScreen]]]]; // Configurer la fenêtre [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; retourner OUI;
Par exemple, si le contrôleur de vue doit être informé des changements dans la disponibilité du réseau, nous devons l’ajouter en tant qu’observateur des notifications. Accessibilité
messages d'instance. Ouvrir MTViewController.m
, ajouter une déclaration d'importation pour Accessibilité.h, et mise à jour initWithNibName: bundle:
comme indiqué ci-dessous.
#import "MTViewController.h" #import "Reachability.h"
- (id) initWithNibName: (NSString *) bundle nibNameOrNil: (NSBundle *) nibBundleOrNil self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil]; if (self) // Add Observer [[NSNotificationCenter defaultCenter] addObserver: sélecteur automatique: @selector (reachabilityDidChange :) name: kReachabilityChangedNotification object: nil]; retourner soi-même;
Chaque fois que l'interface réseau change, accessibilitéDidChange:
est appelé et le contrôleur de vue peut répondre de manière appropriée. le objet
la propriété de la notification est la Accessibilité
instance qui a posté la notification. le Accessibilité
classe fournit un certain nombre de méthodes d'instance utiles, telles que est accessible
, isReachableViaWWAN
, et isReachableViaWiFi
. Vous pouvez même dire le Accessibilité
exemple si elle doit considérer WWAN comme inaccessible en définissant la accessibleOnWWAN
propriété en conséquence.
- (void) reachabilityDidChange: (NSNotification *) notification Accessibilité * accessibilité = (Accessibilité *) [objet de notification]; if ([accessibilité estReachable]) NSLog (@ "Atteignable"); else NSLog (@ "Injoignable");
Pour les applications nécessitant une connexion réseau, j'utilise généralement une approche alternative pour gérer l'accessibilité. Je crée une classe séparée nommée Accessibilité qui adopte le motif singleton. L'objet singleton gère une Accessibilité
instance et fournit un certain nombre de méthodes de classe utiles. Laissez-moi vous guider à travers les internes de cette classe.
Comme je l'ai mentionné, le MTReachabilityManager
classe adopte le motif singleton et donne accès à l’objet singleton par le biais de la sharedManager
méthode de classe. Ceci est utile si un objet nécessite un accès direct à la accessibilité
par exemple que l'objet singleton gère.
Grâce à un certain nombre de méthodes de classe, les objets peuvent demander au responsable de l'accessibilité de connaître l'interface réseau actuelle. De plus, les objets peuvent toujours s’ajouter comme observateurs pour kReachabilityChangedNotification
notifications que nous avons vu plus tôt.
#importation@class Accessibilité; @interface MTReachabilityManager: NSObject @property (strong, nonatomic) Accessibilité * accessibilité; #pragma mark - #pragma mark Gestionnaire partagé + (MTReachabilityManager *) sharedManager; #pragma mark - #pragma mark Méthodes de classe + (BOOL) isReachable; + (BOOL) est inaccessible; + (BOOL) est AccessibleViaWWAN; + (BOOL) est accessible via Wi-Fi; @fin
L'implémentation de MTReachabilityManager
n'est pas trop surprenant. Si vous ne connaissez pas le motif singleton, la mise en œuvre de sharedManager
pourrait sembler un peu étrange. Même si le MTReachabilityManager
classe utilise le modèle singleton, il est techniquement possible de créer des instances de la classe. Nous pourrions éviter cela en vérifiant la valeur de _sharedManager
dans le init
, mais je suppose que celui qui utilise le MTReachabilityManager
la classe a jeté un coup d'œil au fichier d'interface de la classe, révélant qu'elle adopte le motif singleton.
#import "MTReachabilityManager.h" #import "Reachability.h" @implementation MTReachabilityManager #pragma mark - #pragma mark Gestionnaire par défaut + (MTReachabilityManager *) sharedManager statique MTReachabilityManager *. _sharedManager = nil; static dispatch_once_t onceToken; dispatch_once (& onceToken, ^ _sharedManager = [[self alloc] init];); return _sharedManager; #pragma mark - #pragma mark Gestion de la mémoire - (void) dealloc // Stop Notifier if (_reachability) [_reachability stopNotifier]; #pragma mark - #pragma mark Méthodes de classe + (BOOL) isReachable return [[[MTReachabilityManager sharedManager] accessibilité]] estReachable]; + (BOOL) isUnreachable return! [[[[MTReachabilityManager sharedManager] accessibilité]] estReachable]; + (BOOL) estReachableViaWWAN return [[[[MTReachabilityManager sharedManager] accessibilité]] estReachableViaWWAN]; + (BOOL) estReachableViaWiFi return [[[[MTReachabilityManager sharedManager] accessibilité]] estReachableViaWiFi]; #pragma mark - #pragma mark Initialisation privée - (id) init self = [super init]; if (self) // Initialise l'accessibilité self.reachability = [Accessibilité atteinte avec le nom hôte: @ "www.google.com"]; // Démarrer la surveillance [self.reachability startNotifier]; retourner soi-même; @fin
Si vous décidez d’adopter cette approche alternative et d’utiliser un gestionnaire d’atteignabilité qui gère une instance du Accessibilité
classe, n’oubliez pas d’instancier l’objet singleton au lancement de votre application. Vous pouvez le faire en appelant sharedManager
sur le MTReachabilityManager
classe.
- Application (BOOL): application (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Instanciation du gestionnaire partagé [MTReachabilityManager sharedManager]; // Initialise View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize Window self.window = [[UIWindow alloc]] initWithFrame: [[UIScreen mainScreen]]]]; // Configurer la fenêtre [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; retourner OUI;
Notifier l'utilisateur ou mettre à jour l'interface utilisateur de l'application lorsque l'interface réseau change, non seulement améliore l'expérience utilisateur, mais Apple vous demande de le faire si votre application repose sur la connectivité réseau. Cela demande quelques efforts, mais la classe de l’accessibilité rend la tâche beaucoup plus facile..