¿Cómo verificar una conexión a Internet activa en iOS o macOS?
Frecuentes
Visto 473,380 veces
1351
Me gustaría verificar si tengo una conexión a Internet en iOS usando el Toque de cacao bibliotecas o en macOS usando la Cacao bibliotecas
Se me ocurrió una forma de hacer esto usando un NSURL
. La forma en que lo hice parece un poco poco confiable (porque incluso Google podría algún día estar fuera de servicio y depender de un tercero parece malo), y aunque pude verificar para ver una respuesta de algunos otros sitios web si Google no respondió, parece un desperdicio y una sobrecarga innecesaria en mi aplicación.
- (BOOL) connectedToInternet
{
NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
return ( URLString != NULL ) ? YES : NO;
}
Es lo que he hecho mal (sin mencionar stringWithContentsOfURL
está en desuso en iOS 3.0 y macOS 10.4) y, de ser así, ¿cuál es la mejor manera de lograrlo?
30 Respuestas
1301
Importante:: Esta comprobación debe siempre realizarse de forma asincrónica. La mayoría de las respuestas a continuación son sincrónicas, así que tenga cuidado, de lo contrario, congelará su aplicación.
rápido
1) Instalar a través de CocoaPods o Carthage: https://github.com/ashleymills/Reachability.swift
2) Prueba de accesibilidad a través de cierres
let reachability = Reachability()!
reachability.whenReachable = { reachability in
if reachability.connection == .wifi {
print("Reachable via WiFi")
} else {
print("Reachable via Cellular")
}
}
reachability.whenUnreachable = { _ in
print("Not reachable")
}
do {
try reachability.startNotifier()
} catch {
print("Unable to start notifier")
}
Objective-C
1) Añadir SystemConfiguration
marco para el proyecto, pero no se preocupe por incluirlo en cualquier lugar
2) Agregue la versión de Tony Million de Reachability.h
y Reachability.m
al proyecto (que se encuentra aquí: https://github.com/tonymillion/Reachability)
3) Actualiza la sección de interfaz
#import "Reachability.h"
// Add this to the interface in the .m file of your view controller
@interface MyViewController ()
{
Reachability *internetReachableFoo;
}
@end
4) Luego implemente este método en el archivo .m de su controlador de vista al que puede llamar
// Checks if we have an internet connection or not
- (void)testInternetConnection
{
internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];
// Internet is reachable
internetReachableFoo.reachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Yayyy, we have the interwebs!");
});
};
// Internet is not reachable
internetReachableFoo.unreachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Someone broke the internet :(");
});
};
[internetReachableFoo startNotifier];
}
Nota Importante: EL Reachability
class es una de las clases más utilizadas en proyectos, por lo que es posible que tenga conflictos de nombres con otros proyectos. Si esto sucede, tendrá que cambiar el nombre de uno de los pares de Reachability.h
y Reachability.m
archivos a otra cosa para resolver el problema.
Nota: No importa el dominio que uses. Es solo probar una puerta de entrada a cualquier dominio.
Respondido 17 Abr '18, 13:04
@gonzobrains: el dominio que uses no importa. Solo está probando una puerta de entrada a cualquier dominio. - Me han robado
@KaanDedeoglu Es solo un ejemplo, use el dominio que desee. Simplemente busca una puerta de enlace a Internet, no que el dominio esté realmente disponible. - Me han robado
Oh, por cierto, necesitas agregar SystemConfiguration.framework
al proyecto también (para el método 1). - sabio
Utilice www.appleiphonecell.com en lugar de google.com; esta URL fue creada por Apple precisamente por esta razón. - sonriente
El uso de www.appleiphonecell.com es ahora (2018) una mala elección. Ahora redirige a Apple.com, que es un archivo html> 40kB. De vuelta a google.com, solo son 11 kB. Por cierto, google.com/m tiene el mismo tamaño, pero se informa que es más lento en 120 ms. - azulcieloMed
311
Me gusta mantener las cosas simples. La forma en que hago esto es:
//Class.h
#import "Reachability.h"
#import <SystemConfiguration/SystemConfiguration.h>
- (BOOL)connected;
//Class.m
- (BOOL)connected
{
Reachability *reachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [reachability currentReachabilityStatus];
return networkStatus != NotReachable;
}
Luego, uso esto cada vez que quiero ver si tengo una conexión:
if (![self connected]) {
// Not connected
} else {
// Connected. Do some Internet stuff
}
Este método no espera a que se modifiquen los estados de la red para poder hacer cosas. Solo prueba el estado cuando se lo pides.
Respondido el 09 de enero de 16 a las 12:01
Hola @msec, puedes probar la solución Andrew Zimmer en esta página, funciona bien con adsl desconectado (y wifi conectado) - william
Para aquellos que simplemente copian y pegan como lo hice con el código anterior. También agregue SystemConfiguration.framework manualmente o obtendrá un error de vinculación. - Iftijar Ali Ansari
Siempre es accesible si me conecto con WiFi. WiFi no significa que tenga conexión a Internet. Quiero verificar la conexión a Internet incluso si tiene conectividad WiFi. ¿Podrías ayudarme por favor? - wesley
146
Usando el código de accesibilidad de Apple, creé una función que verificará esto correctamente sin que tengas que incluir ninguna clase.
Incluya SystemConfiguration.framework en su proyecto.
Haz algunas importaciones:
#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>
Ahora solo llame a esta función:
/*
Connectivity testing code pulled from Apple's Reachability Example: https://developer.apple.com/library/content/samplecode/Reachability
*/
+(BOOL)hasConnectivity {
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
if (reachability != NULL) {
//NetworkStatus retVal = NotReachable;
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(reachability, &flags)) {
if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
{
// If target host is not reachable
return NO;
}
if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
{
// If target host is reachable and no connection is required
// then we'll assume (for now) that your on Wi-Fi
return YES;
}
if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
{
// ... and the connection is on-demand (or on-traffic) if the
// calling application is using the CFSocketStream or higher APIs.
if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
{
// ... and no [user] intervention is needed
return YES;
}
}
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
// ... but WWAN connections are OK if the calling application
// is using the CFNetwork (CFSocketStream?) APIs.
return YES;
}
}
}
return NO;
}
Y es iOS 5 probado para usted.
Respondido 02 Jul 17, 17:07
@JezenThomas Esto no realiza la verificación de Internet de forma asincrónica, por lo que es "mucho más delgado" ... Siempre debe hacerlo de forma asincrónica suscribiéndose a las notificaciones para no colgar la aplicación en este proceso. - Me han robado
Gracias, este trabajo, incluso si está utilizando adsl wifi y adsl no está conectado, es exactamente lo que necesito. - william
Esto pierde memoria: la estructura de 'legibilidad' (objeto, cosa) debe liberarse con CFRelease (). - russell mull
@RussellMull ... ¿alguna idea de cómo arreglar la fuga? - i_raqz
Es extraño que esta respuesta sea anterior a la mía (en una pregunta marcada como duplicada) por 2 años, es exactamente la misma que la mía, pero nunca la vi hasta hoy. - ArtOfWarfare
123
Esta solía ser la respuesta correcta, pero ahora está desactualizada, ya que debe suscribirse a las notificaciones para acceder a ellas. Este método comprueba sincrónicamente:
Puede utilizar la clase de accesibilidad de Apple. También le permitirá verificar si Wi-Fi está habilitado:
Reachability* reachability = [Reachability sharedReachability];
[reachability setHostName:@"www.example.com"]; // Set your host name here
NetworkStatus remoteHostStatus = [reachability remoteHostStatus];
if (remoteHostStatus == NotReachable) { }
else if (remoteHostStatus == ReachableViaWiFiNetwork) { }
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { }
La clase de accesibilidad no se incluye con el SDK, sino que forma parte de esta aplicación de muestra de Apple. Simplemente descárguelo y copie Reachability.h / m en su proyecto. Además, debe agregar el marco SystemConfiguration a su proyecto.
Respondido el 09 de enero de 16 a las 12:01
Vea mi comentario anterior sobre no usar Accesibilidad de esa manera. Úselo en modo asincrónico y suscríbase a las notificaciones que envía, no lo haga. - Kendall Helmstetter Gelner
Este código es un buen punto de partida para las cosas que necesita establecer antes de poder usar los métodos delegados para la clase de accesibilidad. - brock woolf
82
Aquí tienes una respuesta muy simple:
NSURL *scriptUrl = [NSURL URLWithString:@"http://www.google.com/m"];
NSData *data = [NSData dataWithContentsOfURL:scriptUrl];
if (data)
NSLog(@"Device is connected to the Internet");
else
NSLog(@"Device is not connected to the Internet");
La URL debe apuntar a un sitio web extremadamente pequeño. Utilizo el sitio web móvil de Google aquí, pero si tuviera un servidor web confiable, cargaría un archivo pequeño con un solo carácter en él para máxima velocidad.
Si comprueba si el dispositivo está de algun modo estar conectado a Internet es todo lo que desea hacer, definitivamente recomiendo usar esta sencilla solución. Si necesita saber cómo está conectado el usuario, usar Accesibilidad es el camino a seguir.
Cuidado: esto bloqueará brevemente su hilo mientras carga el sitio web. En mi caso, esto no fue un problema, pero debería considerar esto (crédito a Brad por señalar esto).
Respondido el 09 de enero de 16 a las 12:01
Realmente me gusta esta idea, pero diría que para la confiabilidad del 99.999% mientras se mantiene un tamaño de respuesta pequeño, vaya a www.google.com/m, que es la vista móvil de Google. - rwyland
Impresionante solución @Erik. Lo que también te recomiendo es usar www.google.com, en lugar de www.google.com/m, como dijo rwyland. Es extraño, pero según mi prueba, la versión móvil siempre tarda unos 120 ms más que la de www.google.com. Sebyddd
Los documentos de Apple recomiendan no hacer esto ya que puede bloquear el hilo en una red lenta, puede hacer que la aplicación se cierre en iOS - Brad Thomas
Gracias por los comentarios positivos, acepta que www.google.com/m es la mejor solución debido a su confiabilidad. - Erik
LOL, estoy seguro de que Google aprecia que sugieras que la gente los use como un recurso de verificación de Internet. - mxcl
73
Así es como lo hago en mis aplicaciones: si bien un código de respuesta de estado 200 no garantiza nada, es lo suficientemente estable para mí. Esto no requiere tanta carga como las respuestas de NSData publicadas aquí, ya que la mía solo verifica la respuesta HEAD.
código SWIFT
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" aka Google URL reachable
}
else
{
// No "Internet" aka Google URL un-reachable
}
})
}
Código Objective-C
typedef void(^connection)(BOOL);
- (void)checkInternet:(connection)block
{
NSURL *url = [NSURL URLWithString:@"http://www.google.com/"];
NSMutableURLRequest *headRequest = [NSMutableURLRequest requestWithURL:url];
headRequest.HTTPMethod = @"HEAD";
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];
defaultConfigObject.timeoutIntervalForResource = 10.0;
defaultConfigObject.requestCachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];
NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:headRequest
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
if (!error && response)
{
block([(NSHTTPURLResponse *)response statusCode] == 200);
}
}];
[dataTask resume];
}
- (void)yourMethod
{
[self checkInternet:^(BOOL internet)
{
if (internet)
{
// "Internet" aka Google URL reachable
}
else
{
// No "Internet" aka Google URL un-reachable
}
}];
}
Respondido el 07 de enero de 19 a las 16:01
Parece que esta es la forma más rápida: Paul
Precaución: en mi experiencia, esta solución no funciona todo el tiempo. En muchos casos, la respuesta devuelta es 403, después de tomarse su tiempo. Esta solución parecía perfecta, pero no garantiza resultados al 100%. - Mustafa
A partir de junio de 2014, esto fallará en China continental, debido a que el gobierno chino ahora bloquea completamente google.com. (google.cn funciona, sin embargo, pero en China continental, no baidu.com, no Internet) Probablemente sea mejor hacer ping a cualquier servidor con el que necesite comunicarse. - prehumedecido
Utilice www.appleiphonecell.com en su lugar; Apple creó esta URL precisamente por esta razón. - sonriente
solía manzanaiphonecelular como es de Apple, también se puede utilizar en China, y es un sitio web muy rápido. Esto, junto con su respuesta, me proporcionó la solución más cercana y rápida. Gracias - Septrónico
57
Suministros de Apple Código de muestra para comprobar los diferentes tipos de disponibilidad de red. Alternativamente hay un ejemplo en el libro de cocina de los desarrolladores de iPhone.
Nota: Consulte el comentario de @KHG sobre esta respuesta con respecto al uso del código de accesibilidad de Apple.
Respondido el 28 de enero de 11 a las 07:01
Gracias. Descubrí que la documentación de Xcode en 3.0 también contiene el código fuente, que se encuentra al buscar "accesibilidad" en la documentación. - brock woolf
Tenga en cuenta que la nueva revisión (09-08-09) del código de muestra de accesibilidad de Apple es asincrónica. - daniel hepper
46
Podrías usar Reachability
por (disponible aquí).
#import "Reachability.h"
- (BOOL)networkConnection {
return [[Reachability reachabilityWithHostName:@"www.google.com"] currentReachabilityStatus];
}
if ([self networkConnection] == NotReachable) { /* No Network */ } else { /* Network */ } //Use ReachableViaWiFi / ReachableViaWWAN to get the type of connection.
Respondido 26 ago 17, 03:08
@Supertecnoboff No, es asincrónico. - Alejandro Azizi
39
Apple proporciona una aplicación de muestra que hace exactamente esto:
Respondido el 11 de junio de 13 a las 11:06
Debe tener en cuenta que el ejemplo de Accesibilidad solo detecta qué interfaces están activas, pero no cuáles tienen una conexión válida a Internet. Las aplicaciones deben manejar correctamente las fallas incluso cuando la accesibilidad informa que todo está listo para funcionar. - rpetrich
Afortunadamente, la situación es mucho mejor en 3.0, ya que el sistema presentará una página de inicio de sesión para los usuarios detrás de un WiFi bloqueado donde debe iniciar sesión para usar ... si está desarrollando aplicaciones 2.2.1) - Kendall Helmstetter Gelner
No diría que la aplicación Accesibilidad hace exactamente lo que se pide. Sin embargo, es un buen punto de partida para agregar el tipo de funcionalidad que se solicita, - johan karlsson
Enlace roto !, agradecería si esto se puede verificar / arreglar, muchas gracias - Heider Sati
33
Solo se ha actualizado la clase Accesibilidad. Ahora puedes usar:
Reachability* reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];
if (remoteHostStatus == NotReachable) { NSLog(@"not reachable");}
else if (remoteHostStatus == ReachableViaWWAN) { NSLog(@"reachable via wwan");}
else if (remoteHostStatus == ReachableViaWiFi) { NSLog(@"reachable via wifi");}
Respondido el 09 de enero de 16 a las 12:01
A menos que algo haya cambiado desde que se lanzó 4.0, ese código no es asíncrono y tiene la garantía de verlo aparecer en Crash Reports, me sucedió antes. - papá
Estoy de acuerdo con bpapa. No es una buena idea utilizar código síncrono. Gracias por la informacion sin embargo - brock woolf
27
Una versión de Accesibilidad para iOS 5 es semilla oscura / Accesibilidad.h. ¡No es mío! =)
Respondido el 09 de enero de 16 a las 12:01
25
Aquí hay una modernización de accesibilidad atractiva que utiliza ARC y GCD:
Respondido el 11 de junio de 13 a las 11:06
22
Si estás usando AFNetworking
puede utilizar su propia implementación para el estado de accesibilidad de Internet.
La mejor forma de usar AFNetworking
es subclasificar el AFHTTPClient
class y use esta clase para hacer sus conexiones de red.
Una de las ventajas de utilizar este enfoque es que puede utilizar blocks
para establecer el comportamiento deseado cuando cambia el estado de accesibilidad. Suponiendo que he creado una subclase singleton de AFHTTPClient
(como se dice en las "Notas de subclasificación" en Documentos de AFNetworking) llamado BKHTTPClient
, Haría algo como:
BKHTTPClient *httpClient = [BKHTTPClient sharedClient];
[httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
{
if (status == AFNetworkReachabilityStatusNotReachable)
{
// Not reachable
}
else
{
// Reachable
}
}];
También puede verificar las conexiones Wi-Fi o WLAN específicamente usando el AFNetworkReachabilityStatusReachableViaWWAN
y AFNetworkReachabilityStatusReachableViaWiFi
enumeracionesMás información aquí).
contestado el 30 de mayo de 13 a las 02:05
18
He usado el código en esta discusión, y parece funcionar bien (lea el todo ¡hilo!).
No lo he probado exhaustivamente con todos los tipos de conexión imaginables (como Wi-Fi ad hoc).
Respondido el 09 de enero de 16 a las 12:01
este código no es totalmente bueno porque solo verifica si tiene conexión wifi con un enrutador, no si se puede acceder a la web. Puede tener wifi funcionando y continuar habilitado para llegar a la web. - Duck
15
Muy simple ... Pruebe estos pasos:
Paso 1: Agregue la SystemConfiguration
marco en su proyecto.
Paso 2: Importe el siguiente código en su header
archivo.
#import <SystemConfiguration/SystemConfiguration.h>
Paso 3: Utilice el siguiente método
Tipo 1:
- (BOOL) currentNetworkStatus { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; BOOL connected; BOOL isConnected; const char *host = "www.apple.com"; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host); SCNetworkReachabilityFlags flags; connected = SCNetworkReachabilityGetFlags(reachability, &flags); isConnected = NO; isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); CFRelease(reachability); return isConnected; }
Tipo 2:
Importar encabezado :
#import "Reachability.h"
- (BOOL)currentNetworkStatus { Reachability *reachability = [Reachability reachabilityForInternetConnection]; NetworkStatus networkStatus = [reachability currentReachabilityStatus]; return networkStatus != NotReachable; }
Paso 4: Modo de empleo:
- (void)CheckInternet
{
BOOL network = [self currentNetworkStatus];
if (network)
{
NSLog(@"Network Available");
}
else
{
NSLog(@"No Network Available");
}
}
Respondido el 09 de enero de 16 a las 13:01
¿El tipo 1 es asincrónico? - Supertecnoboff
Quiero las correcciones de tipo 2 de su respuesta. Agregué las clases de accesibilidad e intenté verificar la verificación de la conexión usando arriba su respuesta. siempre es accesible incluso si me conecto con WiFi, pero no tiene conexión a Internet. WiFi no significa que tenga conexión a Internet. Quiero verificar la conexión a Internet incluso si tiene conectividad WiFi. ¿Podrías ayudarme por favor? - wesley
12
-(void)newtworkType {
NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@"statusBar"] valueForKey:@"foregroundView"]subviews];
NSNumber *dataNetworkItemView = nil;
for (id subview in subviews) {
if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
dataNetworkItemView = subview;
break;
}
}
switch ([[dataNetworkItemView valueForKey:@"dataNetworkType"]integerValue]) {
case 0:
NSLog(@"No wifi or cellular");
break;
case 1:
NSLog(@"2G");
break;
case 2:
NSLog(@"3G");
break;
case 3:
NSLog(@"4G");
break;
case 4:
NSLog(@"LTE");
break;
case 5:
NSLog(@"Wifi");
break;
default:
break;
}
}
Respondido el 03 de junio de 13 a las 12:06
Incluso si el dispositivo está conectado a Wifi o algún otro tipo de red, la conexión a Internet puede no estar disponible. Prueba simple: conéctese al wifi de su hogar y luego desconecte su cable módem. Todavía conectado a wifi, pero cero a Internet. - Me han robado
11
- (void)viewWillAppear:(BOOL)animated
{
NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
return (URL != NULL ) ? YES : NO;
}
O usa el Clase de accesibilidad.
Hay dos formas de verificar la disponibilidad de Internet usando el SDK de iPhone:
1. Compruebe que la página de Google esté abierta o no.
2. Clase de accesibilidad
Para obtener más información, consulte Accesibilidad (Desarrollador de Apple).
Respondido el 09 de enero de 16 a las 12:01
Hay dos formas de verificar la disponibilidad de Internet en el SDK de iPhone 1) Verifique que la página de Google esté abierta o no. - Rocas IOS
-1: este es un método síncrono que bloqueará el hilo principal (el que cambia la interfaz de usuario de la aplicación) mientras intenta conectarse a google.com. Si su usuario tiene una conexión de datos muy lenta, el teléfono actuará como si el proceso no respondiera. - Me han robado
10
Utilice la herramienta http://huytd.github.io/datatify/. Es más fácil que agregar bibliotecas y escribir código usted mismo.
Respondido el 09 de enero de 16 a las 13:01
10
Primero: Agregar CFNetwork.framework
en el marco
Code: ViewController.m
#import "Reachability.h"
- (void)viewWillAppear:(BOOL)animated
{
Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
NetworkStatus internetStatus = [r currentReachabilityStatus];
if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
{
/// Create an alert if connection doesn't work
UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection" message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[myAlert show];
[myAlert release];
}
else
{
NSLog(@"INTERNET IS CONNECT");
}
}
Respondido el 09 de enero de 16 a las 13:01
8
Primero descargue la clase de accesibilidad y coloque el archivo reachability.hy reachabilty.m en su Xcode.
La mejor manera es crear una clase de funciones común (NSObject) para que pueda usarla en cualquier clase. Estos son dos métodos para verificar la accesibilidad de la conexión de red:
+(BOOL) reachabiltyCheck
{
NSLog(@"reachabiltyCheck");
BOOL status =YES;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name:kReachabilityChangedNotification
object:nil];
Reachability * reach = [Reachability reachabilityForInternetConnection];
NSLog(@"status : %d",[reach currentReachabilityStatus]);
if([reach currentReachabilityStatus]==0)
{
status = NO;
NSLog(@"network not connected");
}
reach.reachableBlock = ^(Reachability * reachability)
{
dispatch_async(dispatch_get_main_queue(), ^{
});
};
reach.unreachableBlock = ^(Reachability * reachability)
{
dispatch_async(dispatch_get_main_queue(), ^{
});
};
[reach startNotifier];
return status;
}
+(BOOL)reachabilityChanged:(NSNotification*)note
{
BOOL status =YES;
NSLog(@"reachabilityChanged");
Reachability * reach = [note object];
NetworkStatus netStatus = [reach currentReachabilityStatus];
switch (netStatus)
{
case NotReachable:
{
status = NO;
NSLog(@"Not Reachable");
}
break;
default:
{
if (!isSyncingReportPulseFlag)
{
status = YES;
isSyncingReportPulseFlag = TRUE;
[DatabaseHandler checkForFailedReportStatusAndReSync];
}
}
break;
}
return status;
}
+ (BOOL) connectedToNetwork
{
// Create zero addy
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
NSLog(@"Error. Could not recover network reachability flags");
return NO;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"];
NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self];
return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;
}
Ahora puede verificar la conexión de red en cualquier clase llamando a este método de clase.
Respondido el 09 de enero de 16 a las 12:01
8
También existe otro método para verificar la conexión a Internet usando el iPhone SDK.
Intente implementar el siguiente código para la conexión de red.
#import <SystemConfiguration/SystemConfiguration.h>
#include <netdb.h>
/**
Checking for network availability. It returns
YES if the network is available.
*/
+ (BOOL) connectedToNetwork
{
// Create zero addy
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability =
SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
printf("Error. Could not recover network reachability flags\n");
return NO;
}
BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
return (isReachable && !needsConnection) ? YES : NO;
}
Respondido el 09 de enero de 16 a las 13:01
8
La biblioteca me pareció simple y fácil de usar. SimplePingHelper.
Código de muestra: chrishulbert / SimplePingHelper (GitHub)
Respondido el 09 de enero de 16 a las 13:01
8
Descargue el archivo de Accesibilidad, https://gist.github.com/darkseed/1182373
Y añadir
CFNetwork.framework
y 'SystemConfiguration.framework' en el marcoImportar "Accesibilidad.h"
Primero: Agregar CFNetwork.framework
en el marco
Code: ViewController.m
- (void)viewWillAppear:(BOOL)animated
{
Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
NetworkStatus internetStatus = [r currentReachabilityStatus];
if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
{
/// Create an alert if connection doesn't work
UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection" message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[myAlert show];
[myAlert release];
}
else
{
NSLog(@"INTERNET IS CONNECT");
}
}
Respondido el 09 de enero de 16 a las 13:01
8
Rápido 3 / Rápido 4
Primero debes importar
import SystemConfiguration
Puede verificar la conexión a Internet con el siguiente método
func isConnectedToNetwork() -> 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.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
return (isReachable && !needsConnection)
}
Respondido 08 Feb 18, 04:02
7
EL Clase de accesibilidad Está bien averiguar si la conexión a Internet está disponible para un dispositivo o no ...
Pero en caso de acceder a un recurso de intranet:
Hacer ping al servidor de intranet con la clase de accesibilidad siempre devuelve verdadero.
Entonces, una solución rápida en este escenario sería crear un método web llamado pingme
junto con otros métodos web del servicio. La pingme
debería devolver algo.
Entonces escribí el siguiente método sobre funciones comunes
-(BOOL)PingServiceServer
{
NSURL *url=[NSURL URLWithString:@"http://www.serveraddress/service.asmx/Ping"];
NSMutableURLRequest *urlReq=[NSMutableURLRequest requestWithURL:url];
[urlReq setTimeoutInterval:10];
NSURLResponse *response;
NSError *error = nil;
NSData *receivedData = [NSURLConnection sendSynchronousRequest:urlReq
returningResponse:&response
error:&error];
NSLog(@"receivedData:%@",receivedData);
if (receivedData !=nil)
{
return YES;
}
else
{
NSLog(@"Data is null");
return NO;
}
}
El método anterior fue muy útil para mí, así que cada vez que intento enviar algunos datos al servidor, siempre verifico la accesibilidad de mi recurso de intranet usando esta URLRequest de bajo tiempo de espera.
Respondido el 09 de enero de 16 a las 13:01
7
Hacer esto usted mismo es extremadamente simple. El siguiente método funcionará. Solo asegúrese de no permitir que se pase un protocolo de nombre de host como HTTP, HTTPS, etc. con el nombre.
-(BOOL)hasInternetConnection:(NSString*)urlAddress
{
SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [urlAddress UTF8String]);
SCNetworkReachabilityFlags flags;
if (!SCNetworkReachabilityGetFlags(ref, &flags))
{
return NO;
}
return flags & kSCNetworkReachabilityFlagsReachable;
}
Es rápido, sencillo e indoloro.
Respondido el 09 de enero de 16 a las 13:01
7
Además de la accesibilidad, también puede utilizar el Biblioteca de ayuda de ping simple. Funciona muy bien y es fácil de integrar.
Respondido el 09 de enero de 16 a las 13:01
7
Creo que esta es la mejor respuesta.
"Sí" significa conectado. "No" significa desconectado.
#import "Reachability.h"
- (BOOL)canAccessInternet
{
Reachability *IsReachable = [Reachability reachabilityForInternetConnection];
NetworkStatus internetStats = [IsReachable currentReachabilityStatus];
if (internetStats == NotReachable)
{
return NO;
}
else
{
return YES;
}
}
Respondido el 09 de enero de 16 a las 13:01
6
- Paso 1: agregue la clase Accesibilidad en su proyecto.
- Paso 2: importar la clase de accesibilidad
Paso 3: crea la siguiente función
- (BOOL)checkNetConnection { self.internetReachability = [Reachability reachabilityForInternetConnection]; [self.internetReachability startNotifier]; NetworkStatus netStatus = [self.internetReachability currentReachabilityStatus]; switch (netStatus) { case NotReachable: { return NO; } case ReachableViaWWAN: { return YES; } case ReachableViaWiFi: { return YES; } } }
Paso 4: Llame a la función de la siguiente manera:
if (![self checkNetConnection]) { [GlobalFunctions showAlert:@"" message:@"Please connect to the Internet!" canBtntitle:nil otherBtnTitle:@"Ok"]; return; } else { Log.v("internet is connected","ok"); }
Respondido el 09 de enero de 16 a las 13:01
Los documentos de Apple afirman esto Nota: La accesibilidad no puede indicarle a su aplicación si puede conectarse a un host en particular, solo que hay una interfaz disponible que podría permitir una conexión y si esa interfaz es la WWAN. - noobsmcgoobs
6
Comprobación de la disponibilidad de la conexión a Internet en (iOS) Xcode 8, Swift 3.0
Este es un método simple para verificar la disponibilidad de la red, ya que nuestro dispositivo está conectado a cualquier red o no. He conseguido traducirlo a Swift 3.0 y aquí el código final. La clase de accesibilidad de Apple existente y otras bibliotecas de terceros parecían demasiado complicadas para traducir a Swift.
Esto funciona para conexiones 3G, 4G y WiFi.
No olvides agregar "SystemConfiguration.framework" a su constructor de proyectos.
//Create new swift class file Reachability in your project.
import SystemConfiguration
public class InternetReachability {
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
}
}
// Check network connectivity from anywhere in project by using this code.
if InternetReachability.isConnectedToNetwork() == true {
print("Internet connection OK")
} else {
print("Internet connection FAILED")
}
Respondido el 20 de junio de 20 a las 10:06
¿Versión de MacOS? De lo contrario, NO se responde la pregunta principal. - Héctor
Compruebe el encabezado de la respuesta principal. - Vi Jay Avhad
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ios macos cocoa cocoa-touch reachability or haz tu propia pregunta.
Más bien
return (BOOL)URLString;
, o mejor,return !!URLString
orreturn URLString != nil
- user529758No sé cuál es su caso de uso, pero si puede, es preferible probar la solicitud y manejar cualquier error, como la falta de conexión que surja. Si no puede hacer esto, hay muchos buenos consejos aquí en este caso. - SK9
Tu solución es inteligente y la prefiero. También puedes usar
NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://twitter.com/getibox"] encoding:NSUTF8StringEncoding error:nil];
Para deshacerse de la molesta advertencia. - Abdelrahman Eidintente usar la clase de accesibilidad del siguiente enlace, funcionará para usted github.com/tonymillion/Accesibilidad - Dhaval H. Nena
Para aquellos que han encontrado recientemente esta respuesta: stackoverflow.com/a/8813279 - afollestad