Wenn ich versuche, auf meinem iPhone nach einer Internetverbindung zu suchen, werden einige Fehler angezeigt. Kann mir jemand helfen, das zu beheben?
Der Code:
import Foundation
import SystemConfiguration
public class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
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) ? true : false
}
}
Die Fehler mit dem Code:
Wenn es nicht lesbar ist, lautet Fehler 1:
'Int' kann nicht in 'SCNetworkReachabilityFlags' konvertiert werden.
Fehler 2 & 3:
Es wurde keine Überladung für 'init' gefunden, die die angegebenen Argumente akzeptiert
ios
swift
xcode
reachability
b3rge
quelle
quelle
Antworten:
Um das in den Kommentaren erwähnte 4G-Problem zu lösen, habe ich die Erreichbarkeitsimplementierung von @AshleyMills als Referenz verwendet und die Erreichbarkeit für Swift 3.1 neu geschrieben:
aktualisiert: Xcode 10.1 • Swift 4 oder höher
Reachability.swift-Datei
Verwendung
Initialisieren Sie es in Ihrer didDinegate.swift didFinishLaunchingWithOptions-Methode und behandeln Sie alle Fehler, die auftreten können:
Und ein View Controller-Beispiel:
Beispielprojekt
quelle
if SCNetworkReachabilityGetFlags(…)
as entfernen, da xCode einen Bool in der neuesten Version zurückgibt.Für Swift 3, Swift 4 (Arbeiten mit Mobilfunk und Wi-Fi):
Verwendung:
quelle
Erstellen Sie eine neue Swift-Datei in Ihrem Projekt und benennen Sie sie
Reachability.swift
. Schneiden Sie den folgenden Code aus und fügen Sie ihn ein, um Ihre Klasse zu erstellen.Mit diesem Code können Sie die Internetverbindung an einer beliebigen Stelle in Ihrem Projekt überprüfen:
Wenn der Benutzer nicht mit dem Internet verbunden ist, möchten Sie ihm möglicherweise einen Warndialog anzeigen, um ihn zu benachrichtigen.
Erläuterung:
Wir machen eine wiederverwendbare öffentliche Klasse und eine Methode, die überall im Projekt verwendet werden kann, um die Internetverbindung zu überprüfen. Wir müssen Foundation- und Systemkonfigurations-Frameworks hinzufügen.
In der öffentlichen Klasse Reachability gibt die Methode
isConnectedToNetwork() -> Bool { }
einen Bool-Wert für die Internetverbindung zurück. Wir verwenden eine if-Schleife, um die erforderlichen Aktionen für den Fall auszuführen. Ich hoffe das reicht. Prost!quelle
Wenn jemand Alamofire bereits verwendet, dann -
Verwendung:
quelle
Ich habe die Implementierung der Erreichbarkeitsklasse von Ashley Mill ohne Cocoa Pods / Dependancy Manager überprüft. Die Idee ist, die Erreichbarkeitsabhängigkeit im Projekt frei zu machen.
Xcode 7.2 - Swift 2.1
1) https://github.com/ashleymills/Reachability.swift . Download Fügen Sie dem Projekt die Erreichbarkeitsklasse hinzu.
Hinweis: Stellen Sie beim Hinzufügen sicher, dass "Elemente bei Bedarf kopieren" aktiviert ist.
2) Erstellen Sie eine AppManager.swift-Klasse. Diese Klasse wird als öffentliche Modellklasse angeboten, in der öffentliche Methoden und Daten hinzugefügt werden und in jedem VC verwendet werden können.
3) Machen Sie eine Delegiertenklasse. Ich verwende die Delegate-Methode, um den Konnektivitätsstatus zu benachrichtigen.
4) Machen Sie die übergeordnete Klasse von UIViewController (Vererbungsmethode). Die übergeordnete Klasse verfügt über Methoden, auf die alle untergeordneten VCs zugreifen können.
5) Starten Sie die Echtzeit-Überwachung der Internetverbindung in AppDelegate.
6) Ich habe eine Swift File Name AppReference hinzugefügt, um konstante Aufzählungswerte zu speichern.
7) Auf ViewController (z. B. Sie möchten eine API nur aufrufen, wenn ein Netzwerk verfügbar ist).
Das Beispiel kann heruntergeladen werden @ https://github.com/alvinreuben/Reachability-Sample
Upgrade auf Swift 3.1- https://github.com/alvinvgeorge/Reachability-UpgradedToSwift3
quelle
Apple hat Network Framework in iOS12 eingeführt.
quelle
pathUpdateHandler
wird eine starke Referenz mit einführenself
, hinzufügen[weak self]
, um es zu lösen :)Verwenden Sie dies für Swift-5 +
Verwendung:
Oder verwenden Sie dies einfach
framework
für mehrUtilities
: Linkquelle
Hab das nur für mich selbst herausgefunden.
Xcode: 7.3.1, iOS 9.3.3
Mit ashleymills / Reachability.swift als Reachability.swift in meinem Projekt habe ich die folgende Funktion erstellt:
Rufen
hasConnectivity()
Sie einfach an, wo immer Sie nach einer Verbindung suchen müssen. Dies funktioniert sowohl für Wifi als auch für Cellular.Hinzufügen von Reachability.swift von ashleymills, damit die Benutzer nicht zwischen Standorten wechseln müssen:
quelle
let reachability: Reachability = try Reachability.reachabilityForInternetConnection()
zulet reachability: Reachability = try Reachability()!
Obwohl es Ihre Frage nicht direkt beantwortet, möchte ich erwähnen, dass Apple kürzlich diesen Vortrag gehalten hat:
https://developer.apple.com/videos/play/wwdc2018/714/
Gegen 09:55 Uhr spricht er darüber, wie man das macht, worüber man fragt:
Dies hat jedoch einige Fallstricke:
Die folgenden Punkte sind laut Apple einige bewährte Methoden:
waitsForConnectivity
auf wahr ( https://developer.apple.com/documentation/foundation/urlsessionconfiguration/2908812-waitsforconnectivity )taskIsWaitingForConnectivity
( https://developer.apple.com/documentation/foundation/urlsessiontaskdelegate/2908819-urlsession ). Dies ist die von Apple empfohlene Methode, um die Konnektivität zu überprüfen, wie im Video um 33:25 Uhr erwähnt.Laut dem Vortrag sollte es keinen Grund geben, vorab zu prüfen, ob Sie eine Internetverbindung haben oder nicht, da diese zum Zeitpunkt des Sendens Ihrer Anfrage an den Server möglicherweise nicht korrekt ist .
quelle
Ich habe meine eigene Lösung mit NSTimer und Alamofire erstellt:
Der NSTimer wird als Zeitlimit verwendet und wurde aufgrund unzuverlässiger Ergebnisse bei Verwendung des Alamofire-Zeitlimits verwendet. Die Anfrage sollte an eine URL gerichtet werden, der Sie als zuverlässig vertrauen, z. B. Ihren eigenen Server oder den Server, auf dem die Dienste gehostet werden, von denen Sie abhängig sind.
Wenn der Timer abläuft, wird die Anforderung abgebrochen und die Ergebnisse werden mithilfe eines Abschlusshandlers zurückgegeben.
Verwendung:
quelle
requestTimeout()
würde aufgerufen werden, nachdem das angegebene Timeout erreicht wurdeWenn Sie Alamofire verwenden, können Sie Folgendes tun:
quelle
hier meine lösung für swift 2.3 mit der lib ( Reachability.swift )
Gehen Sie in Ihre
Podfile
und fügen Sie hinzu:Dann in deine
terminal
:Erstellen Sie dann eine neue Datei
ReachabilityManager
und fügen Sie den folgenden Code hinzu:Wie man es benutzt:
Gehen Sie in Ihre
AppDelegate.swift
und fügen Sie den folgenden Code hinzu:Wenn Sie dann überprüfen möchten, ob das Gerät mit dem Internet verbunden ist, gehen Sie wie folgt vor:
quelle
Während möglicherweise nicht direkt festgestellt wird, ob das Telefon mit einem Netzwerk verbunden ist, besteht die einfachste (, sauberste?) Lösung darin, Google oder einen anderen Server zu "pingen" (was nur möglich ist, wenn das Telefon mit einem Netzwerk verbunden ist) ):
Wenn Sie befürchten, dass der Server ausfällt oder Ihre IP blockiert, können Sie jederzeit mehrere Server auf ähnliche Weise anpingen und zurückgeben, ob einer von ihnen erreichbar ist. Oder lassen Sie jemanden einen dedizierten Server nur für diesen Zweck einrichten.
quelle
Swift 5
Verwenden Sie bei jeder Methode die folgende Bedingung
quelle
Mit Hilfe des folgenden Codes können Sie die Internetverbindung sowohl für Mobilfunknetze als auch für WLAN überprüfen. Sprache - Swift 3.0
quelle
Für Swift 3 konnte ich nicht nur die Erreichbarkeit von RAJAMOHAN-S-Lösungen verwenden, da es "true" zurückgibt, wenn WiFi, aber kein Internet vorhanden ist. Daher habe ich die zweite Validierung über die URLSession-Klasse und den Completion-Handler implementiert.
Hier ist die ganze Klasse.
Und Sie nennen das zum Beispiel so:
quelle
Das ist meine Version. Im Wesentlichen bringt es nichts Neues. Ich habe es an UIDevice gebunden.
quelle
Nennen Sie es jetzt
quelle