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 HTTPUrlConnection
sofort fehl, wenn keine Verbindung verfügbar ist. Dies scheint ein völlig vernünftiges Verhalten zu sein, und ich war überrascht, dass es NSURLConnection
in iOS nicht emuliert wurde.
Ich verstehe, dass Apple (und andere, die es erweitert haben) eine Reachability
Klasse 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?
quelle
Antworten:
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
@ BenjaminPiette's: Vergessen Sie nicht, SystemConfiguration.framework zu Ihrem Projekt hinzuzufügen.
quelle
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 .
Sie können auch Folgendes verwenden, um die Erreichbarkeit synchron zu testen (sobald die Überwachung gestartet wurde):
quelle
AFNetworkReachabilityManager
Licht gebracht habe!AFNetworkReachabilityManager.reachable
führt KEINE synchrone Prüfung durch. Es gibt ein logisches oder vonreachableViaWWAN
und zurückreachableViaWifi
.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:
Code:
Swift 3
quelle
Ich verwende derzeit diese einfache synchrone Methode, für die keine zusätzlichen Dateien in Ihren Projekten oder Delegaten erforderlich sind.
Importieren:
Erstellen Sie diese Methode:
Dann, wenn Sie dies in ein
MyNetworkClass
:Wenn Sie im Simulator testen, schalten Sie das WLAN Ihres Mac ein und aus, da der Simulator die Telefoneinstellungen anscheinend ignoriert.
Aktualisieren:
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.
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
quelle
www.apple.com
ist große Website ... die bessere Option wird seinwww.google.com
www.appleiphonecell.com
ist angeblich ausschließlich für diesen Zweck verfügbar und in China offenbar nicht blockiert.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:
Und die .m-Datei:
quelle
Jemand hat dies zuvor auf einfache, wiederverwendbare Weise gelöst.
DDGReachability
.EDIT: Or
tonymillion/Reachability
. Enquelle
Ich habe den Code extrahiert und in eine einzige Methode eingefügt, hoffe, es würde anderen helfen.
...
quelle
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.h
undReachability.m
Ablegen zu Ihrem Projekt,Jetzt muss eine
Bridging-Header.h
Datei erstellt werden, wenn für Ihr Projekt keine vorhanden ist.Fügen Sie in Ihrer
Bridging-Header.h
Datei diese Zeile hinzu:Jetzt, um nach der Internetverbindung zu suchen
quelle
Ich denke das könnte helfen ..
quelle
Sie können dies auch versuchen, wenn Sie AFNetworking bereits in Ihrem Projekt konfiguriert haben.
quelle
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:Sie können dann die Konnektivität an einer beliebigen Stelle in Ihrem Projekt überprüfen, indem Sie Folgendes verwenden:
quelle
BEARBEITEN: Dies funktioniert nicht für Netzwerk-URLs (siehe Kommentare)
Ab iOS 5 gibt es eine neue NSURL-Instanzmethode:
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.
quelle
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
quelle
Überprüfen der Verfügbarkeit der Internetverbindung in (iOS) Xcode 8.2, Swift 3.0
quelle
Ersatz für Apples Erreichbarkeit in Swift neu geschrieben mit Verschlüssen , inspiriert von tonymillion: https://github.com/ashleymills/Reachability.swift
Legen Sie die Datei
Reachability.swift
in Ihrem Projekt ab. Alternativ können Sie CocoaPods oder Carthage verwenden. Weitere Informationen finden Sie im Abschnitt Installation der README- Datei des Projekts.Erhalten Sie Benachrichtigungen über die Netzwerkkonnektivität:
und zum Stoppen von Benachrichtigungen
quelle
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.Dies ist eine Singleton-Klasse. Jedes Mal, wenn Benutzer das Netzwerk verbinden oder trennen, wird es
self.reachable
korrekt auf true / false überschrieben , da wir auf dieNetworkReachabilityManager
On-Singleton-Initialisierung warten.Um die Erreichbarkeit zu überwachen, müssen Sie einen Host bereitstellen. Derzeit kann ich bei Bedarf zu einem
google.com
anderen Host oder einem Ihrer Hosts wechseln.quelle