私はサーバーでHTTPリクエストを行うために以下のコードを使用しています。今、それがインターネットに接続されているかどうかを知りたいです。以下は私のコードです
let request = Alamofire.request(completeURL(domainName: path), method: method, parameters: parameters, encoding: encoding.value, headers: headers)
.responseJSON {
let resstr = NSString(data: $0.data!, encoding: String.Encoding.utf8.rawValue)
print("error is \(resstr)")
if $0.result.isFailure {
self.failure("Network")
print("API FAILED 4")
return
}
guard let result = $0.result.value else {
self.unKnownError()
self.failure("")
print("API FAILED 3")
return
}
self.handleSuccess(JSON(result))
}
For Swift 3.1 and Alamofire 4.4、私はSwift Connectivity
というクラス。必要に応じて、NetworkReachabilityManager
およびAlamofire
のconfigure
クラスからisConnectedToInternet()
メソッドを使用します。
import Foundation
import Alamofire
class Connectivity {
class func isConnectedToInternet() -> Bool {
return NetworkReachabilityManager()?.isReachable ?? false
}
}
使用法:
if Connectivity.isConnectedToInternet() {
print("Yes! internet is available.")
// do some tasks..
}
EDIT: Swiftは計算されたプロパティを奨励しているので、上記の関数を次のように変更できます:
import Foundation
import Alamofire
class Connectivity {
class var isConnectedToInternet:Bool {
return NetworkReachabilityManager()?.isReachable ?? false
}
}
次のように使用します:
if Connectivity.isConnectedToInternet {
print("Yes! internet is available.")
// do some tasks..
}
Swift 2.
Alamofire.request(.POST, url).responseJSON { response in
switch response.result {
case .Success(let json):
// internet works.
case .Failure(let error):
if let err = error as? NSURLError where err == .NotConnectedToInternet {
// no internet connection
} else {
// other failures
}
}
}
Swift 3.
Alamofire.upload(multipartFormData: { multipartFormData in
}, to: URL, method: .post,headers: nil,
encodingCompletion: { (result) in
switch result {
case .success( _, _, _): break
case .failure(let encodingError ):
print(encodingError)
if let err = encodingError as? URLError, err.code == .notConnectedToInternet {
// no internet connection
print(err)
} else {
// other failures
}
}
})
NetworkReachabilityManagerを使用
let networkReachabilityManager = Alamofire.NetworkReachabilityManager(Host: "www.Apple.com")
func checkForReachability() {
self.networkReachabilityManager?.listener = { status in
print("Network Status: \(status)")
switch status {
case .notReachable:
//Show error here (no internet connection)
case .reachable(_), .unknown:
//Hide error here
}
}
self.networkReachabilityManager?.startListening()
}
//How to Use : Just call below function in required class
if checkForReachability() {
print("connected with network")
}
Swift 3/4、の場合
Alamofireには、NetworkReachabilityManager
と呼ばれるクラスがあり、インターネットが利用可能かどうかを監視または確認するために使用できます。
let reachabilityManager = NetworkReachabilityManager()
reachabilityManager?.startListening()
reachabilityManager?.listener = { _ in
if let isNetworkReachable = self.reachabilityManager?.isReachable,
isNetworkReachable == true {
//Internet Available
} else {
//Internet Not Available"
}
}
ここでは、インターネットの状態に変化があるたびにリスナーが呼び出されます。好きなように処理できます。
NetworkReachabilityManager.Swift
これが表示されます
///ネットワークが現在到達可能かどうか。 public var isReachable:Bool {return isReachableOnWWAN || isReachableOnEthernetOrWiFi}
だから私はこれをAPIhandlerClassに書いた
import AlamofireNetworkActivityIndicator
private let manager = NetworkReachabilityManager(Host: "www.Apple.com")
func isNetworkReachable() -> Bool {
return manager?.isReachable ?? false
}
これにより、ネットワークの状態がわかります。
func isConnectedToNetwork()-> Bool {
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
}
}
//Commented code only work upto iOS Swift 2.3
// let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
//
// SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
// }
var flags = SCNetworkReachabilityFlags()
if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
return false
}
let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
return (isReachable && !needsConnection)
}
// Call api method
func callApi(){
if isConnectedToNetwork() { // Network Connection status
// Call your request here
}else{
//"Your Internet connection is not active at this time."
}
}
RequestAdapter
クラスのalamofireを使用し、インターネット接続がないときにエラーをスローするclass RequestInterceptor : RequestAdapter{
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
let reachable = NetworkReachabilityManager()?.isReachable ?? false
if !reachable{
throw NSError.NoInternet
}
var nUrlRequest = urlRequest
// modify request if needed
return nUrlRequest
}
}
extension NSError {
static func createWithLocalizedDesription(withCode code:Int = 204,localizedDescription:String) -> NSError{
return NSError(domain: "<your bundle id>", code:code, userInfo: [NSLocalizedDescriptionKey : localizedDescription])
}
static var NoInternet : NSError {
return createWithLocalizedDesription(withCode: -1009,localizedDescription:"Please check your internet connection")
}
}
今すぐアダプターをAlamofire Session Manager
に設定
let sessionManager = Alamofire.SessionManager(configuration: configuration)
sessionManager.adapter = RequestInterceptor()
NowAlamofire Requestを作成するたびに、DataResponseでエラーをキャッチします。このメカニズムは、すべてのリクエストに共通に機能します
Alamofire.upload resultが成功を返す場合、画像のアップロード中にインターネットの可用性を確認する方法は次のとおりです。
Alamofire.upload(multipartFormData: { multipartFormData in
for (key,value) in parameters {
multipartFormData.append((value).data(using: .utf8)!, withName: key)
}
multipartFormData.append(self.imageData!, withName: "image" ,fileName: "image.jpg" , mimeType: "image/jpeg")
}, to:url)
{ (result) in
switch result{
case .success(let upload, _, _):
upload.uploadProgress(closure: { (progress) in
print("Upload Progress: \(progress.fractionCompleted)")
})
upload.responseJSON { response in
if let statusCode = response.response?.statusCode{
if(statusCode == 201){
//internet available
}
}else{
//internet not available
}
}
case .failure(let encodingError):
print(encodingError)
}
}
一般に、実際の通話からインターネットのオフライン情報を取得できる場合、到達可能性よりも優れています。インターネットがダウンしているため、実際のAPI呼び出しが失敗したことを確認できます。 APIを呼び出す前に到達可能性をテストして失敗した場合、テストが完了したときにインターネットがオフラインであった(またはAppleがダウンしていた)ことだけがわかりますあなたがmakeを呼び出すと、インターネットはオフラインになります。到達可能性がクロージャーで値を返す前、または保存しているグローバルを更新する前に、任意の数のスレッドをスケジュールしました。
そして、到達可能性には歴史的に独自のコードにバグがありました。
これは、alamofireのNetworkReachabilityManagerを使用してUIを変更し、それを聞いて、すべてのUIコンポーネントを更新するべきではないということではありません。
ただし、APIを呼び出す理由がある場合、そのAPIレイヤーでは、到達可能性のテストは冗長であるか、または微妙なバグを引き起こす可能性があります。