Der einfachste Weg, eine Internetverbindung unter iOS zu erkennen?

147

Ich weiß, dass diese Frage von vielen anderen betrogen zu sein scheint, aber ich glaube nicht, dass der einfache Fall hier gut erklärt ist. Wenn Sie von einem Android- und BlackBerry-Hintergrund kommen, schlagen Anfragen HTTPUrlConnectionsofort fehl, wenn keine Verbindung verfügbar ist. Dies scheint ein völlig vernünftiges Verhalten zu sein, und ich war überrascht, dass es NSURLConnectionin iOS nicht emuliert wurde.

Ich verstehe, dass Apple (und andere, die es erweitert haben) eine ReachabilityKlasse zur Unterstützung der Ermittlung des Netzwerkstatus bereitstellt . Ich war froh, dies zuerst zu sehen und erwartete, so etwas zu sehen bool isNetworkAvailable(), aber zu meiner Überraschung fand ich ein komplexes System, das Benachrichtigungsregistrierungen und Rückrufe sowie eine Reihe scheinbar unnötiger Details erforderte. Es muss einen besseren Weg geben.

Meine App behandelt Verbindungsfehler bereits ordnungsgemäß, einschließlich fehlender Konnektivität. Der Benutzer wird über den Fehler benachrichtigt und die App wird fortgesetzt.

Daher sind meine Anforderungen einfach: Einzelne, synchrone Funktion, die ich vor allen HTTP-Anforderungen aufrufen kann, um festzustellen, ob ich die Anforderung tatsächlich senden soll oder nicht. Im Idealfall ist keine Einrichtung erforderlich und es wird nur ein Boolescher Wert zurückgegeben.

Ist das unter iOS wirklich nicht möglich?

RealCasually
quelle
Sie sollten niemals vor jeder HTTP-Anforderung eine Methode zur Erreichbarkeit eines synchronen Netzwerks aufrufen. Es ist einfach verrückt, diese Arbeit zu erledigen, es sei denn, die Erreichbarkeit zeigt Ihnen asynchron an, dass sich die Netzwerkbedingungen geändert haben, und Sie können dann entscheiden, die HTTP-Anforderung nicht zu senden. Dies ist auch der ganze Grund, warum Timeouts existieren (und dann sollten Sie dieses Szenario ordnungsgemäß behandeln). Siehe den Link oben für den asynchronen Weg
iwasrobbed

Antworten:

251

Ich habe etwas mehr recherchiert und aktualisiere meine Antwort mit einer aktuelleren Lösung. Ich bin mir nicht sicher, ob Sie es sich bereits angesehen haben, aber es gibt einen schönen Beispielcode von Apple.

Laden Sie den Beispielcode hier

Fügen Sie die Dateien Reachability.h und Reachability.m in Ihr Projekt ein. Schauen Sie sich ReachabilityAppDelegate.m an, um ein Beispiel zu sehen, wie Sie die Erreichbarkeit von Hosts, die Erreichbarkeit über WLAN, WWAN usw. bestimmen können. Um die Erreichbarkeit des Netzwerks ganz einfach zu überprüfen, können Sie Folgendes tun

Reachability *networkReachability = [Reachability reachabilityForInternetConnection];   
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];    
if (networkStatus == NotReachable) {        
    NSLog(@"There IS NO internet connection");        
} else {        
     NSLog(@"There IS internet connection");        
}

@ BenjaminPiette's: Vergessen Sie nicht, SystemConfiguration.framework zu Ihrem Projekt hinzuzufügen.

Semere Taézaz Sium
quelle
46
Vergessen Sie nicht, SystemConfiguration.framework zu Ihrem Projekt hinzuzufügen.
Benjamin Piette
1
@ Chandru Es funktioniert. Dies ist der einfachste und effektivste Weg, um eine Netzwerkverbindung zu erkennen. Simpel und einfach!
S1U
3
Sei vorsichtig damit. Ich finde, dass es nicht zuverlässig funktioniert, wenn das Netzwerk wiederhergestellt wird, zumindest im Simulator. Ich starte mit ausgeschaltetem WLAN und es wird korrekt gemeldet, dass kein Netzwerk verfügbar ist. Aber dann schalte ich WLAN wieder ein und SCNetworkReachabilityGetFlags gibt weiterhin 0 zurück, obwohl die tatsächlichen Netzwerkabfragen einwandfrei funktionieren.
Joe Strout
2
Ich glaube, meine Antwort unten ( stackoverflow.com/a/26593728/557362 ) erfordert weniger Arbeit (kein Herunterladen anderer Dateien), aber das ist nur meine Meinung.
GilesDMiddleton
3
Beachten Sie, dass hier nur angegeben wird, ob die Verbindung zum jeweiligen Host routingfähig ist . Das bedeutet nicht, dass Sie tatsächlich eine Verbindung herstellen können. Beispiel: Sie verbinden das WLAN Ihres iPhones mit dem WLAN Ihrer Kamera. Wifi ist mit einem Standard-Gateway verbunden: Alle Hosts melden sich erreichbar. Aber das sind sie eigentlich nicht - die Kamera ist eine Sackgasse.
Xaphod
45

Da dieser Thread das beste Google-Ergebnis für diese Art von Frage ist, dachte ich, ich würde die Lösung bereitstellen, die für mich funktioniert. Ich habe bereits AFNetworking verwendet , aber die Suche hat erst in der Mitte meines Projekts ergeben, wie diese Aufgabe mit AFNetworking ausgeführt werden kann.

Was Sie wollen, ist der AFNetworkingReachabilityManager .

// -- Start monitoring network reachability (globally available) -- //
[[AFNetworkReachabilityManager sharedManager] startMonitoring];

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

    NSLog(@"Reachability changed: %@", AFStringFromNetworkReachabilityStatus(status));


    switch (status) {
        case AFNetworkReachabilityStatusReachableViaWWAN:
        case AFNetworkReachabilityStatusReachableViaWiFi:
            // -- Reachable -- //
            NSLog(@"Reachable");
            break;
        case AFNetworkReachabilityStatusNotReachable:
        default:
            // -- Not reachable -- //
            NSLog(@"Not Reachable");
            break;
    }

}];

Sie können auch Folgendes verwenden, um die Erreichbarkeit synchron zu testen (sobald die Überwachung gestartet wurde):

-(BOOL) isInternetReachable
{
    return [AFNetworkReachabilityManager sharedManager].reachable;
}
Sherbertman
quelle
3
Ich habe dafür gestimmt, dass ich das ans AFNetworkReachabilityManagerLicht gebracht habe!
Selvin
Für diejenigen, denen dies nicht sofort klar war: AFNetworking ist eine Bibliothek von Drittanbietern.
Arlomedia
1
Die Erreichbarkeit des Netzwerks ist ein Diagnosetool, mit dem Sie nachvollziehen können, warum eine Anforderung möglicherweise fehlgeschlagen ist. Es sollte nicht verwendet werden, um zu bestimmen, ob eine Anfrage gestellt werden soll oder nicht. - Das steht in der Dokumentation.
Nosov Pavel
AFNetworkReachabilityManager.reachableführt KEINE synchrone Prüfung durch. Es gibt ein logisches oder von reachableViaWWANund zurück reachableViaWifi.
jdolan
40

Entschuldigen Sie die zu späte Antwort, aber ich hoffe, diese Antwort kann in Zukunft jemandem helfen.

Im Folgenden finden Sie ein kleines natives C-Code-Snippet, mit dem die Internetverbindung ohne zusätzliche Klasse überprüft werden kann.

Fügen Sie die folgenden Überschriften hinzu:

#include<unistd.h>
#include<netdb.h>

Code:

-(BOOL)isNetworkAvailable
{
    char *hostname;
    struct hostent *hostinfo;
    hostname = "google.com";
    hostinfo = gethostbyname (hostname);
    if (hostinfo == NULL){
        NSLog(@"-> no connection!\n");
        return NO;
    }
    else{
        NSLog(@"-> connection established!\n");
        return YES;
    }
}

Swift 3

func isConnectedToInternet() -> Bool {
    let hostname = "google.com"
    //let hostinfo = gethostbyname(hostname)
    let hostinfo = gethostbyname2(hostname, AF_INET6)//AF_INET6
    if hostinfo != nil {
        return true // internet available
      }
     return false // no internet
    }
dispatchMain
quelle
3
funktioniert viel besser als Apple Reachability. Laut docs ist gethostbyname jedoch veraltet und Sie sollten getaddrinfo verwenden: struct addrinfo * res = NULL; int s = getaddrinfo ("apple.com", NULL, NULL & res); bool network_ok = (s == 0 && res! = NULL); freeaddrinfo (res);
Tertium
1
Obwohl es üblich ist, google.com zu verwenden, um die Internetverfügbarkeit zu überprüfen, ist es erwähnenswert, dass es in einigen Ländern blockiert ist. Eine bessere Wahl wären Domains von "regierungsfreundlicheren" Unternehmen wie yahoo.com oder microsoft.com.
Laurent
8
@Laurent: Am besten verwenden Sie die Serveradresse, von der Sie Daten anfordern möchten. google.com hier ist nur ein Beispiel.
dispatchMain
7
Führt dies nur eine DNS-Suche durch? Wenn ja, könnte ein zwischengespeichertes DNS-Ergebnis dazu führen, dass die Funktion fälschlicherweise glaubt, dass das Netzwerk verfügbar ist?
Stephen Moore
2
@amar Wenn Sie dies in einer Schleife ausführen, werden drahtlose Daten verbraucht. Das möchten Sie nicht.
Sinn-Angelegenheiten
31

Ich verwende derzeit diese einfache synchrone Methode, für die keine zusätzlichen Dateien in Ihren Projekten oder Delegaten erforderlich sind.

Importieren:

#import <SystemConfiguration/SCNetworkReachability.h>

Erstellen Sie diese Methode:

+(bool)isNetworkAvailable
{
    SCNetworkReachabilityFlags flags;
    SCNetworkReachabilityRef address;
    address = SCNetworkReachabilityCreateWithName(NULL, "www.apple.com" );
    Boolean success = SCNetworkReachabilityGetFlags(address, &flags);
    CFRelease(address);

    bool canReach = success
                    && !(flags & kSCNetworkReachabilityFlagsConnectionRequired)
                    && (flags & kSCNetworkReachabilityFlagsReachable);

    return canReach;
}

Dann, wenn Sie dies in ein MyNetworkClass:

if( [MyNetworkClass isNetworkAvailable] )
{
   // do something networky.
}

Wenn Sie im Simulator testen, schalten Sie das WLAN Ihres Mac ein und aus, da der Simulator die Telefoneinstellungen anscheinend ignoriert.

Aktualisieren:

  1. Am Ende habe ich einen Thread / asynchronen Rückruf verwendet, um zu vermeiden, dass der Haupt-Thread blockiert wird. und regelmäßig erneut testen, damit ich ein zwischengespeichertes Ergebnis verwenden kann - obwohl Sie vermeiden sollten, Datenverbindungen unnötig offen zu halten.

  2. Wie @thunk beschrieben hat, gibt es bessere URLs, die Apple selbst verwendet. http://cadinc.com/blog/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network

GilesDMiddleton
quelle
1
Vielen Dank und wie bei den meisten anderen in diesem Thread: Vergessen Sie nicht, Ihrem Projekt SystemConfiguration.framework hinzuzufügen.
Eselk
1
Seltsamerweise musste ich in meinem Xcode-Projekt das SystemConfiguration.framework nicht hinzufügen. Ich habe SpriteKit, UIKit, StoreKit, Foundation und CoreGraphics, aber nicht SystemConfiguration .... Gibt es eine implizite Einbeziehung?
GilesDMiddleton
3
Dies hat bei mir funktioniert, aber als ich es ausgeführt habe, als ich mit einem Wi-Fi-Netzwerk verbunden war, das keine Internetverbindung hat, hat es meine Benutzeroberfläche für etwa 30 Sekunden gesperrt. In dieser Situation ist ein asynchroner Ansatz erforderlich.
Arlomedia
2
www.apple.comist große Website ... die bessere Option wird seinwww.google.com
Fahim Parkar
2
ausgezeichnete Antwort! Ein Vorschlag: Die Test-URL www.appleiphonecell.comist angeblich ausschließlich für diesen Zweck verfügbar und in China offenbar nicht blockiert.
Thunk
11

Es ist möglich und es ist wirklich einfach, wenn Sie es sich nach Abschluss der Implementierung ansehen, was wiederum sehr einfach ist, da Sie nur zwei boolesche Variablen benötigen: Internet-Erreichbarkeit und Host-Erreichbarkeit (häufig benötigen Sie mehr als eine davon ). Sobald Sie Ihre Hilfsklasse zusammengestellt haben, die den Verbindungsstatus bestimmen kann, ist Ihnen die Implementierung, die zum Kennen dieser Verfahren erforderlich ist, wirklich egal.

Beispiel:

#import <Foundation/Foundation.h>

@class Reachability;

@interface ConnectionManager : NSObject {
    Reachability *internetReachable;
    Reachability *hostReachable;
}

@property BOOL internetActive;
@property BOOL hostActive;

- (void) checkNetworkStatus:(NSNotification *)notice;

@end

Und die .m-Datei:

#import "ConnectionManager.h"
#import "Reachability.h"

@implementation ConnectionManager
@synthesize internetActive, hostActive;

-(id)init {
    self = [super init];
    if(self) {

    }
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

    internetReachable = [[Reachability reachabilityForInternetConnection] retain];
    [internetReachable startNotifier];

    hostReachable = [[Reachability reachabilityWithHostName:@"www.apple.com"] retain];
    [hostReachable startNotifier];

    return self;
}

- (void) checkNetworkStatus:(NSNotification *)notice {
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)

    {
        case NotReachable:
        {
            NSLog(@"The internet is down.");
            self.internetActive = NO;

            break;

        }
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is working via WIFI.");
            self.internetActive = YES;

            break;

        }
        case ReachableViaWWAN:
        {
            NSLog(@"The internet is working via WWAN.");
            self.internetActive = YES;

            break;

        }
    }

    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus)

    {
        case NotReachable:
        {
            NSLog(@"A gateway to the host server is down.");
            self.hostActive = NO;

            break;

        }
        case ReachableViaWiFi:
        {
            NSLog(@"A gateway to the host server is working via WIFI.");
            self.hostActive = YES;

            break;

        }
        case ReachableViaWWAN:
        {
            NSLog(@"A gateway to the host server is working via WWAN.");
            self.hostActive = YES;

            break;

        }
    }

}

// If lower than SDK 5 : Otherwise, remove the observer as pleased.

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

@end
Danut Pralea
quelle
4

Ich habe den Code extrahiert und in eine einzige Methode eingefügt, hoffe, es würde anderen helfen.

#import <SystemConfiguration/SystemConfiguration.h>

#import <netinet/in.h>
#import <netinet6/in6.h>

...

- (BOOL)isInternetReachable
{    
    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);
    SCNetworkReachabilityFlags flags;

    if(reachability == NULL)
        return false;

    if (!(SCNetworkReachabilityGetFlags(reachability, &flags)))
        return false;

    if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
        // if target host is not reachable
        return false;


    BOOL isReachable = false;


    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
        isReachable = true;
    }


    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
            isReachable = true;
        }
    }

    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
    {
        // ... but WWAN connections are OK if the calling application
        //     is using the CFNetwork (CFSocketStream?) APIs.
        isReachable = true;
    }


    return isReachable;


}
Walty Yeung
quelle
[A] Woher haben Sie diesen Code extrahiert? Können Sie einen Link zur Quelle posten? [B] Vielen Dank für Ihre Extraktionsarbeit! Genau das, was ich brauchte. Ich wollte diese Aufgabe selbst erledigen.
Basil Bourque
Es scheint also, dass dies die einzige Antwort ist, die keine Remote-Server überprüft.
Jasper
Beachten Sie für andere, die dies unter MacOS testen, dass kSCNetworkReachabilityFlagsIsWWAN für OS_IPHONE und nicht für macOS gilt.
GeoffCoope
4

Ich schreibe die schnelle Version der akzeptierten Antwort hier , einhüllen , wenn jemand findet es sinnvoll, wird der Code swift 2 geschrieben,

Sie können die erforderlichen Dateien von SampleCode herunterladen

Hinzufügen Reachability.hund Reachability.mAblegen zu Ihrem Projekt,

Jetzt muss eine Bridging-Header.hDatei erstellt werden, wenn für Ihr Projekt keine vorhanden ist.

Fügen Sie in Ihrer Bridging-Header.hDatei diese Zeile hinzu:

#import "Reachability.h"

Jetzt, um nach der Internetverbindung zu suchen

static func isInternetAvailable() -> Bool {
    let networkReachability : Reachability = Reachability.reachabilityForInternetConnection()
    let networkStatus : NetworkStatus = networkReachability.currentReachabilityStatus()

    if networkStatus == NotReachable {
        print("No Internet")
        return false
    } else {
        print("Internet Available")
        return true
    }

}
Satyen Udeshi
quelle
3

Ich denke das könnte helfen ..

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

if([AFNetworkReachabilityManager sharedManager].isReachable)
{
    NSLog(@"Network reachable");
}
else
{   
   NSLog(@"Network not reachable");
}
pooja
quelle
Dies funktioniert nicht, wenn die Netzwerkschnittstelle nicht geändert wird und die Internetverbindung unterbrochen wird.
Pratik Somaiya
2

Sie können dies auch versuchen, wenn Sie AFNetworking bereits in Ihrem Projekt konfiguriert haben.

-(void)viewDidLoad{  // -- add connectivity notification --//
[[NSNotificationCenter defaultCenter ] addObserver:self selector:@selector(ReachabilityDidChangeNotification:) name:AFNetworkingReachabilityDidChangeNotification object:nil];}
-(void)ReachabilityDidChangeNotification:(NSNotification *)notify
{
// -- NSLog(@"Reachability changed: %@", AFStringFromNetworkReachabilityStatus(status));  -- //
NSDictionary *userInfo =[notif userInfo];
AFNetworkReachabilityStatus status= [[userInfo valueForKey:AFNetworkingReachabilityNotificationStatusItem] intValue];
switch (status)
{
    case AFNetworkReachabilityStatusReachableViaWWAN:
    case AFNetworkReachabilityStatusReachableViaWiFi:
        // -- Reachable -- //
// -- Do your stuff when internet connection is available -- //
        [self getLatestStuff];
        NSLog(@"Reachable");
        break;
    case AFNetworkReachabilityStatusNotReachable:
    default:
        // -- Not reachable -- //
        // -- Do your stuff for internet connection not available -- //
NSLog(@"Not Reachable");
        break;
}
}
Ravi Raja Jangid
quelle
1

Hier ist eine gute Lösung zum Überprüfen der Konnektivität mit Swift ohne Erreichbarkeit. Ich habe es auf diesem Blog gefunden .

Erstellen Sie in Ihrem Projekt eine neue Swift-Datei mit dem Namen Network.swift(zum Beispiel). Fügen Sie diesen Code in diese Datei ein:

import Foundation

public class Network {

    class func isConnectedToNetwork()->Bool{

        var Status:Bool = false
        let url = NSURL(string: "http://google.com/")
        let request = NSMutableURLRequest(URL: url!)
        request.HTTPMethod = "HEAD"
        request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
        request.timeoutInterval = 10.0

        var response: NSURLResponse?

        var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: nil) as NSData?

        if let httpResponse = response as? NSHTTPURLResponse {
            if httpResponse.statusCode == 200 {
                Status = true
            }
        }

        return Status
    }
}

Sie können dann die Konnektivität an einer beliebigen Stelle in Ihrem Projekt überprüfen, indem Sie Folgendes verwenden:

if Network.isConnectedToNetwork() == true {
    println("Internet connection OK")
} else {
    println("Internet connection FAILED")
}
blwinters
quelle
0

BEARBEITEN: Dies funktioniert nicht für Netzwerk-URLs (siehe Kommentare)

Ab iOS 5 gibt es eine neue NSURL-Instanzmethode:

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error

Zeigen Sie auf die Website, die Sie interessiert, oder auf apple.com. Ich denke, es ist der neue einzeilige Anruf, um zu sehen, ob das Internet auf Ihrem Gerät funktioniert.

SG1
quelle
Tatsächlich gibt dies in meinen eigenen Tests immer false zurück. Die Dokumente geben an, dass dies für 4.x der Fall ist, aber ab 5 sollte es funktionieren. YMMV
SG1
Dies scheint für die gesuchte Situation nicht zu funktionieren. Sehen stackoverflow.com/questions/9266154/…
Micah Hainline
7
Dies wird für Datei-URLs verwendet, nicht für Internet-URLs.
Victor Bogdan
0

Ich war auch nicht zufrieden mit den verfügbaren Internet-Überprüfungsoptionen (Warum ist dies keine native API?!?!)

Mein eigenes Problem war der 100% ige Paketverlust - wenn ein Gerät mit dem Router verbunden ist, der Router jedoch nicht mit dem Internet verbunden ist. Erreichbarkeit und andere werden für Ewigkeiten hängen. Ich habe eine Dienstprogramm-Singleton-Klasse erstellt, um dies durch Hinzufügen eines asynchronen Timeouts zu beheben. Es funktioniert gut in meiner App. Ich hoffe es hilft. Hier ist der Link auf Github:

https://github.com/fareast555/TFInternetChecker

Mike Critchley
quelle
0

Überprüfen der Verfügbarkeit der Internetverbindung in (iOS) Xcode 8.2, Swift 3.0

Dies ist eine einfache Methode zum Überprüfen der Netzwerkverfügbarkeit. Ich habe es geschafft, es in Swift 2.0 und hier den endgültigen Code zu übersetzen. Die vorhandene Apple Reachability-Klasse und andere Bibliotheken von Drittanbietern schienen zu kompliziert zu sein, um in Swift übersetzt zu werden.

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

Vergessen Sie nicht, Ihrem Project Builder "SystemConfiguration.framework" hinzuzufügen.

//Create new swift class file Reachability in your project.

import SystemConfiguration

public class Reachability {
class func isConnectedToNetwork() -> Bool {
    var zeroAddress = sockaddr_in()
    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()
    if !SCNetworkReachabilityGetFlags(defaultRouteReachability! , &flags) {
        return false
    }
    let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
    let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
    return (isReachable && !needsConnection)
   }
}

// Check network connectivity from anywhere in project by using this code.

if Reachability.isConnectedToNetwork() == true {
     print("Internet connection OK")
} else {
 print("Internet connection FAILED")
}
ViJay Avhad
quelle
Mit Xcode Version 7.2 (7C68) hat dieser Code Compilerfehler
Daniel
@ Daniel, danke für das Hinweisproblem, dies wegen unsicherer Zeiger, da Swift 2 / Xcode dort die Syntax aktualisiert, sollten wir ihnen folgen. Ich habe Code für das gleiche aktualisiert. ty;)
ViJay Avhad
Wenn Sie mit einem WLAN verbunden sind, aber keine Verbindung zum Internet herstellen können (öffnen Sie eine Google-Seite), wird immer noch true für erreichbar zurückgegeben. Es ist falsch.
Arildo Junior
0

Ersatz für Apples Erreichbarkeit in Swift neu geschrieben mit Verschlüssen , inspiriert von tonymillion: https://github.com/ashleymills/Reachability.swift

  1. Legen Sie die Datei Reachability.swiftin Ihrem Projekt ab. Alternativ können Sie CocoaPods oder Carthage verwenden. Weitere Informationen finden Sie im Abschnitt Installation der README- Datei des Projekts.

  2. Erhalten Sie Benachrichtigungen über die Netzwerkkonnektivität:

    //declare this property where it won't go out of scope relative to your listener
    let reachability = Reachability()!
    
    reachability.whenReachable = { reachability in
        if reachability.isReachableViaWiFi {
            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")
    }

    und zum Stoppen von Benachrichtigungen

    reachability.stopNotifier()
Pierre F.
quelle
0

Alamofire

Wenn Sie Alamofire bereits für alle RESTful-APIs verwenden, können Sie davon profitieren.

Sie können Ihrer App die folgende Klasse hinzufügen und aufrufen MNNetworkUtils.main.isConnected(), um einen Booleschen Wert zu erhalten, ob eine Verbindung besteht oder nicht.

#import Alamofire

class MNNetworkUtils {
  static let main = MNNetworkUtils()
  init() {
    manager = NetworkReachabilityManager(host: "google.com")
    listenForReachability()
  }

  private let manager: NetworkReachabilityManager?
  private var reachable: Bool = false
  private func listenForReachability() {
    self.manager?.listener = { [unowned self] status in
      switch status {
      case .notReachable:
        self.reachable = false
      case .reachable(_), .unknown:
        self.reachable = true
      }
    }
    self.manager?.startListening()
  }

  func isConnected() -> Bool {
    return reachable
  }
}

Dies ist eine Singleton-Klasse. Jedes Mal, wenn Benutzer das Netzwerk verbinden oder trennen, wird es self.reachablekorrekt auf true / false überschrieben , da wir auf die NetworkReachabilityManagerOn-Singleton-Initialisierung warten.

Um die Erreichbarkeit zu überwachen, müssen Sie einen Host bereitstellen. Derzeit kann ich bei Bedarf zu einem google.comanderen Host oder einem Ihrer Hosts wechseln.

nuynait
quelle