iOS SDK Détection des modifications du réseau avec l'accessibilité

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..


Solutions

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.


1. Mise en place du projet

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.


Figure 1: Choisir un modèle de projet
Figure 2: Configuration du projet

2. Intégration de l'atteignabilité

Étape 1: Ajout de la classe d'accessibilité

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..


Figure 3: Ajout de la classe d'accessibilité à votre projet
Figure 4: Assurez-vous de copier les fichiers de classe dans votre projet

Étape 2: Liaison avec la structure de configuration système

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).


Figure 5: Liez votre projet au cadre de configuration système

3. Bases d'accessibilité

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.

Étape 1: Importer Reachability.h

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"

Étape 2: Blocs

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..

Étape 3: Notifications

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"); 

4. Gestionnaire d'accessibilité

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.

Étape 1: interface

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

Étape 2: mise en œuvre

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; 

Conclusion

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..