SwiftのAlamofire NetworkReachabilityManagerを備えたObjective-CのAFNetworking
と同様の機能が必要です。
//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;
}
}
}];
私は現在、リスナーを使用してネットワークのステータスの変化を把握しています
let net = NetworkReachabilityManager()
net?.startListening()
誰かがそれらのユースケースをサポートする方法を説明できますか?
私は自分自身で答えを見つけました。つまり、以下に記載されているように、クロージャーを持つリスナーを書くだけです:
let net = NetworkReachabilityManager()
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")
}
}
net?.startListening()
NetworkManagerクラス
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()
}
}
ネットワーク到達可能性監視を開始
@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
}
}
これが私の実装です。私はシングルトンでそれを使用します。リーチャビリティマネージャのリファレンスを忘れずに保持してください。
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()
}
ReachabilityManagerの参照を保持している限り、シングルトンの使用は機能しています
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()
}
したがって、アプリのどこでも次のように使用できます。
let networkStatus = NetworkStatus.sharedInstance
override func awakeFromNib() {
super.awakeFromNib()
networkStatus.startNetworkReachabilityObserver()
}
ネットワークステータスの変更が通知されます。ケーキのアイシングのためだけに this は、インターネット接続の損失を示す非常に良いアニメーションです。
Appleは、可能な場合はクラスの代わりに構造体を使用すると言います。 @rmooneyと@Ammadの私のバージョンはここにありますが、クラスの代わりに構造体を使用しています。さらに、メソッドや関数を使用する代わりに、計算されたプロパティを使用しています。このアイデアは、@ Abhimuralidharanによる post から得られました。クラスの代わりに構造体を使用するという考え(シングルトンが必要ないため)と、メソッド呼び出しの代わりに計算されたプロパティを1つのソリューションで一緒に使用するだけです。
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
}
}
コードでの使用方法は次のとおりです。
if NetworkState().isConnected {
// do your is Connected stuff here
}
Swift 5
NetworkState構造
import Foundation
import Alamofire
struct NetworkState {
var isInternetAvailable:Bool
{
return NetworkReachabilityManager()!.isReachable
}
}
使用:-
if (NetworkState().isInternetAvailable) {
// Your code here
}