Ich möchte eine ähnliche Funktionalität wie AFNetworking
in Objective-C mit Alamofire NetworkReachabilityManager in Swift:
//Reachability detection
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN: {
[self LoadNoInternetView:NO];
break;
}
case AFNetworkReachabilityStatusReachableViaWiFi: {
[self LoadNoInternetView:NO];
break;
}
case AFNetworkReachabilityStatusNotReachable: {
break;
}
default: {
break;
}
}
}];
Ich verwende derzeit den Listener, um die Statusänderungen des Netzwerks zu erfahren
let net = NetworkReachabilityManager()
net?.startListening()
Kann jemand beschreiben, wie diese Anwendungsfälle unterstützt werden sollen?
Ich habe die Antwort selbst gefunden, d. H. Indem ich einfach einen Hörer mit dem folgenden Verschluss schrieb:
let net = NetworkReachabilityManager()
net?.startListening()
net?.listener = { status in
if net?.isReachable ?? false {
switch status {
case .reachable(.ethernetOrWiFi):
print("The network is reachable over the WiFi connection")
case .reachable(.wwan):
print("The network is reachable over the WWAN connection")
case .notReachable:
print("The network is not reachable")
case .unknown :
print("It is unknown whether the network is reachable")
}
}
NetworkManager-Klasse
class NetworkManager {
//shared instance
static let shared = NetworkManager()
let reachabilityManager = Alamofire.NetworkReachabilityManager(Host: "www.google.com")
func startNetworkReachabilityObserver() {
reachabilityManager?.listener = { status in
switch status {
case .notReachable:
print("The network is not reachable")
case .unknown :
print("It is unknown whether the network is reachable")
case .reachable(.ethernetOrWiFi):
print("The network is reachable over the WiFi connection")
case .reachable(.wwan):
print("The network is reachable over the WWAN connection")
}
}
// start listening
reachabilityManager?.startListening()
}
}
Network Reachability Observer starten
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// add network reachability observer on app start
NetworkManager.shared.startNetworkReachabilityObserver()
return true
}
}
Hier ist meine Implementierung. Ich benutze es in einem Singleton. Denken Sie daran, die Erreichbarkeitsmanager-Referenz beizubehalten.
let reachabilityManager = Alamofire.NetworkReachabilityManager(Host: "www.Apple.com")
func listenForReachability() {
self.reachabilityManager?.listener = { status in
print("Network Status Changed: \(status)")
switch status {
case .NotReachable:
//Show error state
case .Reachable(_), .Unknown:
//Hide error state
}
}
self.reachabilityManager?.startListening()
}
Die Verwendung eines Singleton funktioniert, solange Sie einen Verweis auf reachabilityManager aufbewahren
class NetworkStatus {
static let sharedInstance = NetworkStatus()
private init() {}
let reachabilityManager = Alamofire.NetworkReachabilityManager(Host: "www.Apple.com")
func startNetworkReachabilityObserver() {
reachabilityManager?.listener = { status in
switch status {
case .notReachable:
print("The network is not reachable")
case .unknown :
print("It is unknown whether the network is reachable")
case .reachable(.ethernetOrWiFi):
print("The network is reachable over the WiFi connection")
case .reachable(.wwan):
print("The network is reachable over the WWAN connection")
}
}
reachabilityManager?.startListening()
}
So können Sie es überall in Ihrer App verwenden:
let networkStatus = NetworkStatus.sharedInstance
override func awakeFromNib() {
super.awakeFromNib()
networkStatus.startNetworkReachabilityObserver()
}
Sie werden über jede Änderung Ihres Netzwerkstatus informiert. Nur für das Sahnehäubchen dies ist eine sehr gute Animation, die auf Ihrem Internet-Verbindungsverlust angezeigt wird.
Swift 5
NetworkState Structure
import Foundation
import Alamofire
struct NetworkState {
var isInternetAvailable:Bool
{
return NetworkReachabilityManager()!.isReachable
}
}
Verwenden Sie: -
if (NetworkState().isInternetAvailable) {
// Your code here
}
Apple sagt, dass Sie, wenn möglich, eine Struktur anstelle einer Klasse verwenden. Also hier meine Version von @rmooney und @Ammad's Antworten, allerdings mit einer struct anstelle einer Klasse. Anstatt eine Methode oder Funktion zu verwenden, verwende ich außerdem eine berechnete Eigenschaft, und ich habe diese Idee von diesem Medium post von @Abhimuralidharan erhalten. Ich habe nur die Idee, eine struct anstelle einer Klasse zu verwenden (damit Sie keinen Singleton haben müssen) und eine berechnete Eigenschaft anstelle eines Methodenaufrufs in einer Lösung zu verwenden.
Hier ist der struct NetworkState:
import Foundation
import Alamofire
struct NetworkState {
var isConnected: Bool {
// isReachable checks for wwan, ethernet, and wifi, if
// you only want 1 or 2 of these, the change the .isReachable
// at the end to one of the other options.
return NetworkReachabilityManager(Host: www.Apple.com)!.isReachable
}
}
So verwenden Sie es in Ihrem Code:
if NetworkState().isConnected {
// do your is Connected stuff here
}