1413 Stimmen

Wie kann ich unter iOS oder macOS prüfen, ob eine aktive Internetverbindung besteht?

Ich möchte überprüfen, ob ich unter iOS eine Internetverbindung habe, indem ich die Kakao Touch Bibliotheken oder auf macOS mit der Kakao Bibliotheken.

Ich habe eine Möglichkeit gefunden, dies mit einer NSURL . Die Art und Weise, wie ich es gemacht habe, erscheint mir etwas unzuverlässig (denn selbst Google könnte eines Tages ausfallen, und sich auf einen Dritten zu verlassen, erscheint mir schlecht), und obwohl ich prüfen könnte, ob eine Antwort von anderen Websites kommt, wenn Google nicht antwortet, erscheint es mir verschwenderisch und ein unnötiger Mehraufwand für meine Anwendung.

- (BOOL)connectedToInternet {
    NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
    return ( URLString != NULL ) ? YES : NO;
}

Ist das, was ich getan habe, schlecht, (ganz zu schweigen von stringWithContentsOfURL ist in iOS 3.0 und macOS 10.4 veraltet) und wenn ja, was ist ein besserer Weg, dies zu erreichen?

74voto

klcjr89 Punkte 5782

Hier ist, wie ich es in meinen Anwendungen tun: Während ein 200-Status-Antwort-Code nicht alles garantieren, ist es stabil genug für mich. Dies erfordert nicht so viel Laden wie die NSData Antworten hier gepostet, da meine nur die HEAD-Antwort überprüft.

Schneller Code

func checkInternet(flag:Bool, completionHandler:(internet:Bool) -> Void)
{
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    let url = NSURL(string: "http://www.google.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 Google URL reachable
        }
        else
        {
            // No "Internet" aka Google URL un-reachable
        }
    })
}

Objektiv-C-Code

typedef void(^connection)(BOOL);

- (void)checkInternet:(connection)block
{
    NSURL *url = [NSURL URLWithString:@"http://www.google.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 Google URL reachable
         }
         else
         {
             // No "Internet" aka Google URL un-reachable
         }
    }];
}

59voto

teabot Punkte 15048

Apple liefert Beispielcode um die verschiedenen Arten der Netzverfügbarkeit zu prüfen. Alternativ dazu gibt es eine Beispiel im Kochbuch für iPhone-Entwickler.

Nota: Bitte beachten Sie @KHGs Kommentar zu dieser Antwort bezüglich der Verwendung von Apples Erreichbarkeitscode.

48voto

Aleksander Azizi Punkte 9695

Sie könnten verwenden Reachability von ( hier erhältlich ).

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

42voto

Apple stellt eine Beispielanwendung bereit, die genau dies tut:

Erreichbarkeit

37voto

Ely Punkte 6564

Bei Verwendung von iOS 12 oder macOS v10.14 (Mojave) oder neuer, können Sie NWPathMonitor anstelle der prähistorischen Reachability Klasse. Als Bonus können Sie den aktuellen Netzverbindungstyp leicht erkennen:

import Network // Put this on top of your class

let monitor = NWPathMonitor()

monitor.pathUpdateHandler = { path in
    if path.status != .satisfied {
        // Not connected
    }
    else if path.usesInterfaceType(.cellular) {
        // Cellular 3/4/5g connection
    }
    else if path.usesInterfaceType(.wifi) {
        // Wi-Fi connection
    }
    else if path.usesInterfaceType(.wiredEthernet) {
        // Ethernet connection
    }
}

monitor.start(queue: DispatchQueue.global(qos: .background))

Mehr Informationen hier: https://developer.apple.com/documentation/network/nwpathmonitor

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X