2010-01-28 3 views
3

Lorsque mon application se lance, je vérifie l'accessibilité parce que j'ai besoin d'une connexion Internet immédiate. Mon problème, cependant, est qu'il semble qu'il n'y ait pas de confirmation immédiate pour le NetworkStatus, ce qui signifie que juste après la configuration de Reachability, je vérifie s'il y a une connexion, et il retourne qu'il n'y en a pas, que je sois en fait sur WiFi/3G, ou avez éteint la radio.Besoin d'aide avec Reachability (2.0.3ddg)

Je confirme que je suis en fait d'obtenir une connexion Internet, car instantanément après applicationDidFinishLaunching, il y a une notification qui se connecte ensuite « ReachableViaWiFi » ..

Qu'est-ce que je fais mal? Pourquoi ne confirme-t-il pas immédiatement une connexion Internet valide?

- (void)applicationDidFinishLaunching:(UIApplication *)application {  
    NetworkStatus netStatus = [hostReach currentReachabilityStatus]; 
    if (netStatus == NotReachable) { 
     ErrorViewController *errorViewController = [[ErrorViewController alloc] initWithNibName:@"ErrorView" bundle:[NSBundle mainBundle]]; 
     [tabBarController.view removeFromSuperview]; 
     [window addSubview:[errorViewController view]]; 
     return; 
    } 
} 

-(void)setupReachability { 
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name:kReachabilityChangedNotification object: nil]; 
    hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain]; 
    [hostReach startNotifier]; 
} 

-(void)reachabilityChanged:(NSNotification *)notification { 
    Reachability* curReach = [notification object]; 
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]); 
    NetworkStatus netStatus = [curReach currentReachabilityStatus]; 
    BOOL connectionRequired = [curReach connectionRequired]; 
    switch (netStatus) 
    { 
     case NotReachable: 
     { 
      [[NSUserDefaults standardUserDefaults] setInteger:kNOTREACHABLE forKey:kREACHABILITYSTATUS]; 
      NSLog(@"NotReachable"); 
      connectionRequired = NO; 
      break; 
     } 

     case ReachableViaWWAN: 
     { 
      [[NSUserDefaults standardUserDefaults] setInteger:kREACHABLEVIAWWAN forKey:kREACHABILITYSTATUS]; 
      NSLog(@"ReachableViaWWAN"); 
      break; 
     } 
     case ReachableViaWiFi: 
     { 
      [[NSUserDefaults standardUserDefaults] setInteger:kNOTREACHABLE forKey:kREACHABILITYSTATUS]; 
      NSLog(@"ReachableViaWiFi"); 
      break; 
     } 
    } 
} 

Répondre

4

OK, donc après avoir essayé quelques petites choses moi-même, je l'ai fait travailler, en ajoutant une ligne supplémentaire de code:

-(void)setupReachability { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotificationV2 object:nil]; 
    hostReach = [[ReachabilityV2 reachabilityWithHostName:@"www.google.com"] retain]; 
    [hostReach connectionRequired]; // this line was added, and apparently forces a connection requirement.. 
    [hostReach startNotifier]; 
} 
2

L'exemple de code joignabilité vous fournit callbacks/notifications asynchrones pour vous informer de la façon dont/lorsque la joignabilité a changé. Pour que votre code fonctionne, vous devez modifier votre code comme suit:

- (void) applicationDidFinishLaunching:(UIApplication *)application { 

// setup reachability 
    [self setupReachability]; 
} 

Puis dans votre rappel, lorsque vous obtenez la notification vous réagissez au besoin par votre application. En d'autres termes, vous ne pouvez pas vérifier immédiatement l'état du réseau sous applicationDidFinishLaunching(). Si vous voulez le faire, vous devez utiliser une méthode synchrone/bloquante, par exemple vous pouvez utiliser le code fourni dans ma réponse à la question this.

+0

Je peux ajouter une confirmation que Apple a déclaré que l'accessibilité n'est pas une vérification pré-vol. Si vous voulez que cela fonctionne le plus rapidement possible, essayez d'ouvrir une URL de confirmation dès le lancement de l'application, qui devrait permettre à Reachability de déclencher une notification sur l'état de la connexion. –

+0

Ne serais-je pas en mesure de définir quelque chose comme "isConnectionRequired", ce qui oblige à une vérification du réseau? – runmad

1

Vous devez faire hostReach comme variable de niveau de classe.

+0

C'était le problème pour moi. – pt2ph8