redes pero navega internet incorrecta detecta contraseƱa conecta compartir check ios swift network-connection

ios - internet - mi iphone se conecta a wifi pero no navega



Compruebe la disponibilidad de conexiĆ³n a Internet en Swift (8)

Como mencioné en los comentarios, aunque es posible usar las bibliotecas Objective-C en Swift, quería una solución Swift más pura. La clase Apple Alcachability existente y otras bibliotecas de terceros parecían ser demasiado complicadas para que yo pudiera traducirlas a Swift. Busqué en Google un poco más y me encontré con este article que muestra un método simple para verificar la disponibilidad de la red. Me propuse traducir esto a Swift. Llegué a muchos snags pero gracias a Martin R de StackOverflow, logré resolverlos y finalmente obtuve una solución viable en Swift. Aquí está el código.

import Foundation import SystemConfiguration public class Reachability { class func isConnectedToNetwork() -> Bool { var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0)) zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress)) zeroAddress.sin_family = sa_family_t(AF_INET) let defaultRouteReachability = withUnsafePointer(&zeroAddress) { SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue() } var flags: SCNetworkReachabilityFlags = 0 if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 { return false } let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0 let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0 return isReachable && !needsConnection } }

Para Swift> 3.0

public class Reachability { public func isConnectedToNetwork() -> Bool { var zeroAddress = sockaddr_in() zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size) zeroAddress.sin_family = sa_family_t(AF_INET) guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { SCNetworkReachabilityCreateWithAddress(nil, $0) } }) else { return false } var flags: SCNetworkReachabilityFlags = [] if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) { return false } if flags.isEmpty { return false } let isReachable = flags.contains(.reachable) let needsConnection = flags.contains(.connectionRequired) return (isReachable && !needsConnection) } }

Esto funciona tanto para conexiones 3G como WiFi. También lo he subido a mi GitHub con un ejemplo de trabajo.

¿Hay alguna manera de verificar si la conexión a internet está disponible usando Swift?

Sé que hay muchas bibliotecas de terceros para hacer esto, pero todas están escritas en Objective-C. Estoy buscando una alternativa Swift.


Como sendSynchronousRequest está en desuso, lo intenté pero se llamó al ''estado de devolución'' antes de que la respuesta finalizara.

Esta respuesta funciona bien, compruebe si hay conexión a Internet con Swift

Esto es lo que intenté de todos modos:

import Foundation public class Reachability { class func isConnectedToNetwork()->Bool{ var Status:Bool = false let url = NSURL(string: "http://google.com/") let request = NSMutableURLRequest(URL: url!) request.HTTPMethod = "HEAD" request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData request.timeoutInterval = 10.0 let session = NSURLSession.sharedSession() session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in print("data /(data)") print("response /(response)") print("error /(error)") if let httpResponse = response as? NSHTTPURLResponse { print("httpResponse.statusCode /(httpResponse.statusCode)") if httpResponse.statusCode == 200 { Status = true } } }).resume() return Status } }


También puede usar la respuesta a continuación.

func checkInternet(flag:Bool, completionHandler:(internet:Bool) -> Void) { UIApplication.sharedApplication().networkActivityIndicatorVisible = true let url = NSURL(string: "http://www.google.com/") let request = NSMutableURLRequest(URL: url!) request.HTTPMethod = "HEAD" request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData request.timeoutInterval = 10.0 NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in UIApplication.sharedApplication().networkActivityIndicatorVisible = false let rsp = response as NSHTTPURLResponse? completionHandler(internet:rsp?.statusCode == 200) }) } func yourMethod() { self.checkInternet(false, completionHandler: {(internet:Bool) -> Void in if (internet) { // "Internet" mean Google } else { // No "Internet" no Google } }) }


Te doy mejor manera ...

Debes crear una clase con este código

import Foundation public class Reachability { class func isConnectedToNetwork()->Bool{ var Status:Bool = false let url = NSURL(string: "http://google.com/") let request = NSMutableURLRequest(URL: url!) request.HTTPMethod = "HEAD" request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData request.timeoutInterval = 10.0 var response: NSURLResponse? var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: nil) as NSData? if let httpResponse = response as? NSHTTPURLResponse { if httpResponse.statusCode == 200 { Status = true } } return Status } }

Y luego puedes verificar la conexión a internet en cualquier parte de tu proyecto usando este código:

if Reachability.isConnectedToNetwork() == true { println("Internet connection OK") } else { println("Internet connection FAILED") }

¡Muy fácil!

* ¡De esta manera se basa en la respuesta de Vikram Pote!


Para Swift 3.1 (iOS 10.1)

Si desea hacer la distinción entre el tipo de red (es decir, Wi-Fi o WWAN):

Puedes usar:

func checkWiFi() -> Bool { let networkStatus = Reachability().connectionStatus() switch networkStatus { case .Unknown, .Offline: return false case .Online(.WWAN): print("Connected via WWAN") return true case .Online(.WiFi): print("Connected via WiFi") return true } }

Aquí está toda la Clase de Accesibilidad que distingue entre tipos de red:

import Foundation import SystemConfiguration import UIKit import SystemConfiguration.CaptiveNetwork public let ReachabilityStatusChangedNotification = "ReachabilityStatusChangedNotification" public enum ReachabilityType: CustomStringConvertible { case WWAN case WiFi public var description: String { switch self { case .WWAN: return "WWAN" case .WiFi: return "WiFi" } } } public enum ReachabilityStatus: CustomStringConvertible { case Offline case Online(ReachabilityType) case Unknown public var description: String { switch self { case .Offline: return "Offline" case .Online(let type): return "Online (/(type))" case .Unknown: return "Unknown" } } } public class Reachability { func connectionStatus() -> ReachabilityStatus { var zeroAddress = sockaddr_in() zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress)) zeroAddress.sin_family = sa_family_t(AF_INET) guard let defaultRouteReachability = (withUnsafePointer(to: &zeroAddress) { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress) } }) else { return .Unknown } var flags : SCNetworkReachabilityFlags = [] if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) { return .Unknown } return ReachabilityStatus(reachabilityFlags: flags) } func monitorReachabilityChanges() { let host = "google.com" var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil) let reachability = SCNetworkReachabilityCreateWithName(nil, host)! SCNetworkReachabilitySetCallback(reachability, { (_, flags, _) in let status = ReachabilityStatus(reachabilityFlags: flags) NotificationCenter.default.post(name: NSNotification.Name(rawValue: ReachabilityStatusChangedNotification), object: nil, userInfo: ["Status": status.description])}, &context) SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), CFRunLoopMode.commonModes.rawValue) } } extension ReachabilityStatus { public init(reachabilityFlags flags: SCNetworkReachabilityFlags) { let connectionRequired = flags.contains(.connectionRequired) let isReachable = flags.contains(.reachable) let isWWAN = flags.contains(.isWWAN) if !connectionRequired && isReachable { if isWWAN { self = .Online(.WWAN) } else { self = .Online(.WiFi) } } else { self = .Offline } } }


SWIFT 3: comprueba si hay conexión wifi e Internet :

import Foundation import SystemConfiguration public class Reachability { public func isConnectedToNetwork() -> Bool { var zeroAddress = sockaddr_in() zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size) zeroAddress.sin_family = sa_family_t(AF_INET) guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { SCNetworkReachabilityCreateWithAddress(nil, $0) } }) else { return false } var flags: SCNetworkReachabilityFlags = [] if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) { return false } let isReachable = flags.contains(.reachable) let needsConnection = flags.contains(.connectionRequired) return (isReachable && !needsConnection) } }

USO:

if Reachability.isConnectedToNetwork() == true { print("Connected to the internet") // Do something } else { print("No internet connection") // Do something }


SWIFT 3: compruebe la conexión 3G y Wi-Fi

DispatchQueue.main.async { let url = URL(string: "https://www.google.com")! let request = URLRequest(url: url) let task = URLSession.shared.dataTask(with: request) {data, response, error in if error != nil { // do something here... print("Internet Connection not Available!") } else if let httpResponse = response as? HTTPURLResponse { if httpResponse.statusCode == 200 { // do something here... print("Internet Connection OK") } print("statusCode: /(httpResponse.statusCode)") } } task.resume() }


if isInternetAvailable() { print("if called Internet Connectivity success /(isInternetAvailable())"); }else{ print("else called Internet Connectivity success /(isInternetAvailable())"); } func isInternetAvailable() -> 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) } } var flags = SCNetworkReachabilityFlags() if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) { return false } let isReachable = flags.contains(.reachable) let needsConnection = flags.contains(.connectionRequired) // print(isReachable && !needsConnection) return (isReachable && !needsConnection) }

En Swift 4 trabajando