Как проверить подключение к Интернету в 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 тест на доступность избыточен или, возможно, вызовет некоторые тонкие ошибки.