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 HTTPUrlConnectionfalla instantáneamente si no hay conexión disponible. Esto parece un comportamiento completamente sano, y me sorprendió descubrir que NSURLConnectionen iOS no lo emulaba.
Entiendo que Apple (y otros que lo han extendido) brindan una Reachabilityclase 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
AFNetworkReachabilityManagerluz!AFNetworkReachabilityManager.reachableNO realiza ningún tipo de verificación sincrónica. Devuelve un lógico o dereachableViaWWANyreachableViaWifi.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.comes un gran sitio web ... la mejor opción seráwww.google.comwww.appleiphonecell.comsupuestamente 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.hyReachability.marchiva a tu proyecto,Ahora será necesario crear un
Bridging-Header.harchivo si no existe ninguno para su proyecto,Dentro de su
Bridging-Header.harchivo 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.swiften 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.reachablea verdadero / falso correctamente, porque comenzamos a escuchar laNetworkReachabilityManagerinicialización de singleton.También para monitorear la accesibilidad, debe proporcionar un host, actualmente estoy usando no
google.comdude en cambiar a cualquier otro host o uno de los suyos si es necesario.fuente