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?

1246
demandé sur Tamás Sengel 2009-07-05 12:45:01

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.

1229
répondu iwasrobbed 2018-04-17 12:45:24

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.

303
répondu cannyboy 2016-01-09 12:42:52

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.

144
répondu Andrew Zimmer 2017-07-02 16:34:56

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.

118
répondu Daniel Rinser 2016-01-09 12:40:49

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).

79
répondu Erik Wegener 2016-01-09 12:50:43

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
         }
    }];
}
71
répondu klcjr89 2016-12-28 08:33:49

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.

55
répondu teabot 2011-01-28 07:04:57

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.
44
répondu Aleksander Azizi 2017-08-26 02:46:57

Apple fournit un exemple d'application qui fait exactement cela:

L'Accessibilité

39
répondu NANNAV 2013-06-11 10:04:05

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");}
32
répondu Ben Groot 2016-01-09 12:41:52

Une version sur l'Accessibilité pour iOS 5 est "darkseed" /Accessibilité.h. Ce n'est pas le mien! =)

27
répondu Alex 2016-01-09 12:46:23

Il y a un joli, arc-et GCD - en utilisant la modernisation de L'accessibilité ici:

L'Accessibilité

25
répondu JK Laiho 2013-06-11 10:04:51

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).

21
répondu Bruno Koga 2013-05-30 01:18:13

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).

18
répondu Felixyz 2016-01-09 12:37:33

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");
    }
}
14
répondu svmrajesh 2016-01-09 13:09:13
-(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;
}
}
12
répondu Mutawe 2013-06-03 11:43:13
- (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).

11
répondu IOS Rocks 2016-01-09 12:52:04

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.

10
répondu Huy Tran 2016-01-09 13:00:28

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");
    }
}
9
répondu Paresh Hirpara 2016-01-09 13:08:03

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.

8
répondu Latika Tiwari 2016-01-09 12:58:03

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;
}
8
répondu iProgrammer 2016-01-09 13:03:54

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.

8
répondu Tony 2016-01-09 13:05:06

Je l'ai trouvé simple et facile à utiliser la bibliothèque SimplePingHelper .

Exemple de code: chrishulbert/SimplePingHelper (GitHub)

8
répondu Piyush Dubey 2016-01-09 13:06:48
  1. Télécharger l'Accessibilité fichier, https://gist.github.com/darkseed/1182373

  2. Et ajoutez CFNetwork.framework et ' SystemConfiguration.cadre" dans cadre

  3. 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");
    }
}
8
répondu Maulik Salvi 2016-01-09 13:14:10

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.

7
répondu Durai Amuthan.H 2016-01-09 13:00:05

En dehors de l'accessibilité, vous pouvez également utiliser la bibliothèque simple ping helper . Il fonctionne vraiment bien, et est simple à intégrer.

7
répondu user2538944 2016-01-09 13:07:16

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;
    }
}
7
répondu Mina Fawzy 2016-01-09 13:12:50

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
     }
6
répondu Himanshu Mahajan 2016-01-09 13:02:19
  • É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");
    }
    
6
répondu Anny 2016-01-09 13:21:53

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")
  }
6
répondu ViJay Avhad 2017-05-31 08:04:14