1410 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?

1321voto

iwasrobbed Punkte 45760

Wichtig : Diese Prüfung sollte immer asynchron durchgeführt werden. Die meisten der folgenden Antworten sind synchron, also seien Sie vorsichtig, sonst frieren Sie Ihre Anwendung ein.


Schnell

  1. Installation über CocoaPods oder Carthage: https://github.com/ashleymills/Reachability.swift

  2. Erreichbarkeit über Abschlüsse testen

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

Objektiv-C

  1. hinzufügen SystemConfiguration Framework in das Projekt zu integrieren, aber machen Sie sich keine Gedanken darüber, ob es irgendwo

  2. Hinzufügen von Tony Million's Version von Reachability.h y Reachability.m zu dem Projekt (zu finden hier: https://github.com/tonymillion/Reachability )

  3. Aktualisieren Sie den Abschnitt über die Schnittstelle

    #import "Reachability.h"
    
    // Add this to the interface in the .m file of your view controller
    @interface MyViewController ()
    {
        Reachability *internetReachableFoo;
    }
    @end
  4. Dann implementieren Sie diese Methode in der .m-Datei Ihres View-Controllers, die Sie aufrufen können

    // 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];
    }

Wichtiger Hinweis: Die Reachability Klasse ist eine der am häufigsten verwendeten Klassen in Projekten, so dass es zu Namenskonflikten mit anderen Projekten kommen kann. In diesem Fall müssen Sie eines der Paare von Reachability.h y Reachability.m Dateien auf etwas anderes übertragen, um das Problem zu lösen.

Nota: Die von Ihnen verwendete Domain spielt keine Rolle. Es ist nur ein Test für ein Gateway zu einer beliebigen Domain.

316voto

cannyboy Punkte 23758

Ich halte die Dinge gerne einfach. Die Art und Weise, wie ich das mache, ist:

//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;
}

Dann benutze ich es immer, wenn ich sehen will, ob ich eine Verbindung habe:

if (![self connected]) {
    // Not connected
} else {
    // Connected. Do some Internet stuff
}

Diese Methode wartet nicht auf geänderte Netzzustände, um etwas zu tun. Sie testet den Status nur, wenn Sie sie dazu auffordern.

147voto

Andrew Zimmer Punkte 3174

Unter Verwendung von Apples Erreichbarkeitscode habe ich eine Funktion erstellt, die dies korrekt überprüft, ohne dass Sie irgendwelche Klassen einfügen müssen.

Binden Sie die Datei SystemConfiguration.framework in Ihr Projekt ein.

Machen Sie einige Importe:

#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>

Rufen Sie nun einfach diese Funktion auf:

/*
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;
}

Und es ist iOS 5 für Sie getestet.

124voto

Daniel Rinser Punkte 8750

Dies war früher die richtige Antwort, ist aber inzwischen überholt, da Sie stattdessen Benachrichtigungen über die Erreichbarkeit abonnieren sollten. Diese Methode prüft synchron:


Sie können die Reachability-Klasse von Apple verwenden. Damit können Sie auch überprüfen, ob Wi-Fi aktiviert ist:

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) { }

Die Erreichbarkeitsklasse wird nicht mit dem SDK ausgeliefert, sondern ist Teil von diese Apple-Beispielanwendung . Laden Sie es einfach herunter, und kopieren Sie Reachability.h/m in Ihr Projekt. Außerdem müssen Sie das SystemConfiguration-Framework zu Ihrem Projekt hinzufügen.

83voto

Erik Punkte 2068

Hier ist eine sehr einfache Antwort:

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

Die URL sollte auf eine sehr kleine Website verweisen. Ich verwende hier die mobile Website von Google, aber wenn ich einen zuverlässigen Webserver hätte, würde ich die eine kleine Datei mit nur einem Zeichen darin für maximale Geschwindigkeit.

Bei der Überprüfung, ob das Gerät irgendwie mit dem Internet verbunden ist, würde ich auf jeden Fall empfehlen, diese einfache Lösung zu verwenden. Wenn Sie wissen müssen, wie der Benutzer verbunden ist, ist die Verwendung von Reachability der richtige Weg.

Vorsichtig: Dadurch wird Ihr Thread kurzzeitig blockiert, während die Website geladen wird. In meinem Fall war dies kein Problem, aber Sie sollten dies berücksichtigen (Dank an Brad für den Hinweis).

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