switch stepper ios swift reachability

ios - stepper - Usando el alcance de Apple para verificar el alcance del servidor remoto en Swift



switch ios (3)

Estoy desarrollando una aplicación iOS escrita en Swift que se comunica con un servidor HTTP en la red local, y estoy usando la clase de Alcance de Apple para determinar si la máquina remota que ejecuta el servidor HTTP está en línea o no. Aquí está el código:

... let RemoteHost: String = "192.168.178.130" var RemoteReachability: Reachability! = nil var RemoteIsReachable: Bool = false init() { super.init() self.RemoteReachability = Reachability(hostName: self.RemoteHost) NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityChanged:", name: kReachabilityChangedNotification, object: self.RemoteReachability) self.RemoteReachability.startNotifier() self.RemoteIsReachable = (self.RemoteReachability.currentReachabilityStatus().value == ReachableViaWiFi.value) } func reachabilityChanged(notification: NSNotification) { let ReachabilityInst: Reachability = notification.object as Reachability self.RemoteIsReachable = (ReachabilityInst.currentReachabilityStatus().value == ReachableViaWiFi.value) }

El problema es que no importa si la máquina remota está en línea o fuera de línea,

(ReachabilityInst.currentReachabilityStatus().value == ReachableViaWiFi.value)

Siempre es cierto, siempre y cuando esté conectado a una red Wifi. Sin embargo, cuando desactivo la función Wifi, el resultado es falso en lugar de verdadero. ¿Estoy haciendo algo mal aquí, o la clase de Alcance simplemente no es compatible con Swift / xCode 6 Beta todavía? También he intentado esto:

(ReachabilityInst.currentReachabilityStatus() == ReachableViaWiFi)

Pero eso hace que xCode me diga "No se pudo encontrar una sobrecarga para ''=='' que acepta los argumentos proporcionados", aunque ambos parecen ser del tipo ''NetworkStatus''.

Gracias por adelantado.


En veloz,

Acerca de lo que entendí de la utilidad de accesibilidad propuesta por Apple ( https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html ) o tonymillion ( https://github.com/tonymillion/Reachability ) que son básicamente lo mismo es:

tienes 3 posibles pruebas:

  • local (puede acceder a la red local pero no a internet)
  • externo (puede acceder a internet por dirección ip)
  • dns (puede acceder a internet y alcanzar un nombre de host)

Puedes probarlos respectivamente iniciando un notificador con esto:

let wifiReachability = Reachability. reachabilityForLocalWiFi() wifiReachability.startNotifier() let internetReachability = Reachability.reachabilityForInternetConnection() hostReachability.startNotifier() let hostReachability = Reachability(hostName:"www.apple.com") hostReachability.startNotifier()

Lo que activará una notificación que puede capturar con este método: NSNotificationCenter.defaultCenter (). AddObserver ()

Así que para usarlos puedes hacer algo así:

cree una función en su appDelegate que instanciará el notificador:

func startReachabilityTest() { // Allocate a reachability object to test internet access by hostname let reach = Reachability(hostName: "www.apple.com") // Tell the reachability that we DON''T want to be reachable on 3G/EDGE/CDMA //reach.reachableOnWWAN = false reach.startNotifier() }

Luego puede llamarlo en el comando didFinishLaunchingWithOptions de su aplicaciónDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { self.startReachabilityTest(); }

Si desea capturar el evento en cualquier viewController, simplemente agregue esta línea a viewDidLoad:

override func viewDidLoad() { // Here we set up a NSNotification observer. The Reachability that caused the notification // is passed in the object parameter NSNotificationCenter.defaultCenter().addObserver( self, selector: "reachabilityChanged:", name: kReachabilityChangedNotification, object: nil) }

y agrega este método de método para reaccionar al evento:

func reachabilityChanged(notice: NSNotification) { println("reachability changed") let reach = notice.object as? Reachability if let remoteHostStatus = reach?.currentReachabilityStatus() { if remoteHostStatus == NetworkStatus.NotReachable { println("not reachable") } else { println("reachable") } } }

También puede capturar el evento dentro de su appDelegate agregando NSNotificationCenter.defaultCenter (). AddObserver () dentro de didFinishLaunchingWithOptions y luego agregue reachabilityChanged (aviso: NSNotification) en él.

Ah, también tenga en cuenta que puede agregar fácilmente la clase de accesibilidad a su proyecto con cocoapods agregando esta línea:

pod ''Reachability'', ''~> 3.2''

A su archivo de pod y luego de una instalación de pod en la línea de comandos, simplemente agregue esta línea al archivo de encabezado xxx-Bridging-Header.h (donde xxx es el nombre de su aplicación):

#import <Reachability/Reachability.h>

Si no tiene un encabezado puente en su proyecto, puede seguir este tutorial: http://www.learnswiftonline.com/getting-started/adding-swift-bridging-header/

No es necesario agregar systemConfiguration.framework, que ya ha sido agregado por las dependencias de pod.

Nota: la accesibilidad no funciona bien en el simulador

¡espero que esto ayude!


La clase de Alcance que estás utilizando se basa en la clase SCNetworkReachability de Apple, que no hace exactamente lo que esperas. De la documentación de SCNetworkReachability :

Un host remoto se considera accesible cuando un paquete de datos, enviado por una aplicación a la pila de la red, puede abandonar el dispositivo local. La accesibilidad no garantiza que el host reciba realmente el paquete de datos.

Por lo tanto, no está diseñado para probar si el host remoto está en línea o no, solo si (1) la configuración de red actual permitirá un intento de alcanzarlo y (2) mediante qué métodos. Una vez que haya determinado que la red está activa, deberá hacer un intento de conexión para ver si el host remoto está en funcionamiento.

Nota: Esta prueba:

(ReachabilityInst.currentReachabilityStatus().value == ReachableViaWiFi.value)

es la forma correcta de verificar, por alguna razón, NetworkStatus es una de las pocas enumeraciones de Apple creadas sin la macro NS_ENUM .


Si está buscando una implementación Swift de la clase de Alcance de Apple, puede echar un vistazo a esto:

http://github.com/ashleymills/Reachability.swift

Es una caída en clase, usando notificaciones y cierres.

Funciona con iOS y OS X y tiene soporte para Cocoapod / Carthage.

¡Buena suerte!