web-dev-qa-db-ja.com

alamofireでインターネット接続を確認する方法は?

私はサーバーで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))
    }
21
Dhiraj Kumar

For Swift 3.1 and Alamofire 4.4、私はSwift Connectivityというクラス。必要に応じて、NetworkReachabilityManagerおよびAlamofireconfigureクラスから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..
 }
74

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")
}
20
MAhipal Singh

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"
        }
    }

ここでは、インターネットの状態に変化があるたびにリスナーが呼び出されます。好きなように処理できます。

13
Parth Adroja

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
}

これにより、ネットワークの状態がわかります。

2
Umair Afzal
  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."
        }
    }
1
MAhipal Singh

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でエラーをキャッチします。このメカニズムは、すべてのリクエストに共通に機能します

0

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)

                }

            }
0
Nupur Sharma

一般に、実際の通話からインターネットのオフライン情報を取得できる場合、到達可能性よりも優れています。インターネットがダウンしているため、実際のAPI呼び出しが失敗したことを確認できます。 APIを呼び出す前に到達可能性をテストして失敗した場合、テストが完了したときにインターネットがオフラインであった(またはAppleがダウンしていた)ことだけがわかりますあなたがmakeを呼び出すと、インターネットはオフラインになります。到達可能性がクロージャーで値を返す前、または保存しているグローバルを更新する前に、任意の数のスレッドをスケジュールしました。

そして、到達可能性には歴史的に独自のコードにバグがありました。

これは、alamofireのNetworkReachabilityManagerを使用してUIを変更し、それを聞いて、すべてのUIコンポーネントを更新するべきではないということではありません。

ただし、APIを呼び出す理由がある場合、そのAPIレイヤーでは、到達可能性のテストは冗長であるか、または微妙なバグを引き起こす可能性があります。

0
Eoin Norris