En utilisant le code Reachability d'Apple, j'ai créé une fonction qui vérifiera cela correctement sans que vous ayez à inclure de classes.
Incluez le SystemConfiguration.framework dans votre projet.
Faites des importations :
#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>
Maintenant, il suffit d'appeler cette fonction :
/*
Connectivity testing code pulled from Apple's Reachability Example: https://developer.apple.com/library/content/samplecode/Reachability
*/
+(BOOL)hasConnectivity {
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
if (reachability != NULL) {
//NetworkStatus retVal = NotReachable;
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(reachability, &flags)) {
if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
{
// If target host is not reachable
return NO;
}
if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
{
// If target host is reachable and no connection is required
// then we'll assume (for now) that your on Wi-Fi
return YES;
}
if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
{
// ... and the connection is on-demand (or on-traffic) if the
// calling application is using the CFSocketStream or higher APIs.
if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
{
// ... and no [user] intervention is needed
return YES;
}
}
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
// ... but WWAN connections are OK if the calling application
// is using the CFNetwork (CFSocketStream?) APIs.
return YES;
}
}
}
return NO;
}
Et c'est iOS 5 testé pour vous.
0 votes
Vous pourriez remplacer la dernière ligne par : return (id)URLString ; (Omettre le cast fonctionnera également, mais pourrait vous donner un avertissement du compilateur).
12 votes
Plutôt
return (BOOL)URLString;
ou mieux encore,return !!URLString
oreturn URLString != nil
3 votes
Je ne sais pas quel est votre cas d'utilisation, mais si vous le pouvez, il est préférable d'essayer la requête et de traiter toute erreur telle que l'absence de connexion qui survient. Si vous ne pouvez pas le faire, alors il y a beaucoup de bons conseils ici dans ce cas.
2 votes
Votre solution est intelligente, et je la préfère. Vous pouvez aussi utiliser
NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://twitter.com/getibox"] encoding:NSUTF8StringEncoding error:nil];
Pour se débarrasser de l'avertissement ennuyeux.4 votes
Essayez d'utiliser la classe Reachability du lien ci-dessous, cela fonctionnera pour vous. github.com/tonymillion/Reachability
4 votes
Pour ceux qui ont récemment trouvé cette réponse : stackoverflow.com/a/8813279
0 votes
Ou essayez cette classe singleton pour pouvoir définir un délai d'attente afin d'éviter les blocages dans les scénarios de perte de paquets à 100 %. github.com/fareast555/TFInternetChecker
0 votes
Le moyen le plus rapide et le plus simple de vérifier la connexion - stackoverflow.com/a/8813279/5790492
0 votes
stackoverflow.com/a/42710600/6898523