Cuando intento buscar una conexión a Internet en mi iPhone, recibo muchos errores. ¿Alguien puede ayudarme a arreglar esto?
El código:
import Foundation
import SystemConfiguration
public class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
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) ? true : false
}
}
Los errores con el código:
Si no se puede leer, el error 1 dice:
'Int' no es convertible a 'SCNetworkReachabilityFlags'
Error 2 y 3:
No se pudo encontrar una sobrecarga para 'init' que acepte los argumentos proporcionados
ios
swift
xcode
reachability
b3rge
fuente
fuente
Respuestas:
Para resolver el problema 4G mencionado en los comentarios, utilicé la implementación de accesibilidad @AshleyMills como referencia y reescribí Reachability para Swift 3.1:
actualizado: Xcode 10.1 • Swift 4 o posterior
Archivo Reachability.swift
Uso
Inicialícelo en su método AppDelegate.swift didFinishLaunchingWithOptions y maneje cualquier error que pueda ocurrir:
Y una muestra de controlador de vista:
Proyecto de muestra
fuente
if SCNetworkReachabilityGetFlags(…)
Debe eliminar `== 0` del xCode ya que devuelve un Bool en su última versión.Para Swift 3, Swift 4 (trabajando con celular y Wi-Fi):
Uso:
fuente
Cree un nuevo archivo Swift dentro de su proyecto, asígnele un nombre
Reachability.swift
. Corta y pega el siguiente código para crear tu clase.Puede verificar la conexión a Internet en cualquier parte de su proyecto utilizando este código:
Si el usuario no está conectado a Internet, puede mostrarle un cuadro de diálogo de alerta para notificarlo.
Explicación:
Estamos creando una clase pública reutilizable y un método que se puede utilizar en cualquier parte del proyecto para verificar la conectividad a Internet. Requerimos agregar marcos de Foundation y System Configuration.
En el alcance de la clase pública, el método
isConnectedToNetwork() -> Bool { }
devolverá un valor bool sobre la conectividad a Internet. Usamos un bucle if para realizar las acciones requeridas en el caso. Espero que esto sea suficiente. ¡Salud!fuente
Si alguien ya está usando Alamofire, entonces:
Uso:
fuente
He comprobado la implementación de la clase de accesibilidad de Ashley Mill sin Cocoa Pods / Dependancy Manager. La idea es hacer que la dependencia de accesibilidad sea gratuita en el proyecto.
Xcode 7.2 - Swift 2.1
1) https://github.com/ashleymills/Reachability.swift . Descargar agregue la clase de accesibilidad al proyecto.
Nota: Al agregar, asegúrese de que esté marcado 'copiar elementos si es necesario'.
2) Crea una clase AppManager.swift. Esta clase atenderá como clase de Modelo Público donde se agregarán métodos y datos públicos y se pueden utilizar en cualquier VC.
3) Hacer una clase de delegado. Utilizo el método delegado para notificar el estado de conectividad.
4) Hacer la clase padre de UIViewController (método de herencia). La clase principal tiene métodos accesibles para todos los VC secundarios.
5) Inicie el monitoreo de conectividad a Internet en tiempo real en AppDelegate.
6) He agregado una AppReference de Swift File Name para almacenar valores de enumeración constantes.
7) En ViewController (por ejemplo, desea llamar a una API solo si la red está disponible)
La muestra se puede descargar en https://github.com/alvinreuben/Reachability-Sample
Actualizado a Swift 3.1- https://github.com/alvinvgeorge/Reachability-UpgradedToSwift3
fuente
Apple ha introducido Network Framework en iOS12.
fuente
pathUpdateHandler
presentará una referencia fuerte conself
, agregar[weak self]
para resolverlo :)Use esto para Swift-5 +
Uso:
O simplemente use esto
framework
para másUtilities
: Enlacefuente
Acabo de descubrir esto por mí mismo.
Xcode: 7.3.1, iOS 9.3.3
Usando ashleymills / Reachability.swift como Reachability.swift en mi proyecto, creé la siguiente función:
Simplemente llame
hasConnectivity()
donde sea que necesite para verificar una conexión. Esto funciona tanto para Wifi como para Celular.Agregando Ashleymills's Reachability.swift para que las personas no tengan que moverse entre sitios:
fuente
let reachability: Reachability = try Reachability.reachabilityForInternetConnection()
alet reachability: Reachability = try Reachability()!
Aunque no responde directamente a su pregunta, me gustaría mencionar que Apple recientemente tuvo esta charla:
https://developer.apple.com/videos/play/wwdc2018/714/
Alrededor de las 09:55 él habla sobre hacer estas cosas que usted está preguntando:
Sin embargo, esto tiene algunas trampas:
Los siguientes puntos son algunas de las mejores prácticas según Apple:
waitsForConnectivity
en verdadero ( https://developer.apple.com/documentation/foundation/urlsessionconfiguration/2908812-waitsforconnectivity )taskIsWaitingForConnectivity
( https://developer.apple.com/documentation/foundation/urlsessiontaskdelegate/2908819-urlsession ). Esta es la forma recomendada de Apple para verificar la conectividad, como se menciona en el video a las 33:25.Según la charla, no debería haber ninguna razón para verificar previamente si tiene conexión a Internet o no, ya que puede no ser precisa en el momento en que envía su solicitud al servidor .
fuente
He creado mi propia solución con NSTimer y Alamofire:
El NSTimer se usa como un tiempo de espera, y se usó debido a resultados poco confiables usando el tiempo de espera de Alamofire. La solicitud debe hacerse a una URL en la que confíe para que sea confiable, como su propio servidor o el servidor que aloja los servicios de los que depende.
Cuando expira el temporizador, la solicitud se cancela y los resultados se devuelven utilizando un controlador de finalización.
Uso:
fuente
requestTimeout()
se llamaría después de que se alcanzara el tiempo de espera especificadoSi está usando Alamofire, puede hacer algo como esto:
fuente
Swift 5
En cualquier método, use la siguiente condición
fuente
aquí mi solución para swift 2.3 con lib ( Reachability.swift )
Entra en tu
Podfile
y agrega:Luego en tu
terminal
:Luego cree un nuevo archivo
ReachabilityManager
y agregue el siguiente código:Cómo usarlo:
ingrese a su
AppDelegate.swift
y agregue el siguiente código:Luego, cuando desee verificar si el dispositivo está conectado a Internet, haga lo siguiente:
fuente
Si bien es posible que no determine directamente si el teléfono está conectado a una red, la solución más simple (¿más limpia?) Sería 'hacer ping' a Google u otro servidor (lo cual no es posible a menos que el teléfono esté conectado a una red) ):
Si le preocupa que el servidor pueda estar inactivo o pueda bloquear su IP, siempre puede hacer ping a varios servidores de manera similar y devolver si alguno de ellos es accesible. O haga que alguien configure un servidor dedicado solo para este propósito.
fuente
Con la ayuda del siguiente código, puede verificar la conexión a Internet tanto para la red celular como para wifi. idioma - Swift 3.0
fuente
Para Swift 3, no podría usar solo el alcance de las soluciones RAJAMOHAN-S, ya que devuelve "verdadero" si hay WiFi pero no Internet. Por lo tanto, implementé una segunda validación a través de la clase URLSession y el controlador de finalización.
Aquí está toda la clase.
Y a esto le llamas así, por ejemplo:
fuente
Esta es mi versión Esencialmente no trae nada nuevo. Lo vinculé a UIDevice.
fuente
Ahora llámalo
fuente