it-roy-ru.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))
    }
18
TechGuy

Для Swift 3.1 и Alamofire 4.4я создал класс Swift с именем 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..
 }

EDIT: Поскольку Swift поощряет вычисляемые свойства, вы можете изменить вышеуказанную функцию следующим образом:

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

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

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

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

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

9
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()

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

0
Aromal Sasidharan

Если 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 не работал), вы не знаете, когда вы делаете вызов Интернет будет в автономном режиме. Вы можете подумать, что это всего лишь миллисекунды после возврата вызова достижимости, или вы извлекли сохраненное значение, но это на самом деле недетерминировано. Операционная система могла запланировать произвольное количество потоков, прежде чем достижимость вернет свои значения при закрытии или обновит любой глобальный объект, который вы храните. 

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

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

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

0
Eoin Norris