Jaki jest najlepszy sposób sprawdzenia połączenia internetowego za pomocą zestawu SDK iOS?Sprawdź połączenie internetowe za pomocą iOS SDK
Odpowiedz
Najlepszym sposobem jest użycie kodu zasięgu. Sprawdź here for apple sample code. Że ma wiele wygodnych sposobów, aby sprawdzić dostępność internetu, internet/WAN łączności czek etc ..
Dla np: -
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChanged:) name:kReachabilityChangedNotification object:nil];
reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
- (void)networkChanged:(NSNotification *)notification
{
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];
if(remoteHostStatus == NotReachable) { NSLog(@"not reachable");}
else if (remoteHostStatus == ReachableViaWiFiNetwork) { NSLog(@"wifi"); }
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { NSLog(@"carrier"); }
}
Spróbuj kod:
- (BOOL)connectedToInternet
{
NSURL *url=[NSURL URLWithString:@"http://www.google.com"];
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"HEAD"];
NSHTTPURLResponse *response;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL];
return ([response statusCode]==200)?YES:NO;
}
osiągalności ma wiele bardziej do niego niż potrzebuje, a także nie został jeszcze zaktualizowany dla ARC.
Oto moje rozwiązanie w czystym C. Duża część kodu została pobrana bezpośrednio z Reachability, ale oddestylowana do poziomu tylko tego, co jest konieczne. Chciałem tylko, aby zwrócił, czy było połączenie internetowe, czy nie, ale możesz przeczytać z komentarzy, czy powraca TAK w oparciu o założenie sieci Wi-Fi lub sieci komórkowej.
Jedna ostatnia uwaga przed przystąpieniem do udostępnienia kodu: Musisz przejść do celu budowy, wybrać zakładkę fazy budowania i dodać "SystemConfiguration.framework" do listy "Link Binary z bibliotekami".
#import <CoreFoundation/CoreFoundation.h>
#import <SystemConfiguration/SystemConfiguration.h>
#import <netdb.h>
BOOL networkReachable()
{
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *) &zeroAddress);
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(reachabilityRef, &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; // This is a wifi connection.
}
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; // This is a wifi connection.
}
}
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) {
// ... but WWAN connections are OK if the calling application
// is using the CFNetwork (CFSocketStream?) APIs.
return YES; // This is a cellular connection.
}
}
return NO;
}
Bardzo lubię twoje rozwiązanie, ale osobiście zrobię małą modyfikację. Myślę, że zamiast zwracać BOOL, powinieneś zwrócić stały lub ENUM element, abyśmy mogli określić, czy istnieje połączenie i jakiego typu. Na szczęście ta modyfikacja nie jest trudna do zrobienia! –
Wierzę, że popełniłem tu błąd i że ten kod przecieka. SCNetworkReachabilityRef musi zostać wysłany do CFRelease() w pewnym momencie ... najlepszym sposobem na zrobienie tego może być wyrwanie SCNetworkReachabilityGetFlags() i zapisanie jego wartości, a następnie zwolnienie ref dostępności, następnie przejście do if i sprawdzenie zapisana wartość. W ten sposób pamięć zajmowana przez SCNetworkReachability przechowywana na stercie zostaje zwolniona, ale wszystko, czego potrzebujesz w tym momencie (flagi i wartość zwracana przez SCNetworkReachabilityGetFlags()) są nadal dostępne na stosie. – ArtOfWarfare
Skąd wiadomo, kto poniósł szkodę? Przy okazji .. +1 za odpowiedź :) – TonyMkenu
'ReachableViaCarrierDataNetwork' &' ReachableViaWiFiNetwork 'nie są dostępne, status może być' ReachableViaWWAN' lub 'ReachableViaWiFi'. – Hemang
po wyświetleniu tylko powiadomienia, ale trzeba przed zmianą sieci. jak zdobyć dostępną sieć, gdy wywoływana jest metoda viewdidload. – Bala