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?

11voto

Für meine iOS-Projekte empfehle ich die Verwendung von

Erreichbarkeitsklasse

Deklariert in Swift. Für mich funktioniert es einfach gut mit

Wi-Fi und Mobilfunkdaten

import SystemConfiguration

public class Reachability {

    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(MemoryLayout.size(ofValue: zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)

        let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
                SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
            }
        }

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

        let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
        let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
        let ret = (isReachable && !needsConnection)
        return ret
    }
}

Verwenden Sie eine bedingte Anweisung,

if Reachability.isConnectedToNetwork() {
    // Enter your code here
}
}
else {
    print("NO Internet connection")
}

Diese Klasse ist in fast allen Fällen nützlich, in denen Ihre Anwendung die Internetverbindung nutzt. Wenn z. B. die Bedingung erfüllt ist, kann die API aufgerufen oder eine Aufgabe ausgeführt werden.

11voto

Paresh Hirpara Punkte 483

Erste : hinzufügen CFNetwork.framework im Rahmen

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

10voto

Maulik Salvi Punkte 259
  1. Laden Sie die Erreichbarkeitsdatei herunter, https://gist.github.com/darkseed/1182373

  2. Und hinzufügen CFNetwork.framework und 'SystemConfiguration.framework' in framework

  3. Do #import "Erreichbarkeit.h"

Erste : hinzufügen CFNetwork.framework im Rahmen

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

9voto

Mina Fawzy Punkte 19437

Ich denke, das ist die beste Antwort.

"Ja" bedeutet verbunden. "Nein" bedeutet nicht verbunden.

#import "Reachability.h"

 - (BOOL)canAccessInternet
{
    Reachability *IsReachable = [Reachability reachabilityForInternetConnection];
    NetworkStatus internetStats = [IsReachable currentReachabilityStatus];

    if (internetStats == NotReachable)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}

9voto

Piyush Dubey Punkte 2396

Ich fand die Bibliothek einfach und leicht zu benutzen SimplePingHelper .

Beispiel-Code: chrishulbert/SimplePingHelper ( GitHub )

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