iOS 또는 macOS에서 활성 인터넷 연결을 확인하는 방법은 무엇입니까?


1324

Cocoa Touch를 사용하여 iOS에서 인터넷에 연결되어 있는지 확인하고 싶습니다. 라이브러리를 또는 Cocoa 라이브러리를 사용하는 macOS .

나는 이것을 사용하여 이것을 수행하는 방법을 생각해 냈습니다 NSURL. 내가 한 방식은 약간 신뢰할 수없는 것 같습니다 (Google조차도 언젠가 다운되어 타사에 의존 할 수 있기 때문에 나쁜 것 같습니다) .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에서는 더 이상 사용되지 않습니다) 그렇다면 그렇게하는 더 좋은 방법은 무엇입니까?


11
오히려 return (BOOL)URLString;, 또는 더 나은, return !!URLString또는return URLString != nil

3
유스 케이스가 무엇인지 모르지만 가능하면 요청을 시도하고 연결 부족과 같은 오류를 처리하는 것이 좋습니다. 이 작업을 수행 할 수 없으면이 경우에 유용한 조언이 많이 있습니다.
— SK9

2
귀하의 솔루션은 영리하며 선호합니다. NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://twitter.com/getibox"] encoding:NSUTF8StringEncoding error:nil];성가신 경고를 없애려면 을 사용할 수도 있습니다 .
— Abdelrahman Eid

4
아래 링크에서 도달 가능성 클래스를 사용해보십시오. github.com/tonymillion/Reachability
— Dhaval H. Nena

4
최근 에이 답변을 찾는 사람들을 위해 : stackoverflow.com/a/8813279
— afollestad

답변:


1284

중요 :이 점검은 항상 비동기 적으로 수행 해야합니다 . 아래 답변의 대부분은 동기식이므로 그렇지 않으면 앱이 중지됩니다.


빠른

1) CocoaPods 또는 Carthage를 통해 설치 하십시오 : https://github.com/ashleymills/Reachability.swift

2) 폐쇄를 통한 접근성 테스트

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

1) SystemConfiguration프로젝트에 프레임 워크를 추가 하지만 어디서나 포함시키는 것에 대해 걱정하지 마십시오.

2)의 토니 만의 버전을 추가 Reachability.h하고 Reachability.m프로젝트에 (여기 : https://github.com/tonymillion/Reachability )

3) 인터페이스 섹션 업데이트

#import "Reachability.h"

// Add this to the interface in the .m file of your view controller
@interface MyViewController ()
{
    Reachability *internetReachableFoo;
}
@end

4) 그런 다음이 메소드를 호출 할 수있는 뷰 컨트롤러의 .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 문제를 해결하려면 파일 파일 합니다.

참고 : 사용 하는 도메인은 중요하지 않습니다. 모든 도메인에 대한 게이트웨이를 테스트하고 있습니다.


4
@gonzobrains : 사용하는 도메인은 중요하지 않습니다. 모든 도메인 에 대한 게이트웨이를 테스트하는 중 입니다.
— iwasrobbed에

3
@KaanDedeoglu 이것은 단지 예일뿐입니다. 원하는 도메인을 사용하십시오. 도메인을 실제로 사용할 수있는 것이 아니라 단순히 인터넷 게이트웨이를 확인합니다.
— iwasrobbed에

1
오, btw도 SystemConfiguration.framework프로젝트 에 추가해야합니다 (방법 1).
— wiseindy

2
google.com 대신 www.appleiphonecell.com을 사용하십시오.이 URL은 정확히 이런 이유로 애플에 의해 생성되었습니다.
— Smikey

1
www.appleiphonecell.com을 사용하는 것은 (2018) 나쁜 선택입니다. 이제> 40kB html 파일 인 Apple.com으로 리디렉션됩니다. google.com으로 돌아 가기-11kB에 불과합니다. BTW google.com/m의 크기는 동일하지만 120msec 느려집니다.
— BlueskyMed

310

나는 일을 단순하게 유지하고 싶다. 내가하는 방법은 다음과 같습니다.

//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
}

이 방법은 네트워크 상태가 변경 될 때까지 기다리지 않습니다. 요청하면 상태 만 테스트합니다.


안녕 @msec, 당신은이 페이지에서 앤드류 짐머 솔루션을 시도 할 수 있습니다, 그것은
— adl

1
위 코드를 사용하여 복사하고 붙여 넣은 사람들을 위해. 또한 SystemConfiguration.framework를 수동으로 추가하지 않으면 연결 오류가 발생합니다.
— Iftikhar Ali Ansari

WiFi에 연결하면 항상 연락 가능한 상태가됩니다. WiFi가 인터넷에 연결되어 있다는 의미는 아닙니다. WiFi 연결이 있어도 인터넷 연결을 확인하고 싶습니다. 도와주세요?
— wesley

@wesley 어떻게 해결 했습니까?
— Keselme

145

Apple의 접근성 코드를 사용하여 클래스를 포함하지 않고도이를 올바르게 확인할 수있는 기능을 만들었습니다.

프로젝트에 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 입니다.


@JezenThomas 이것은 인터넷 검사를 비동기 적으로 수행하지 않기 때문에 "훨씬 더 얇다"는 이유입니다.이 프로세스에서 앱을 중단하지 않도록 알림을 구독하여 항상 비동기 적으로 수행해야합니다.
— iwasrobbed

고마워,이 작업은 wifi adsl을 사용하고 adsl이 연결되어 있지 않아도 정확하게 필요한 것입니다.
— Williew

5
이로 인해 메모리가 누출됩니다. '가독성'구조 (객체, 사물)를 CFRelease ()로 해제해야합니다.
— Russell Mull

@RussellMull ... 누출을 해결하는 방법을 알고 있습니까?
— i_raqz

이 답변이 2 년 전 (중복으로 표시된 질문에서) 내 것보다 낫다는 것은 이상하지만 오늘까지는 보지 못했습니다.
— ArtOfWarfare

121

이것은 정답 이었지만 지금은 도달 가능성에 대한 알림을 구독해야하므로 구식입니다. 이 방법은 동 기적으로 확인합니다.


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) { }

연결성 클래스는 SDK와 함께 제공되지 않고이 Apple 샘플 응용 프로그램 의 일부입니다 . 다운로드하여 프로젝트에 Reachability.h / m을 복사하십시오. 또한 프로젝트에 SystemConfiguration 프레임 워크를 추가해야합니다.


6
도달 가능성을 사용하지 않는 것에 대한 위의 내 의견을 참조하십시오. 비동기 모드에서 사용하고 보내는 알림에 가입하십시오.
— Kendall Helmstetter Gelner

이 코드는 접근성 클래스에 대리자 메서드를 사용하기 전에 설정해야하는 것들에 대한 좋은 출발점입니다.
— Brock Woolf

82

다음은 매우 간단한 답변입니다.

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의 모바일 웹 사이트를 사용하지만 신뢰할 수있는 웹 서버가있는 경우 최대 속도를 위해 문자가 하나만있는 작은 파일을 업로드 했습니다 .

장치가 어떻게 든 인터넷에 연결되어 있는지 확인하는 것이 원하는 모든 것이라면이 간단한 솔루션을 사용하는 것이 좋습니다. 사용자의 연결 방법을 알아야하는 경우 도달 가능성을 사용하는 것이 좋습니다.

주의 : 스레드가 웹 사이트를로드하는 동안 스레드가 잠시 차단됩니다. 내 경우에는 이것이 문제가되지 않았지만 이것을 고려해야합니다 (브래드가 이것을 지적한 것에 대한 신용).


10
이 아이디어가 정말 마음에 들지만 작은 응답 크기를 유지하면서 99.999 %의 안정성을 원한다면 Google 모바일보기 인 www.google.com/m을 방문하십시오.
— rwyland

1
멋진 솔루션 @Erik. rwyland가 말한 것처럼 www.google.com/m 대신 www.google.com을 사용하는 것이 좋습니다. 이상하지만 내 테스트에서 모바일 버전은 항상 www.google.com보다 약 120ms 더 걸립니다
— Sebyddd

4
Apple 문서는 느린 네트워크에서 스레드를 차단하고 iOS에서 앱이 종료 될 수
— Brad Thomas

긍정적 인 의견을 보내 주셔서 감사합니다. www.google.com/m은 안정성으로 인해 최상의 솔루션입니다.
— Erik

3
LOL, 사람들이 인터넷 확인 리소스로 사용하도록 제안 해 주셔서 감사합니다.
— mxcl

73

내 앱에서 수행하는 방법은 다음과 같습니다. 200 상태 응답 코드는 아무것도 보장하지 않지만 충분히 안정적입니다. 내 HEAD 응답을 확인하기 때문에 여기에 게시 된 NSData 답변만큼 많은로드가 필요하지 않습니다.

스위프트 코드

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
         }
    }];
}

3
가장 빠른 방법 인 것 같습니다
— Pavel

3
주의 : 내 경험에 따르면이 솔루션은 항상 작동하지 않습니다. 대부분의 경우 달콤한 시간을 보낸 후 반환 된 응답은 403입니다. 이 솔루션은 완벽 해 보였지만 100 % 결과를 보장하지는 않습니다.
— Mustafa

10
2014 년 6 월 현재 중국 정부는 이제 google.com을 완전히 차단하기 때문에 중국 본토에서 실패 할 것입니다. (Google.cn은 작동하지만 중국 본토에서는 baidu.com, 인터넷 없음)에서 통신해야하는 서버를 핑하는 것이 좋습니다.
— prewett

4
대신 www.appleiphonecell.com을 사용하십시오. Apple은이 이유로 정확하게이 URL을 만들었습니다.
— Smikey

1
나는 애플 자신의 appleiphonecell 을 사용했으며 중국에서도 사용할 수 있으며 매우 빠른 웹 사이트입니다. 이것은 귀하의 답변과 함께 가장 가깝고 빠른 솔루션을 제공했습니다. 감사합니다
— Septronic

57

Apple 은 다양한 유형의 네트워크 가용성을 확인하기 위해 샘플 코드 를 제공 합니다. 또는 iPhone 개발자 요리 책에 예가 있습니다.

참고 : Apple의 접근성 코드 사용에 대한이 답변에 대한 @KHG의 의견을 참조하십시오.


감사. 3.0의 Xcode 문서에도 문서에서 "reachability"를 검색하여 찾은 소스 코드가 포함되어 있음을 발견했습니다.
— Brock Woolf

7
Apple의 Reachability 샘플 코드의 새로운 개정판 (09-08-09)은 비동기식입니다.
— Daniel Hepper

46

당신은 사용할 수 있습니다 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.

@Supertecnoboff 아니요, 비동기입니다.
— Aleksander Azizi

39

Apple은 정확히 다음을 수행하는 샘플 앱을 제공합니다.

접근성


7
접근성 샘플은 활성화 된 인터페이스 만 감지하고 인터넷에 유효한 인터페이스는 감지하지 않습니다. 도달 가능성이 모든 준비가 완료되었다고보고하더라도 응용 프로그램은 장애를 정상적으로 처리해야합니다.
— rpetrich

다행히도 시스템은 사용자가 로그인 해야하는 잠긴 WiFi 뒤에있는 사용자를위한 로그인 페이지를 표시하므로 상황이 훨씬 좋습니다. 직접 리디렉션을 수동으로 확인해야합니다 (그리고 여전히 2.2.1 앱을 개발하는 경우)
— Kendall Helmstetter Gelner

Reachability 앱이 요청한 내용을 정확하게 수행한다고 말하고 싶지는 않습니다. 그러나 요구되는 기능을 추가하기에 좋은 출발점입니다.
— Johan Karlsson

끊어진 링크!, 이것이 점검 / 수정 될 수 있다면 고맙겠습니다. 많은 감사
— Heider Sati

33

접근성 클래스 만 업데이트되었습니다. 이제 다음을 사용할 수 있습니다.

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");}

1
4.0이 릴리스 된 이후에 변경된 사항이 없으면 해당 코드는 비동기식이 아니며 충돌 보고서에 표시되는 것을 보장합니다.
— bpapa

1
나는 bpapa에 동의합니다. 동기 코드를 사용하는 것은 좋지 않습니다. 정보를 주셔서 감사합니다
— Brock Woolf



22

사용중인 경우 AFNetworking인터넷 연결 가능성 상태에 대해 자체 구현을 사용할 수 있습니다.

사용하는 가장 좋은 방법 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 연결을 확인할 수도 있습니다 .


18

이 토론 에서 코드를 사용했는데 잘 작동하는 것 같습니다 ( 전체 읽기 스레드를 !).

나는 상상할 수있는 모든 종류의 연결 (애드혹 Wi-Fi와 같은)로 철저하게 테스트하지 않았습니다.


이 코드는 웹에 연결할 수없는 경우가 아니라 라우터와 Wi-Fi 연결이 있는지 확인하기 때문에 완전히 좋지 않습니다. Wi-Fi가 작동하고 계속 웹에 연결할 수 있습니다.
— DuckDucking

15

매우 간단합니다 .... 다음 단계를 수행하십시오.

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");
    }
}

유형 1이 비동기입니까?
— Supertecnoboff

귀하의 답변에서 유형 2 수정을 원합니다. 접근성 클래스를 추가했으며 위의 답변을 사용하여 연결 확인을 확인하려고했습니다. Wi-Fi에 연결하더라도 항상 연결할 수 있지만 인터넷에 연결되어 있지 않습니다. WiFi가 인터넷에 연결되어 있다는 의미는 아닙니다. WiFi 연결이 있어도 인터넷 연결을 확인하고 싶습니다. 도와주세요?
— 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;
}
}

7
장치가 Wifi 또는 다른 네트워크 유형에 연결되어 있어도 인터넷 연결을 계속 사용할 수 없습니다. 간단한 테스트 : 가정용 Wi-Fi에 연결 한 다음 케이블 모뎀을 분리하십시오. 여전히 와이파 이에 연결되어 있지만 인터넷은 0입니다.
— iwasrobbed에

11
- (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 Developer)을 참조하십시오 .


1
iPhone SDK에는 인터넷 사용 가능 여부를 확인하는 두 가지 방법이 있습니다. 1) Google 페이지가 열려 있는지 확인합니다.
— IOS Rocks

1
-1 : google.com에 연결을 시도하는 동안 메인 스레드 (앱 UI가 변경된 스레드)를 차단하는 동기식 메소드입니다. 사용자의 데이터 연결 속도가 매우 느린 경우 전화가 프로세스가 응답하지 않는 것처럼 작동합니다.
— iwasrobbed


10

첫 번째 : 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");
    }
}

8

먼저 접근성 클래스를 다운로드하고 reachability.h 및 reachabilty.m 파일을 Xcode 에 넣으십시오 .

가장 좋은 방법은 모든 클래스에서 사용할 수 있도록 공통 함수 클래스 (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;
}

이제이 클래스 메소드를 호출하여 모든 클래스의 네트워크 연결을 확인할 수 있습니다.


8

iPhone 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;
}


8
  1. 접근성 파일 ( https://gist.github.com/darkseed/1182373)을 다운로드 하십시오.

  2. 그리고 CFNetwork.framework프레임 워크에 'SystemConfiguration.framework'를 추가하십시오.

  3. #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");
    }
}

8

스위프트 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)

}

7

도달 가능성 클래스는 인터넷 연결 장치에 또는 사용할 수없는 경우 찾아 OK입니다 ...

그러나 인트라넷 리소스 에 액세스하는 경우 :

접근성 클래스로 인트라넷 서버를 핑하면 항상 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를 사용하여 항상 인트라넷 리소스의 연결 가능성을 확인합니다.


7

이 작업을 직접 수행하는 것은 매우 간단합니다. 다음 방법이 작동합니다. HTTP, HTTPS 등과 같은 호스트 이름 프로토콜이 이름과 함께 전달되지 않도록하십시오.

-(BOOL)hasInternetConnection:(NSString*)urlAddress
{
    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [urlAddress UTF8String]);
    SCNetworkReachabilityFlags flags;
    if (!SCNetworkReachabilityGetFlags(ref, &flags))
    {
        return NO;
    }
    return flags & kSCNetworkReachabilityFlagsReachable;
}

빠르고 간단합니다.



7

이것이 가장 좋은 대답이라고 생각합니다.

"예"는 연결된 것을 의미합니다. "아니오"는 연결이 끊어진 것을 의미합니다.

#import "Reachability.h"

 - (BOOL)canAccessInternet
{
    Reachability *IsReachable = [Reachability reachabilityForInternetConnection];
    NetworkStatus internetStats = [IsReachable currentReachabilityStatus];

    if (internetStats == NotReachable)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}

6

Reachable.h에서 클래스를 가져 ViewController오고 다음 코드를 사용하여 연결 을 확인하십시오 .

     #define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
     if (hasInternetConnection){
           // To-do block
     }

당신의 대답은 내가 찾고있는 것입니다. 귀하는 xD로 투표 할 자격이 있습니다
— Nikel Arteta

인터넷이없는 WiFi에 연결되어 있으면 작동하지 않습니다.
— Keselme

6
  • 1 단계 : 프로젝트에 접근성 클래스를 추가합니다.
  • 2 단계 : 접근성 클래스 가져 오기
  • 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");
    }

Apple의 문서에는 다음과 같이 명시되어 있습니다. 참고 : 도달 가능성은 특정 호스트에 연결할 수있는 경우 응용 프로그램에 말할 수 없으며 연결을 허용 할 수있는 인터페이스 만 사용할 수 있으며 해당 인터페이스가 WWAN인지 여부 만 알려줍니다.
— noobsmcgoobs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.