질문자 :Brock Woolf
iOS에서 Cocoa Touch 라이브러리를 사용하거나 macOS에서 Cocoa 라이브러리를 사용하여 인터넷에 연결되어 있는지 확인하고 싶습니다.
NSURL
사용하여 이 작업을 수행하는 방법을 생각해 냈습니다. 내가 한 방식은 약간 신뢰할 수 없는 것처럼 보입니다(Google도 언젠가는 다운될 수 있고 제3자에 의존하는 것이 좋지 않을 수 있기 때문에). 그리고 Google이 응답하지 않는 경우 다른 웹사이트의 응답을 확인하기 위해 확인할 수 있었지만, 내 응용 프로그램에 낭비적이고 불필요한 오버 헤드가 보입니다.
- (BOOL) connectedToInternet { NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]]; return ( URLString != NULL ) ? YES : NO; }
내가 한 일이 잘못 stringWithContentsOfURL
은 iOS 3.0 및 macOS 10.4에서 더 이상 사용되지 않음은 말할 것도 없고) 그렇다면 이를 수행하는 더 좋은 방법은 무엇입니까?
중요 : 이 검사는 항상 비동기식으로 수행해야 합니다. 아래 답변의 대부분은 동기식이므로 주의하지 않으면 앱이 정지될 수 있습니다.
빠른
CocoaPods 또는 Carthage를 통해 설치: https://github.com/ashleymills/Reachability.swift
클로저를 통한 연결성 테스트
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") }
오브젝티브-C
SystemConfiguration
프레임워크를 추가하지만 어디에나 포함하는 것에 대해 걱정하지 마십시오.
Tony Million 버전의 Reachability.h
및 Reachability.m
을 프로젝트에 추가합니다(여기: https://github.com/tonymillion/Reachability ).
인터페이스 섹션 업데이트
#import "Reachability.h" // Add this to the interface in the .m file of your view controller @interface MyViewController () { Reachability *internetReachableFoo; } @end
그런 다음 호출할 수 있는 뷰 컨트롤러의 .m 파일에서 이 메서드를 구현합니다.
// 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]; }
중요 참고 사항: Reachability
클래스는 프로젝트에서 가장 많이 사용되는 클래스 중 하나이므로 다른 프로젝트와 이름 충돌이 발생할 수 있습니다. Reachability.h
및 Reachability.m
파일 쌍 중 하나의 이름을 다른 이름으로 바꾸어 문제를 해결해야 합니다.
참고: 사용 하는 도메인은 중요하지 않습니다. 모든 도메인에 대한 게이트웨이 테스트일 뿐입니다.
iwasrobbed나는 물건을 단순하게 유지하는 것을 좋아합니다. 내가 하는 방법은 다음과 같습니다.
//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; }
그런 다음 연결이 있는지 확인하고 싶을 때마다 이것을 사용합니다.
if (![self connected]) { // Not connected } else { // Connected. Do some Internet stuff }
이 메서드는 작업을 수행하기 위해 변경된 네트워크 상태를 기다리지 않습니다. 요청할 때만 상태를 테스트합니다.
cannyboyApple의 Reachability 코드를 사용하여 클래스를 포함할 필요 없이 올바르게 확인하는 함수를 만들었습니다.
프로젝트에 SystemConfiguration.framework를 포함합니다.
일부 가져오기:
#import <sys/socket.h> #import <netinet/in.h> #import <SystemConfiguration/SystemConfiguration.h>
이제 이 함수를 호출하면 됩니다.
/* 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; }
그리고 iOS 5 는 당신을 위해 테스트되었습니다.
Andrew Zimmer이것은 정답이었지만 지금은 도달 가능성에 대한 알림을 구독해야 하므로 구식입니다. 이 메서드는 동기적으로 다음을 확인합니다.
Apple의 Reachability 클래스를 사용할 수 있습니다. 또한 Wi-Fi가 활성화되어 있는지 확인할 수 있습니다.
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) { }
Reachability 클래스는 SDK와 함께 제공되지 않고 이 Apple 샘플 애플리케이션 의 일부입니다. 다운로드하고 Reachability.h/m을 프로젝트에 복사하기만 하면 됩니다. 또한 프로젝트에 SystemConfiguration 프레임워크를 추가해야 합니다.
Daniel Rinser다음은 매우 간단한 답변입니다.
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");
URL은 매우 작은 웹사이트를 가리켜야 합니다. 여기에서 Google의 모바일 웹사이트를 사용하지만 안정적인 웹 서버가 있다면 최대 속도를 위해 한 글자만 포함된 작은 파일을 업로드할 것입니다.
장치가 어떻게든 인터넷에 연결되어 있는지 확인하는 것이 원하는 모든 것이라면 이 간단한 솔루션을 사용하는 것이 좋습니다. 사용자가 어떻게 연결되어 있는지 알아야 하는 경우 도달 가능성을 사용하는 것이 좋습니다.
주의: 웹사이트를 로드하는 동안 스레드가 잠시 차단됩니다. 제 경우에는 이것이 문제가 되지 않았지만 이것을 고려해야 합니다(이 점을 지적한 Brad의 공적).
Erik내 앱에서 수행하는 방법은 다음과 같습니다. 200 상태 응답 코드가 아무 것도 보장하지 않지만 나에게는 충분히 안정적입니다. 여기에 게시된 NSData 답변만큼 로드가 필요하지 않습니다. 광산은 HEAD 응답만 확인하기 때문입니다.
스위프트 코드
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 코드
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 } }]; }
klcjr89Apple은 다양한 유형의 네트워크 가용성을 확인하기 위해 샘플 코드를 제공합니다. 또는 iPhone 개발자 요리 책에 예가 있습니다.
참고: Apple의 연결 코드 사용에 대한 이 답변에 대한 @KHG의 의견을 참조하십시오.
teabot( 여기에서 사용 가능 )까지 Reachability
#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.
Aleksander AziziApple은 정확히 다음을 수행하는 샘플 앱을 제공합니다.
도달 가능성
user133319Reachability 클래스만 업데이트되었습니다. 이제 다음을 사용할 수 있습니다.
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");}
Ben GrootiOS 5용 Reachability 버전은 darkseed/Reachability.h 입니다. 내 것이 아니다! =)
Alex여기에 ARC 및 GCD를 사용하여 연결 가능성을 현대화한 멋진 모습이 있습니다.
도달 가능성
JK LaihoAFNetworking
을 사용하는 경우 인터넷 연결 상태에 대한 자체 구현을 사용할 수 있습니다.
AFNetworking
을 사용하는 가장 좋은 방법은 AFHTTPClient
클래스의 하위 클래스를 만들고 이 클래스를 사용하여 네트워크 연결을 수행하는 것입니다.
이 접근 방식을 사용할 때의 장점 중 하나는 연결 blocks
을 사용하여 원하는 동작을 설정할 수 있다는 것입니다. 나는의 싱글 서브 클래스 만든 것을 가정하면 AFHTTPClient
(이하 "하위 클래스 노트"에서 말했듯에 문서 AFNetworking )라는 이름의 BKHTTPClient
내가 좋아하는 일을 할 것입니다 :
BKHTTPClient *httpClient = [BKHTTPClient sharedClient]; [httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { if (status == AFNetworkReachabilityStatusNotReachable) { // Not reachable } else { // Reachable } }];
AFNetworkReachabilityStatusReachableViaWWAN
및 AFNetworkReachabilityStatusReachableViaWiFi
열거형을 사용하여 Wi-Fi 또는 WLAN 연결을 확인할 수도 있습니다 (자세한 내용은 여기 ).
Bruno Koga이 토론 에서 코드를 사용했는데 잘 작동하는 것 같습니다( 전체 스레드를 읽어보세요!).
나는 생각할 수 있는 모든 종류의 연결(예: Ad Hoc Wi-Fi)에 대해 철저하게 테스트하지 않았습니다.
Felixyz매우 간단합니다.... 다음 단계를 시도하십시오.
1단계: SystemConfiguration
프레임워크를 프로젝트에 추가합니다.
2단계: 다음 코드를 header
파일로 가져옵니다.
#import <SystemConfiguration/SystemConfiguration.h>
3단계: 다음 방법 사용
유형 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; }
유형 2:
헤더 가져오기 : #import "Reachability.h"
- (BOOL)currentNetworkStatus { Reachability *reachability = [Reachability reachabilityForInternetConnection]; NetworkStatus networkStatus = [reachability currentReachabilityStatus]; return networkStatus != NotReachable; }
4단계: 사용 방법:
- (void)CheckInternet { BOOL network = [self currentNetworkStatus]; if (network) { NSLog(@"Network Available"); } else { NSLog(@"No Network Available"); } }
Rajesh Loganathan-(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; } }
Mutawe- (void)viewWillAppear:(BOOL)animated { NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]]; return (URL != NULL ) ? YES : NO; }
또는 Reachability 클래스를 사용합니다.
iPhone SDK를 사용하여 인터넷 가용성을 확인하는 두 가지 방법이 있습니다.
1. Google 페이지가 열려 있는지 확인합니다.
2. 연결성 클래스
자세한 내용은 연결 가능성 (Apple 개발자)을 참조하세요.
IOS Rockshttp://huytd.github.io/datatify/ 를 사용하십시오. 라이브러리를 추가하고 직접 코드를 작성하는 것보다 쉽습니다.
Huy Tran첫 번째 : 프레임워크에 CFNetwork.framework
코드 : 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"); } }
Paresh HirparaiOS 12 또는 macOS v10.14 (Mojave) 이상을 사용하는 경우 이전의 Reachability
클래스 NWPathMonitor
보너스로 현재 네트워크 연결 유형을 쉽게 감지할 수 있습니다.
import Network // Put this on top of your class let monitor = NWPathMonitor() monitor.pathUpdateHandler = { path in if path.status != .satisfied { // Not connected } else if path.usesInterfaceType(.cellular) { // Cellular 3/4/5g connection } else if path.usesInterfaceType(.wifi) { // Wi-Fi connection } else if path.usesInterfaceType(.wiredEthernet) { // Ethernet connection } } monitor.start(queue: DispatchQueue.global(qos: .background))
추가 정보:https://developer.apple.com/documentation/network/nwpathmonitor
Ely먼저 Reachability 클래스를 다운로드하고 Xcode 에 Reachability.h 및 Reachabilty.m 파일을 넣습니다.
가장 좋은 방법은 공용 Functions 클래스(NSObject)를 만들어 모든 클래스에서 사용할 수 있도록 하는 것입니다. 다음은 네트워크 연결 도달 가능성 확인을 위한 두 가지 방법입니다.
+(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; }
이제 이 클래스 메서드를 호출하여 모든 클래스에서 네트워크 연결을 확인할 수 있습니다.
Latika TiwariiPhone SDK를 사용하여 인터넷 연결을 확인하는 또 다른 방법이 있습니다.
네트워크 연결을 위해 다음 코드를 구현해 보십시오.
#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; }
Sahil MahajanSimplePingHelper 라이브러리가 간단하고 사용하기 쉽다는 것을 알았습니다 .
샘플 코드: chrishulbert/SimplePingHelper ( GitHub )
Piyush Dubey도달 가능성 파일 다운로드, https://gist.github.com/darkseed/1182373
CFNetwork.framework
및 'SystemConfiguration.framework'를 추가합니다.
#import "Reachability.h"를 수행하십시오.
첫 번째 : 프레임워크에 CFNetwork.framework
코드 : 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"); } }
Maulik Salvi스위프트 3 / 스위프트 4
먼저 수입해야 합니다
import SystemConfiguration
다음 방법으로 인터넷 연결을 확인할 수 있습니다.
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) }
Devang TandelReachability 클래스 는 장치에서 인터넷 연결을 사용할 수 있는지 여부를 확인하는 데 적합합니다.
그러나 인트라넷 리소스 에 액세스하는 경우:
도달 가능성 클래스를 사용하여 인트라넷 서버에 ping을 실행하면 항상 true가 반환됩니다.
따라서 이 시나리오에서 빠른 솔루션은 서비스의 다른 pingme
pingme
는 무언가를 반환해야 합니다.
그래서 나는 일반적인 기능에 대해 다음과 같은 방법을 썼다.
-(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; } }
위의 방법은 나에게 매우 유용했기 때문에 서버에 일부 데이터를 보내려고 할 때마다 항상 이 짧은 시간 초과 URLRequest를 사용하여 인트라넷 리소스의 연결 가능성을 확인합니다.
Durai Amuthan.H이를 직접 수행하는 것은 매우 간단합니다. 다음 방법이 작동합니다. HTTP, HTTPS 등과 같은 호스트 이름 프로토콜이 이름과 함께 전달되는 것을 허용하지 않도록 하십시오.
-(BOOL)hasInternetConnection:(NSString*)urlAddress { SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [urlAddress UTF8String]); SCNetworkReachabilityFlags flags; if (!SCNetworkReachabilityGetFlags(ref, &flags)) { return NO; } return flags & kSCNetworkReachabilityFlagsReachable; }
빠르고 간단하고 고통이 없습니다.
Tony도달 가능성 외에도 Simple Ping 도우미 라이브러리를 사용할 수도 있습니다. 그것은 정말 훌륭하게 작동하고 통합하기 쉽습니다.
user2538944나는 이것이 최고의 대답이라고 생각한다.
"예"는 연결되었음을 의미합니다. "아니오"는 연결이 끊긴 것을 의미합니다.
#import "Reachability.h" - (BOOL)canAccessInternet { Reachability *IsReachable = [Reachability reachabilityForInternetConnection]; NetworkStatus internetStats = [IsReachable currentReachabilityStatus]; if (internetStats == NotReachable) { return NO; } else { return YES; } }
Mina Fawzy- 1단계: 프로젝트에 Reachability 클래스를 추가합니다.
- 2단계: Reachability 클래스 가져오기
3단계: 아래 함수 생성
- (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; } } }
4단계: 아래와 같이 함수를 호출합니다.
if (![self checkNetConnection]) { [GlobalFunctions showAlert:@"" message:@"Please connect to the Internet!" canBtntitle:nil otherBtnTitle:@"Ok"]; return; } else { Log.v("internet is connected","ok"); }
Anny출처 : http:www.stackoverflow.com/questions/1083701/how-can-i-check-for-an-active-internet-connection-on-ios-or-macos