2009-10-18 7 views
0

J'utilise le code suivant pour savoir si la connectivité Internet est présente ou non.iPhone - vérifiez si la connectivité Internet est disponible ou non

struct sockaddr_in zeroAddress; 
bzero(&zeroAddress, sizeof(zeroAddress)); 
zeroAddress.sin_len = sizeof(zeroAddress); 
zeroAddress.sin_family = AF_INET; 

// Recover reachability flags 
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr*)&zeroAddress); 
SCNetworkReachabilityFlags flags; 
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); 
CFRelease(defaultRouteReachability); 
if (!didRetrieveFlags) { 
    NSLog(@"Error. Could not recover network reachability flags"); 
    return 0; 
} 
BOOL isReachable = flags & kSCNetworkFlagsReachable; 
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; 
return (isReachable && !needsConnection) ? YES : NO; 

Cette méthode renvoie le résultat attendu lorsque mon périphérique est connecté à un réseau Wi-Fi. Mais si je teste la même méthode sur un réseau 3G ou Edge, il renvoie un NO (c'est-à-dire non connecté à Internet)

Des idées pourquoi?

Merci.

+1

Y at-il une raison particulière pour laquelle vous avez besoin de contrôler en amont cette vérifier? La recommandation d'Apple a été de ne pas: aller de l'avant et essayer de parler à ce que vous devez parler, et être prêt à faire face aux résultats d'accessibilité. Les conditions réseau sur iPhone peuvent être très très transitoires. –

+0

Je veux montrer différentes sorties basées sur des conditions différentes - s'il y a un problème avec le serveur, le message sera différent, si aucune connexion internet, il sera encore différent – lostInTransit

Répondre

0

Le problème est que vous n'êtes pas connecté activement, le modem cellulaire est mis hors tension (ce qu'il fait après quelques secondes d'inactivité). Les chances sont si vous vous regardez, vous verrez que needsConnection est OUI. L'une des API de niveau supérieur (CFNetwork, NSURLConnection) entraîne l'établissement automatique de la connexion.

Vous pouvez tester pour voir si vous avez cellulaire disponible en recherchant la clé kSCNetworkReachabilityFlagsIsWWAN.

Questions connexes