Comment vérifier une connexion Internet active sur iOS ou macOS?
Je voudrais vérifier si j'ai une connexion Internet sur iOS en utilisant les bibliothèques Cocoa Touch ou sur macOS en utilisant les bibliothèques Cocoa .
J'ai trouvé un moyen de le faire en utilisant un NSURL
. La façon dont je l'ai fait semble un peu peu fiable (parce que même Google pourrait un jour être en panne et compter sur un tiers semble mauvais), et alors que je pouvais vérifier pour voir une réponse de certains autres sites web si Google n'a pas répondu, Cela semble inutile et une surcharge inutile sur ma demande.
- (BOOL) connectedToInternet
{
NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
return ( URLString != NULL ) ? YES : NO;
}
Est-ce que j'ai mal fait (sans parler de {[2] } est obsolète dans iOS 3.0 et macOS 10.4) et si oui, quelle est la meilleure façon d'y parvenir?
30 réponses
Important : cette vérification doit toujours être effectuée de manière asynchrone. La majorité des réponses ci-dessous sont synchrones donc attention sinon vous allez geler votre application.
Swift
1) Installer via CocoaPods ou Carthage: https://github.com/ashleymills/Reachability.swift
2) tester l'accessibilité par des fermetures
let reachability = Reachability()!
reachability.whenReachable = { reachability in
if reachability.connection == .wifi {
print("Reachable via WiFi")
} else {
print("Reachable via Cellular")
}
}
reachability.whenUnreachable = { _ in
print("Not reachable")
}
do {
try reachability.startNotifier()
} catch {
print("Unable to start notifier")
}
Objectif-C
1) Ajoutez SystemConfiguration
framework au projet mais ne vous inquiétez pas de l'inclusion il n'importe où
2) Ajoutez la version de Tony Million de Reachability.h
et Reachability.m
au projet (trouvé ici: https://github.com/tonymillion/Reachability )
3) Mettre à jour la section d'interface
#import "Reachability.h"
// Add this to the interface in the .m file of your view controller
@interface MyViewController ()
{
Reachability *internetReachableFoo;
}
@end
4) ensuite, implémentez cette méthode dans le .m fichier de votre contrôleur de vue que vous pouvez appeler
// Checks if we have an internet connection or not
- (void)testInternetConnection
{
internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];
// Internet is reachable
internetReachableFoo.reachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Yayyy, we have the interwebs!");
});
};
// Internet is not reachable
internetReachableFoo.unreachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Someone broke the internet :(");
});
};
[internetReachableFoo startNotifier];
}
Remarque importante: La classe Reachability
est l'une des classes les plus utilisées dans les projets, Vous pouvez donc rencontrer des conflits de noms avec d'autres projets. Si cela se produit, vous devrez renommer l'une des paires de fichiers Reachability.h
et Reachability.m
en autre chose pour résoudre le problème.
Remarque: Le domaine que vous utilisez n'a pas d'importance. C'est juste tester une passerelle vers n'importe quel domaine.
J'aime garder les choses simples. La façon dont je fais ceci est:
//Class.h
#import "Reachability.h"
#import <SystemConfiguration/SystemConfiguration.h>
- (BOOL)connected;
//Class.m
- (BOOL)connected
{
Reachability *reachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [reachability currentReachabilityStatus];
return networkStatus != NotReachable;
}
Ensuite, je l'utilise chaque fois que je veux voir si j'ai une connexion:
if (![self connected]) {
// Not connected
} else {
// Connected. Do some Internet stuff
}
Cette méthode n'attend pas les statuts réseau modifiés pour faire des choses. Il teste simplement le statut lorsque vous le demandez.
En utilisant le code D'accessibilité D'Apple, j'ai créé une fonction qui va vérifier cela correctement sans que vous ayez à inclure des classes.
Inclure le SystemConfiguration.cadre de votre projet.
Faire quelques importations:
#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>
Maintenant, appelez simplement 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.
C'était la bonne réponse, mais elle est maintenant obsolète car vous devriez vous abonner aux notifications pour être accessible à la place. Cette méthode vérifie de manière synchrone:
Vous pouvez utiliser la classe D'accessibilité D'Apple. Il vous permettra également de vérifier si le Wi-Fi est activé:
Reachability* reachability = [Reachability sharedReachability];
[reachability setHostName:@"www.example.com"]; // Set your host name here
NetworkStatus remoteHostStatus = [reachability remoteHostStatus];
if (remoteHostStatus == NotReachable) { }
else if (remoteHostStatus == ReachableViaWiFiNetwork) { }
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { }
La classe D'accessibilité n'est pas fournie avec le SDK, mais plutôt une partie de cet exemple D'application Apple . Il suffit de le télécharger et de copier l'Accessibilité.h/m à votre projet. Aussi, vous devez ajouter l' SystemConfiguration framework à votre projet.
Voici une réponse très simple:
NSURL *scriptUrl = [NSURL URLWithString:@"http://www.google.com/m"];
NSData *data = [NSData dataWithContentsOfURL:scriptUrl];
if (data)
NSLog(@"Device is connected to the Internet");
else
NSLog(@"Device is not connected to the Internet");
L'URL doit pointer vers un site web extrêmement petit. J'utilise le site mobile de Google ici, mais si j'avais un serveur Web fiable, Je téléchargerais un petit fichier avec un seul caractère pour une vitesse maximale.
Si vérifier si l'appareil est en quelque sorte connecté à Internet est tout ce que vous voulez faire, je vous recommande certainement d'utiliser cette solution simple. Si vous avez besoin de savoir comment l'utilisateur est connecté, utilisez Reachability est le chemin à parcourir.
Attention: cela bloquera brièvement votre fil pendant qu'il charge le site web. Dans mon cas, ce n'était pas un problème, mais vous devriez considérer cela (crédits à Brad pour le souligner).
Voici comment je le fais dans Mes applications: bien qu'un code de réponse d'état 200 ne garantisse rien, il est assez stable pour moi. Cela ne nécessite pas autant de chargement que les réponses NSData affichées ici, car le mien vérifie simplement la réponse de la tête.
Code Swift
func checkInternet(flag:Bool, completionHandler:(internet:Bool) -> Void)
{
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
let url = NSURL(string: "http://www.appleiphonecell.com/")
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "HEAD"
request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
request.timeoutInterval = 10.0
NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.mainQueue(), completionHandler:
{(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
let rsp = response as! NSHTTPURLResponse?
completionHandler(internet:rsp?.statusCode == 200)
})
}
func yourMethod()
{
self.checkInternet(false, completionHandler:
{(internet:Bool) -> Void in
if (internet)
{
// "Internet" aka Apple's region universal URL reachable
}
else
{
// No "Internet" aka Apple's region universal URL un-reachable
}
})
}
Code Objectif-C
typedef void(^connection)(BOOL);
- (void)checkInternet:(connection)block
{
NSURL *url = [NSURL URLWithString:@"http://www.appleiphonecell.com/"];
NSMutableURLRequest *headRequest = [NSMutableURLRequest requestWithURL:url];
headRequest.HTTPMethod = @"HEAD";
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];
defaultConfigObject.timeoutIntervalForResource = 10.0;
defaultConfigObject.requestCachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];
NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:headRequest
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
if (!error && response)
{
block([(NSHTTPURLResponse *)response statusCode] == 200);
}
}];
[dataTask resume];
}
- (void)yourMethod
{
[self checkInternet:^(BOOL internet)
{
if (internet)
{
// "Internet" aka Apple's region universal URL reachable
}
else
{
// No "Internet" aka Apple's region universal URL un-reachable
}
}];
}
Apple fournit exemple de code pour vérifier les différents types de la disponibilité du réseau. Sinon, il y a un exemple dans le livre de recettes des développeurs iPhone.
Remarque: veuillez consulter le commentaire de @ KHG sur cette réponse concernant l'utilisation du code d'accessibilité D'Apple.
Vous pouvez utiliser Reachability
par (disponible ici).
#import "Reachability.h"
- (BOOL)networkConnection {
return [[Reachability reachabilityWithHostName:@"www.google.com"] currentReachabilityStatus];
}
if ([self networkConnection] == NotReachable) { /* No Network */ } else { /* Network */ } //Use ReachableViaWiFi / ReachableViaWWAN to get the type of connection.
Apple fournit un exemple d'application qui fait exactement cela:
Seule la classe D'accessibilité a été mise à jour. Vous pouvez maintenant utiliser:
Reachability* reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];
if (remoteHostStatus == NotReachable) { NSLog(@"not reachable");}
else if (remoteHostStatus == ReachableViaWWAN) { NSLog(@"reachable via wwan");}
else if (remoteHostStatus == ReachableViaWiFi) { NSLog(@"reachable via wifi");}
Une version sur l'Accessibilité pour iOS 5 est "darkseed" /Accessibilité.h. Ce n'est pas le mien! =)
Il y a un joli, arc-et GCD - en utilisant la modernisation de L'accessibilité ici:
Si vous utilisez AFNetworking
Vous pouvez utiliser sa propre implémentation pour le statut d'accessibilité internet.
La meilleure façon d'utiliser AFNetworking
est une classe de la AFHTTPClient
classe et d'utiliser cette classe pour faire vos connexions réseau.
L'un des avantages de cette approche est que vous pouvez utiliser blocks
pour définir le comportement souhaité lorsque l'état d'accessibilité change. Supposons que j'ai créé une sous-classe singleton de AFHTTPClient
(comme indiqué sur les "notes de sous-classement" sur AFNetworking docs) nommé BKHTTPClient
, je ferais quelque chose comme:
BKHTTPClient *httpClient = [BKHTTPClient sharedClient];
[httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
{
if (status == AFNetworkReachabilityStatusNotReachable)
{
// Not reachable
}
else
{
// Reachable
}
}];
Vous pouvez également vérifier les connexions Wi-Fi ou WLAN en utilisant spécifiquement les énumérations AFNetworkReachabilityStatusReachableViaWWAN
et AFNetworkReachabilityStatusReachableViaWiFi
(plus ici).
J'ai utilisé le code de cette discussion, et il semble fonctionner correctement (lire la tout thread!).
Je ne l'ai pas testé de manière exhaustive avec tous les types de connexion imaginables (comme le Wi-Fi ad hoc).
Très simple.... Essayez de suivre ces étapes:
Étape 1: ajoutez le cadre SystemConfiguration
dans votre projet.
Étape 2: Importer le code suivant dans votre header
fichier.
#import <SystemConfiguration/SystemConfiguration.h>
Étape 3:, Utilisez la méthode suivante
-
Type 1:
- (BOOL) currentNetworkStatus { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; BOOL connected; BOOL isConnected; const char *host = "www.apple.com"; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host); SCNetworkReachabilityFlags flags; connected = SCNetworkReachabilityGetFlags(reachability, &flags); isConnected = NO; isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); CFRelease(reachability); return isConnected; }
-
Type 2:
Importer l'en-tête :
#import "Reachability.h"
- (BOOL)currentNetworkStatus { Reachability *reachability = [Reachability reachabilityForInternetConnection]; NetworkStatus networkStatus = [reachability currentReachabilityStatus]; return networkStatus != NotReachable; }
Étape 4: Comment utiliser:
- (void)CheckInternet
{
BOOL network = [self currentNetworkStatus];
if (network)
{
NSLog(@"Network Available");
}
else
{
NSLog(@"No Network Available");
}
}
-(void)newtworkType {
NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@"statusBar"] valueForKey:@"foregroundView"]subviews];
NSNumber *dataNetworkItemView = nil;
for (id subview in subviews) {
if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
dataNetworkItemView = subview;
break;
}
}
switch ([[dataNetworkItemView valueForKey:@"dataNetworkType"]integerValue]) {
case 0:
NSLog(@"No wifi or cellular");
break;
case 1:
NSLog(@"2G");
break;
case 2:
NSLog(@"3G");
break;
case 3:
NSLog(@"4G");
break;
case 4:
NSLog(@"LTE");
break;
case 5:
NSLog(@"Wifi");
break;
default:
break;
}
}
- (void)viewWillAppear:(BOOL)animated
{
NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
return (URL != NULL ) ? YES : NO;
}
Ou utilisez la classe D'accessibilité .
Il existe deux façons de vérifier la disponibilité D'Internet à l'aide du SDK iPhone:
1. Vérifiez que la page Google est ouverte ou non.
2. Classe D'Accessibilité
Pour plus d'informations, veuillez vous référer à accessibilité (développeur Apple).
Utiliser http://huytd.github.io/datatify/. c'est plus facile que d'ajouter des bibliothèques et d'écrire du code par vous-même.
Premier : ajouter CFNetwork.framework
dans le cadre
Code: ViewController.m
#import "Reachability.h"
- (void)viewWillAppear:(BOOL)animated
{
Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
NetworkStatus internetStatus = [r currentReachabilityStatus];
if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
{
/// Create an alert if connection doesn't work
UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection" message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[myAlert show];
[myAlert release];
}
else
{
NSLog(@"INTERNET IS CONNECT");
}
}
Téléchargez D'abord la classe reachability et mettez reachability.h et reachabilty.m fichier dans votre Xcode .
Le meilleur moyen est de créer une classe de fonctions communes (NSObject) afin que vous puissiez l'utiliser n'importe quelle classe. Voici deux méthodes pour vérifier l'accessibilité de la connexion réseau:
+(BOOL) reachabiltyCheck
{
NSLog(@"reachabiltyCheck");
BOOL status =YES;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name:kReachabilityChangedNotification
object:nil];
Reachability * reach = [Reachability reachabilityForInternetConnection];
NSLog(@"status : %d",[reach currentReachabilityStatus]);
if([reach currentReachabilityStatus]==0)
{
status = NO;
NSLog(@"network not connected");
}
reach.reachableBlock = ^(Reachability * reachability)
{
dispatch_async(dispatch_get_main_queue(), ^{
});
};
reach.unreachableBlock = ^(Reachability * reachability)
{
dispatch_async(dispatch_get_main_queue(), ^{
});
};
[reach startNotifier];
return status;
}
+(BOOL)reachabilityChanged:(NSNotification*)note
{
BOOL status =YES;
NSLog(@"reachabilityChanged");
Reachability * reach = [note object];
NetworkStatus netStatus = [reach currentReachabilityStatus];
switch (netStatus)
{
case NotReachable:
{
status = NO;
NSLog(@"Not Reachable");
}
break;
default:
{
if (!isSyncingReportPulseFlag)
{
status = YES;
isSyncingReportPulseFlag = TRUE;
[DatabaseHandler checkForFailedReportStatusAndReSync];
}
}
break;
}
return status;
}
+ (BOOL) connectedToNetwork
{
// Create zero addy
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 NO;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"];
NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self];
return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;
}
Maintenant, vous pouvez vérifier la connexion réseau dans n'importe quelle classe en appelant cette méthode de classe.
Il existe également une autre méthode pour vérifier la connexion Internet à l'aide du SDK iPhone.
Essayez d'implémenter le code suivant pour la connexion réseau.
#import <SystemConfiguration/SystemConfiguration.h>
#include <netdb.h>
/**
Checking for network availability. It returns
YES if the network is available.
*/
+ (BOOL) connectedToNetwork
{
// Create zero addy
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)
{
printf("Error. Could not recover network reachability flags\n");
return NO;
}
BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
return (isReachable && !needsConnection) ? YES : NO;
}
Pour le faire vous-même est extrêmement simple. La méthode suivante fonctionnera. Assurez-vous de ne pas autoriser un protocole de nom d'hôte tel que HTTP, HTTPS, etc. pour être passé dans le nom.
-(BOOL)hasInternetConnection:(NSString*)urlAddress
{
SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [urlAddress UTF8String]);
SCNetworkReachabilityFlags flags;
if (!SCNetworkReachabilityGetFlags(ref, &flags))
{
return NO;
}
return flags & kSCNetworkReachabilityFlagsReachable;
}
Il est rapide simple et indolore.
Je l'ai trouvé simple et facile à utiliser la bibliothèque SimplePingHelper .
Exemple de code: chrishulbert/SimplePingHelper (GitHub)
Télécharger l'Accessibilité fichier, https://gist.github.com/darkseed/1182373
-
Et ajoutez
CFNetwork.framework
et ' SystemConfiguration.cadre" dans cadre Faites #import " accessibilité.h"
Premier : ajouter CFNetwork.framework
dans le cadre
Code: ViewController.m
- (void)viewWillAppear:(BOOL)animated
{
Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
NetworkStatus internetStatus = [r currentReachabilityStatus];
if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
{
/// Create an alert if connection doesn't work
UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection" message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[myAlert show];
[myAlert release];
}
else
{
NSLog(@"INTERNET IS CONNECT");
}
}
La classe D'accessibilité {[5] } est OK pour savoir si la connexion Internet est disponible pour un périphérique ou non...
Mais en cas d'accès à une ressource intranet :
Ping le serveur intranet avec la classe reachability renvoie toujours true.
Donc, une solution rapide dans ce scénario serait de créer une méthode web appelée pingme
avec d'autres webmethods sur le service.
Le {[1] } devrait renvoyer quelque chose.
J'ai Donc écrit la méthode suivante sur fonctions communes
-(BOOL)PingServiceServer
{
NSURL *url=[NSURL URLWithString:@"http://www.serveraddress/service.asmx/Ping"];
NSMutableURLRequest *urlReq=[NSMutableURLRequest requestWithURL:url];
[urlReq setTimeoutInterval:10];
NSURLResponse *response;
NSError *error = nil;
NSData *receivedData = [NSURLConnection sendSynchronousRequest:urlReq
returningResponse:&response
error:&error];
NSLog(@"receivedData:%@",receivedData);
if (receivedData !=nil)
{
return YES;
}
else
{
NSLog(@"Data is null");
return NO;
}
}
La méthode ci-dessus était si utile pour moi, donc chaque fois que j'essaie d'envoyer des données au serveur, je vérifie toujours l'accessibilité de ma ressource intranet en utilisant cette URLRequest à faible délai D'attente.
En dehors de l'accessibilité, vous pouvez également utiliser la bibliothèque simple ping helper . Il fonctionne vraiment bien, et est simple à intégrer.
Je pense que celui-ci est la meilleure réponse.
"Oui" signifie connecté. "Non" signifie déconnecté.
#import "Reachability.h"
- (BOOL)canAccessInternet
{
Reachability *IsReachable = [Reachability reachabilityForInternetConnection];
NetworkStatus internetStats = [IsReachable currentReachabilityStatus];
if (internetStats == NotReachable)
{
return NO;
}
else
{
return YES;
}
}
Importez la classe Reachable.h
dans votre ViewController
et utilisez le code suivant pour vérifier la connectivité :
#define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
if (hasInternetConnection){
// To-do block
}
- Étape 1: Ajoutez la classe Reachability dans votre projet.
- Étape 2: Importer la classe D'accessibilité
-
Étape 3: Créez la fonction ci-dessous
- (BOOL)checkNetConnection { self.internetReachability = [Reachability reachabilityForInternetConnection]; [self.internetReachability startNotifier]; NetworkStatus netStatus = [self.internetReachability currentReachabilityStatus]; switch (netStatus) { case NotReachable: { return NO; } case ReachableViaWWAN: { return YES; } case ReachableViaWiFi: { return YES; } } }
-
Étape 4: appelez la fonction comme ci-dessous:
if (![self checkNetConnection]) { [GlobalFunctions showAlert:@"" message:@"Please connect to the Internet!" canBtntitle:nil otherBtnTitle:@"Ok"]; return; } else { Log.v("internet is connected","ok"); }
Vérification de la disponibilité de la connexion Internet dans (iOS) Xcode 8, Swift 3.0
C'est une méthode simple pour vérifier la disponibilité du réseau comme notre appareil est connecté à un réseau ou non. J'ai réussi à le traduire en Swift 3.0 et ici le code final. La classe D'accessibilité Apple existante et d'autres bibliothèques tierces semblaient trop compliquées à traduire en Swift.
Cela fonctionne pour les connexions 3G,4G et WiFi.
Ne pas oubliez d'ajouter " SystemConfiguration.framework " à votre constructeur de projet.
//Create new swift class file Reachability in your project.
import SystemConfiguration
public class InternetReachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue()
}
var flags: SCNetworkReachabilityFlags = 0
if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
return false
}
let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
return isReachable && !needsConnection
}
}
// Check network connectivity from anywhere in project by using this code.
if InternetReachability.isConnectedToNetwork() == true {
print("Internet connection OK")
} else {
print("Internet connection FAILED")
}