Sé que esta pregunta parecerá ser un engaño de muchos otros, sin embargo, no creo que el caso simple esté bien explicado aquí. Procedente de un fondo de Android y BlackBerry, la realización de solicitudes HTTPUrlConnection
falla instantáneamente si no hay conexión disponible. Esto parece un comportamiento completamente sano, y me sorprendió descubrir que NSURLConnection
en iOS no lo emulaba.
Entiendo que Apple (y otros que lo han extendido) brindan una Reachability
clase para ayudar a determinar el estado de la red. Estaba feliz de ver esto por primera vez y esperaba ver algo así bool isNetworkAvailable()
, pero para mi sorpresa, encontré un sistema complejo que requería registros de notificación y devoluciones de llamadas, y un montón de detalles aparentemente innecesarios. Debe haber una mejor manera.
Mi aplicación ya maneja correctamente las fallas de conexión, incluida la falta de conectividad. El usuario recibe una notificación de la falla y la aplicación continúa.
Por lo tanto, mis requisitos son simples: función síncrona única que puedo llamar antes de todas las solicitudes HTTP para determinar si debo molestarme en enviar la solicitud o no. Idealmente, no requiere configuración y solo devuelve un valor booleano.
¿Realmente esto no es posible en iOS?
fuente
Respuestas:
Investigué un poco más y estoy actualizando mi respuesta con una solución más actual. No estoy seguro si ya lo ha mirado, pero hay un buen código de muestra proporcionado por Apple.
Descargue el código de muestra aquí
Incluya los archivos Reachability.h y Reachability.m en su proyecto. Eche un vistazo a ReachabilityAppDelegate.m para ver un ejemplo sobre cómo determinar la accesibilidad del host, la accesibilidad por WiFi, WWAN, etc. Para una simple verificación de la accesibilidad de la red, puede hacer algo como esto
@ BenjaminPiette's: No olvides agregar SystemConfiguration.framework a tu proyecto.
fuente
Como este hilo es el principal resultado de Google para este tipo de preguntas, pensé que proporcionaría la solución que funcionó para mí. Ya estaba usando AFNetworking , pero la búsqueda no reveló cómo realizar esta tarea con AFNetworking hasta la mitad de mi proyecto.
Lo que quieres es el AFNetworkingReachabilityManager .
También puede usar lo siguiente para probar la accesibilidad sincrónicamente (una vez que se ha iniciado la supervisión):
fuente
AFNetworkReachabilityManager
luz!AFNetworkReachabilityManager.reachable
NO realiza ningún tipo de verificación sincrónica. Devuelve un lógico o dereachableViaWWAN
yreachableViaWifi
.Perdón por responder demasiado tarde, pero espero que esta respuesta pueda ayudar a alguien en el futuro.
El siguiente es un pequeño fragmento de código C nativo que puede verificar la conectividad a Internet sin ninguna clase adicional.
Agregue los siguientes encabezados:
Código:
Swift 3
fuente
Actualmente utilizo este método síncrono simple que no requiere archivos adicionales en sus proyectos o delegados.
Importar:
Crea este método:
Entonces, si has puesto esto en un
MyNetworkClass
:Si está probando en el simulador, encienda y apague el wifi de su Mac, ya que parece que el simulador ignorará la configuración del teléfono.
Actualizar:
Al final, utilicé un hilo / devolución de llamada asincrónica para evitar bloquear el hilo principal; y volver a probar regularmente para poder usar un resultado en caché, aunque debe evitar mantener las conexiones de datos abiertas innecesariamente
Como @thunk describió, hay mejores URL para usar, que Apple usa. http://cadinc.com/blog/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network
fuente
www.apple.com
es un gran sitio web ... la mejor opción seráwww.google.com
www.appleiphonecell.com
supuestamente está disponible estrictamente para este propósito y aparentemente no está bloqueada en China.Es posible y es realmente simple si lo mira al finalizar la implementación, lo cual es nuevamente, muy simple, ya que los únicos elementos que necesita son dos variables booleanas: acceso a internet y acceso al host (a menudo necesita más de uno de estos ) Una vez que ensambla su clase auxiliar que puede determinar el estado de las conexiones, realmente ya no le importa la implementación necesaria para conocer estos procedimientos.
Ejemplo:
Y el archivo .m:
fuente
Alguien ha resuelto esto de una manera simple y reutilizable antes.
DDGReachability
.EDITAR: Or
tonymillion/Reachability
.fuente
Extraje el código y lo puse en un solo método, espero que ayude a otros.
...
fuente
Estoy escribiendo la versión rápida de la respuesta aceptada aquí , en caso de que alguien lo encuentre útil, el código se escribe rápido 2,
Puede descargar los archivos necesarios de SampleCode
Agrega
Reachability.h
yReachability.m
archiva a tu proyecto,Ahora será necesario crear un
Bridging-Header.h
archivo si no existe ninguno para su proyecto,Dentro de su
Bridging-Header.h
archivo agregue esta línea:Ahora para verificar la conexión a Internet
fuente
Creo que esto podría ayudar ...
fuente
También puede probar este si ya configuró AFNetworking en su proyecto.
fuente
Aquí hay una buena solución para verificar la conectividad usando Swift, sin usar Accesibilidad. Lo encontré en este blog .
Cree un nuevo archivo Swift en su proyecto llamado
Network.swift
(por ejemplo). Pegue este código dentro de ese archivo:Luego puede verificar la conectividad en cualquier parte de su proyecto utilizando:
fuente
EDITAR: Esto no funcionará para las URL de red (ver comentarios)
A partir de iOS 5, hay un nuevo método de instancia NSURL:
Apúntelo al sitio web que le interesa o apúntelo a apple.com; Creo que es la nueva llamada de una línea para ver si Internet está funcionando en su dispositivo.
fuente
Tampoco estaba satisfecho con las opciones de comprobación de Internet disponibles (¿Por qué no es una API nativa?!?!)
Mi propio problema fue con la pérdida de paquetes del 100%: cuando un dispositivo está conectado al enrutador, pero el enrutador no está conectado a Internet. La accesibilidad y otros colgarán por siglos. Creé una clase singleton de utilidad para lidiar con eso agregando un tiempo de espera asíncrono. Funciona bien en mi aplicación. Espero eso ayude. Aquí está el enlace en github:
https://github.com/fareast555/TFInternetChecker
fuente
Comprobación de la disponibilidad de conexión a Internet en (iOS) Xcode 8.2, Swift 3.0
fuente
Reemplazo para la accesibilidad de Apple reescrito en Swift con cierres , inspirado en tonymillion: https://github.com/ashleymills/Reachability.swift
Suelta el archivo
Reachability.swift
en tu proyecto. Alternativamente, use CocoaPods o Carthage : consulte la sección Instalación del archivo README del proyecto.Recibe notificaciones sobre conectividad de red:
y para detener las notificaciones
fuente
Alamofire
Si ya está usando Alamofire para toda la API RESTful, esto es lo que puede beneficiar de eso.
Puede agregar la siguiente clase a su aplicación y llamar
MNNetworkUtils.main.isConnected()
para obtener un booleano sobre si está conectado o no.Esta es una clase singleton. Cada vez, cuando el usuario conecta o desconecta la red, se anulará
self.reachable
a verdadero / falso correctamente, porque comenzamos a escuchar laNetworkReachabilityManager
inicialización de singleton.También para monitorear la accesibilidad, debe proporcionar un host, actualmente estoy usando no
google.com
dude en cambiar a cualquier otro host o uno de los suyos si es necesario.fuente