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?

7voto

ajay negi Punkte 562

Swift 5 und höher:

public class Reachability {
    class func isConnectedToNetwork() -> Bool {
        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)
        zeroAddress.sin_family = sa_family_t(AF_INET)

        guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
                SCNetworkReachabilityCreateWithAddress(nil, $0)
            }
        }) else {
            return false
        }

        var flags: SCNetworkReachabilityFlags = []
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {
            return false
        }

        let isReachable = flags.contains(.reachable)
        let needsConnection = flags.contains(.connectionRequired)

        return (isReachable && !needsConnection)
    }

Rufen Sie diese Klasse folgendermaßen auf:

if Reachability.isConnectedToNetwork() == true {
    // Do something
} else {
    // Do something
}

6voto

Anny Punkte 499
  • Schritt 1: Fügen Sie die Klasse Erreichbarkeit zu Ihrem Projekt hinzu.

  • Schritt 2: Importieren Sie die Klasse Erreichbarkeit

  • Schritt 3: Erstellen Sie die folgende Funktion

    - (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;
            }
        }
    }
  • Schritt 4: Rufen Sie die Funktion wie folgt auf:

    if (![self checkNetConnection]) {
        [GlobalFunctions showAlert:@""
                         message:@"Please connect to the Internet!"
                         canBtntitle:nil
                         otherBtnTitle:@"Ok"];
        return;
    }
    else
    {
        Log.v("internet is connected","ok");
    }

6voto

ViJay Avhad Punkte 2624

Prüfen der Verfügbarkeit der Internetverbindung in (iOS) Xcode 8 , Swift 3.0

Dies ist eine einfache Methode zur Überprüfung der Netzwerkverfügbarkeit, ob unser Gerät mit einem Netzwerk verbunden ist oder nicht. Ich habe es geschafft, es in Swift 3.0 zu übersetzen und hier der endgültige Code. Die bestehende Apple Reachability-Klasse und andere Bibliotheken von Drittanbietern schienen zu kompliziert zu sein, um sie in Swift zu übersetzen.

Dies funktioniert sowohl für 3G-, 4G- als auch für WiFi-Verbindungen.

Vergessen Sie nicht, Folgendes hinzuzufügen "Systemkonfiguration.framework" an Ihren Projektentwickler.

//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")
  }

6voto

Himanshu Mahajan Punkte 4603

Importieren Reachable.h Klasse in Ihrem ViewController und verwenden Sie den folgenden Code zur Überprüfung Konnektivität :

#define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
if (hasInternetConnection){
      // To-do block
}

3voto

pierre23 Punkte 3700

Dies ist für Swift 3.0 und async. Die meisten Antworten sind sync Lösung, die Ihr Haupt-Thread blockieren wird, wenn Sie eine sehr langsame Verbindung haben.

Diese Lösung ist besser, aber nicht perfekt, da sie sich auf Google verlässt, um die Konnektivität zu überprüfen. Sie können also auch eine andere URL verwenden.

func checkInternetConnection(completionHandler:@escaping (Bool) -> Void)
{
    if let url = URL(string: "http://www.google.com/")
    {
        var request = URLRequest(url: url)
        request.httpMethod = "HEAD"
        request.cachePolicy = .reloadIgnoringLocalAndRemoteCacheData
        request.timeoutInterval = 5

        let tast = URLSession.shared.dataTask(with: request, completionHandler:
        {
            (data, response, error) in

            completionHandler(error == nil)
        })
        tast.resume()
    }
    else
    {
        completionHandler(true)
    }
}

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