web-dev-qa-db-fra.com

Accessibilité AFNetworking 2.0

J'essaie de déterminer si l'utilisateur est connecté à Internet en utilisant AFNetworking 2.0 et le "AFNetworkReachabilityManager", mais cela ne semble pas fonctionner. Il est toujours indiqué qu'il existe une connexion Internet valide, même si Internet est désactivé. Voici mon code:

 -(BOOL)connected {

   __block BOOL reachable;

    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

        switch (status) {
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"No Internet Connection");
                reachable = NO;
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WIFI");

                reachable = YES;
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"3G");
                reachable = YES;
                break;
            default:
                NSLog(@"Unkown network status");
                reachable = NO;
                break;

                [[AFNetworkReachabilityManager sharedManager] startMonitoring];
        }
    }];

    return reachable;

}

Cette méthode est appelée depuis ma méthode viewDidLoad. Y a-t-il un problème avec mon code, car il ne fonctionne pas?

C'est parce que ce bloc n'est exécuté que lorsque l'accessibilité change.

Pour obtenir l'état actuel, vous pouvez procéder comme suit:

- (BOOL)connected {
    return [AFNetworkReachabilityManager sharedManager].reachable;
}
64
Marcelo Fabri

Vous rendez cela plus difficile que nécessaire. Essaye ça:

- (void)viewDidLoad {
   [super viewDidLoad];

   [[AFNetworkReachabilityManager sharedManager] startMonitoring];

}

- (BOOL)connected {
    return [AFNetworkReachabilityManager sharedManager].reachable;
}   

Si vous souhaitez également être averti lorsque le statut change, alors implémentez setReachabilityStatusChangeBlock

J'espère que cela t'aides!

102
backofthecup

Vous avez deux erreurs de code qui empêcheront votre code de fonctionner.

Tout d'abord, votre appel à `` démarrer la surveillance '' se produit à l'intérieur du bloc qui est déclenché en réponse aux changements d'accessibilité - par conséquent, le bloc ne se déclenchera jamais (sauf si vous commencez la surveillance ailleurs).

Deuxièmement, il n'y a aucune garantie quant au moment où ce bloc se déclenchera. En conséquence, vous verrez toujours "accessible" retourner la valeur à laquelle il a été initialisé - apparemment, cela est généralement nul. Même si vous corrigez la première erreur, il n'y a aucune garantie (et il est en fait assez peu probable) que le bloc se déclenchera avant votre retour.

Enfin, à un niveau plus général, vous essayez également de tester de manière synchrone un code qui peut niquement être exécuté de manière asynchrone. Autrement dit, il est impossible pour le gestionnaire d'accessibilité de déterminer instantanément avec précision l'accessibilité. Il peut dire `` Je pense que je suis en WiFi '' ou `` Je pense que je suis en 3G '', mais il doit également vérifier s'il peut réellement atteindre Internet (d'où le nom accessible ) avant d’être certain. L'accessibilité n'est pas seulement une connexion `` J'ai un wifi '' ou `` J'ai une connexion 3G '', il s'agit également de savoir si vous pouvez accéder à Internet via cette connexion. Cela signifie que l'appareil doit réellement envoyer une demande, et bien que cela puisse, techniquement, être fait de manière synchrone, chaque règle du livre insiste pour que le code réseau doit être fait de manière asynchrone, et pour de bon raison. Si vous le faisiez de manière synchrone, vous bloqueriez votre interface utilisateur jusqu'à ce que l'appel réseau revienne ... peut-être 30, 40, 50, voire 60 secondes plus tard, selon les délais appropriés.

Ce que vous devez faire, c'est démarrer la surveillance de l'accessibilité singleton dans votre application a chargé la méthode du délégué d'application, puis récupérer ses données plus tard. Sans connaître la structure de votre application, je n'essaierai même pas de garantir l'exactitude, mais cela devrait au moins aider, quelque peu.

11
RonLugge

Essaye ça,

Dans AppDelegate, didFinishLaunchingWithOptions méthode

{ // SETUP AFNETWORKING's NETWORK INDICATOR AND REACHABILITY
    [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];
}

Dans HttpManager class,

- (BOOL)isNetworkRechable {

    if ([AFNetworkReachabilityManager sharedManager].reachable) {

        if ([AFNetworkReachabilityManager sharedManager].isReachableViaWiFi)
            NSLog(@"Network reachable via WWAN");
        else
            NSLog(@"Network reachable via Wifi");

        return YES;
    }
    else {

        NSLog(@"Network is not reachable");
        return NO;
    }
}

Dans yourViewController,

[[HttpManager sharedObject] isNetworkRechable];

Remarque: Ne pas vérifier networkRechability au tout début. Parce que ça ne marchera pas. Veuillez donc attendre au moins 1 seconde pour le vérifier.

7
Balaji G

Selon mon expérience,

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

prend un moment pour exécuter setReachabilityStatusChangeBlock donc il ne sert à rien de renvoyer la valeur de -(BOOL)connected.

Vous pouvez donc effectuer certaines tâches une fois le réseau connecté/déconnecté.

La fonction suivante est préférable pour vérifier la connectivité sur place (de manière synchrone):

[AFNetworkReachabilityManager sharedManager].reachable;
6
For Guru

Les autres réponses sont fausses! Il est préférable de l'utiliser pour vérifier la disponibilité:

if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable)

La raison en est que, initialement, networkReachabilityStatus sera défini sur AFNetworkReachabilityStatusUnknown jusqu'à ce que le bloc de changement d'état soit appelé, ce qui empêche votre code de penser que le réseau n'est pas disponible lorsqu'il ne l'est pas.

3
user5664685
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    [self checkNetworkReachability];
}    


+(BOOL) isReachable{
   return [AFNetworkReachabilityManager sharedManager].reachable;
}

+(void) checkNetworkReachability{
        [[AFNetworkReachabilityManager sharedManager] startMonitoring];
        [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));

            // Check the reachability status and show an alert if the internet connection is not available
            switch (status) {
                case -1:
                    // AFNetworkReachabilityStatusUnknown = -1,
                    NSLog(@"The reachability status is Unknown");
                    break;
                case 0:
                    // AFNetworkReachabilityStatusNotReachable = 0
                    NSLog(@"The reachability status is not reachable");
                    break;
                case 1:
                    NSLog(@"The reachability status is reachable via wan");
                    [[NSNotificationCenter defaultCenter] postNotificationName:@"Network_Reachable" object:nil];
                    break;
                case 2:
                    // AFNetworkReachabilityStatusReachableViaWiFi = 2
                    NSLog(@"The reachability status is reachable via WiFi");

                    [[NSNotificationCenter defaultCenter] postNotificationName:@"Network_Reachable" object:nil];
                    break;

                default:
                    break;
            }

        }];
    }
1
Bassant Ashraf