以下の方法があります。あなたの質問にもっと直接的になるために、私はどちらかで接続をチェックしません。
例:私はアプリの最初のネットワーク通話にアクセスしてから、Wi-Fiをオンにします。
問題:アプリケーションでWi-Fiが必要なものは使用されていませんが、私のアプリケーションは失敗します。
私の方法:ログインページのネットワーク接続を確認できますが、それ以外にもネットワークに接続します。ネットワークコールが失敗した場合は、接続を確認してから、サーバーのためにコールが失敗したかどうか、またはネットワークのためにコールが失敗したかどうかをユーザーに関連付けます。
これは私が到達可能性のために使用するものです。
import Foundation
/// This class is designed to check if the network is connected.
open class Reachability {
/// This function will hit two urls that should never be totally down to see if the device is connected
/// If either url connects, this returns true
///
/// - Parameter resultHandler: returns the result of the connection existing as a Bool in a resultHandler
class func isConnectedToNetwork(_ resultHandler: @escaping (_ isTrue: Bool) -> Void) {
let urlA = URL(string: "https://google.com/")
let urlB = URL(string: "https://baidu.com/")
Reachability.fetchURL(urlA!) { isTrue in
if isTrue {
print("NETWORK STATUS: \(isTrue)")
resultHandler(isTrue)
} else {
Reachability.fetchURL(urlB!, resultHandler: resultHandler)
}
}
}
/// Hits a URL in order to see if the device can connect to it
///
/// - Parameters:
/// - url: the url to request
/// - resultHandler: returns whether the url was successfully retrieved or not
class func fetchURL(_ url:URL, resultHandler: @escaping (_ isTrue: Bool) -> Void) {
var request = URLRequest(url: url)
request.httpMethod = "HEAD"
request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData
request.timeoutInterval = 10.0
let session = URLSession(configuration: .default)
let dataTask = session.dataTask(with: request) { data, response, error in
if let httpResponse = response as? HTTPURLResponse {
if httpResponse.statusCode == 200 {
resultHandler(true)
} else {
resultHandler(false)
}
} else {
resultHandler(false)
}
}
dataTask.resume()
}
}
は次にどこかのコードで、あなたはそうのようにそれを呼び出すことができます。
Reachability.isConnectedToNetwork() { isConnected in
if isConnected {
//Do something when connected
} else {
//Do something when not connected
}
}
closure resultHandlerにダブルアップを持たないのはどこですか? – Sethmr
@ dkw5877私はクラスについて知っています、私の質問は、コードでは、AppDelegateを実装する、または各ViewDidAppearメソッドでより適切なはずです。 – Giovanni
私は@ Velix007アプローチを私がオフラインモードを持たないアプリで使ってきました。アプリケーションデリゲートのステータス変更を監視し、最上位のビューコントローラからインターネット接続ビューコントローラを表示します。 –