Как проверить подключение к Интернету в 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))
    }

Ответы

Ответ 1

Для быстрых 3.1 и Alamofire 4.4 я создал быстрый класс под названием Connectivity. Используйте NetworkReachabilityManager класс от Alamofire и configure на isConnectedToInternet() метод в соответствии с вашими потребностями.

import Foundation
import Alamofire

class Connectivity {
    class func isConnectedToInternet() ->Bool {
        return NetworkReachabilityManager()!.isReachable
    }
}

Применение:

if Connectivity.isConnectedToInternet() {
        print("Yes! internet is available.")
        // do some tasks..
 }

РЕДАКТИРОВАНИЕ: поскольку быстрое поощрение вычисленных свойств, вы можете изменить указанную выше функцию следующим образом:

import Foundation
import Alamofire
class Connectivity {
    class var isConnectedToInternet:Bool {
        return NetworkReachabilityManager()!.isReachable
    }
}

и используйте его так:

if Connectivity.isConnectedToInternet {
        print("Yes! internet is available.")
        // do some tasks..
 }

Ответ 2

Swift 2.3

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.0

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

Ответ 3

Для 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"
        }
    }

Здесь слушатель будет вызываться каждый раз, когда происходят изменения в состоянии Интернета. Вы можете справиться с этим, как хотите.

Ответ 4

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

Ответ 5

Если вы перейдете в NetworkReachabilityManager.swift вы увидите это

///Доступна ли сеть в настоящий момент. public var isReachable: Bool {return isReachableOnWWAN || isReachableOnEthernetOrWiFi } isReachableOnEthernetOrWiFi}

Поэтому я написал это в своем APIhandlerClass

import AlamofireNetworkActivityIndicator

private let manager = NetworkReachabilityManager(host: "www.apple.com")

func isNetworkReachable() -> Bool {
    return manager?.isReachable ?? false
}

Таким образом, это говорит мне о статусе сети.

Ответ 6

Если результат Alamofire.upload возвращает успех, то ниже приведен способ проверки доступности Интернета при загрузке изображения:

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)

                }

            }

Ответ 7

Использование класса 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()

Теперь каждый раз, когда вы создаете запрос Alamofire, уловите ошибку в DataResponse. Этот механизм будет действовать общим для всех запросов

Ответ 8

В общем, если вы можете получить интернет-оффлайн-информацию от фактического вызова, это лучше, чем достижимость. Вы можете быть уверены, что фактический вызов API не удался, потому что Интернет не работает. Если вы тестируете доступность до того, как вы вызовете API, и это не сработает, тогда все, что вы знаете, это то, что когда тест был выполнен, интернет был отключен (или Apple не работает), вы не знаете, что когда вы совершаете звонок, интернет будет не в сети. Вы можете подумать, что это вопрос миллисекунд после того, как вызов достижимости вернется, или вы получили сохраненное значение, но на самом деле оно не детерминировано. OS могла планировать некоторое количество потоков, прежде чем достижимость вернет свои значения при ее закрытии или обновит все глобальное хранилище.

И у достижимости исторически были ошибки в собственном коде.

Это не означает, что вы не должны использовать alamofire NetworkReachabilityManager для изменения вашего пользовательского интерфейса, прослушивания и обновления всех компонентов пользовательского интерфейса.

Но если у вас есть основания для вызова API, на этом уровне API тест на доступность избыточен или, возможно, вызовет некоторые тонкие ошибки.