노블의 개발이야기

[iOS] 네트워크 상태 체크 본문

iOS

[iOS] 네트워크 상태 체크

더플러스 2015. 4. 23. 11:36

네트워크 상태 체크

현재 네트워크 상태가 어떤지, 아니면 3G에서 Wi-fi망으로 전환되었는지 등의 여부를 확인해야 할 경우가 있다. 특히 동영상 스트리밍 등과 같이 네트워크 트래픽 발생이 클 경우, Apple에서는 3G를 통한 사용을 제한하고 있다. (이러한 이유로 Apple에서 Rejected 하기도 한다.)


- (BOOL)isNetworkReachable

{

    struct sockaddr_inzeroAddr;

    bzero(&zeroAddr, sizeof(zeroAddr));

    zeroAddr.sin_len = sizeof(zeroAddr);

    zeroAddr.sin_family = AF_INET;

    

    SCNetworkReachabilityRef target = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr*)&zeroAddr);

    

    SCNetworkReachabilityFlagsflag;

    SCNetworkReachabilityGetFlags(target, &flag);

    

    return (flag & kSCNetworkFlagsReachable)?YES:NO;

}


- (BOOL)isCellNetwork

{

    struct sockaddr_inzeroAddr;

    bzero(&zeroAddr, sizeof(zeroAddr));

    zeroAddr.sin_len = sizeof(zeroAddr);

    zeroAddr.sin_family = AF_INET;

    

    SCNetworkReachabilityRef target = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr*)&zeroAddr);

    

    SCNetworkReachabilityFlagsflag;

    SCNetworkReachabilityGetFlags(target, &flag);

    

    return (flag & kSCNetworkReachabilityFlagsIsWWAN)?YES:NO;

}


실시간 네트워크 상태 체크

- (BOOL)startNotifier

{

BOOL returnValue = NO;

SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL};


if (SCNetworkReachabilitySetCallback(_reachabilityRef, ReachabilityCallback, &context))

{

if (SCNetworkReachabilityScheduleWithRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode))

{

returnValue = YES;

}

}

    

return returnValue;

}



- (void)stopNotifier

{

if (_reachabilityRef != NULL)

{

SCNetworkReachabilityUnscheduleFromRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

}

}


Network Reachability Flags

kSCNetworkReachabilityFlagsTransientConnection

The specified node name or address can be reached via a transient connection, such as PPP.

지정된 노드 이름이나 주소는 PPP와 같은 일시적인 연결을 통해 도달 할 수 있다.

kSCNetworkReachabilityFlagsReachable

The specified node name or address can be reached using the current network configuration.

지정된 노드 이름 또는 주소가 현재의 네트워크 구성을 사용하여 도달할 수 있다.


kSCNetworkReachabilityFlagsConnectionRequired

The specified node name or address can be reached using the current network configuration, but a connection must first be established. If this flag is set, the kSCNetworkReachabilityFlagsConnectionOnTraffic flag, kSCNetworkReachabilityFlagsConnectionOnDemand flag, or kSCNetworkReachabilityFlagsIsWWAN flag is also typically set to indicate the type of connection required. If the user must manually make the connection, the kSCNetworkReachabilityFlagsInterventionRequired flag is also set.

지정된 노드 이름 또는 주소는 현재의 네트워크 구성을 사용하여 도달할 수 있지만, 연결이 먼저 확립되어야 한다.

이 플래그가 설정되면 kSCNetworkReachabilityFlagsConnectionOnTraffic, kSCNetworkReachabilityFlagsConnectionOnDemand, or kSCNetworkReachabilityFlagsIsWWAN 플래그 또한 요구되는 연결 타입을 나타내도록 설정된다.

만약 사용자가 수동으로 연결을 해야하는 경우 kSCNetworkReachabilityFlagsInterventionRequired 플래그도 설정된다.


kSCNetworkReachabilityFlagsConnectionOnTraffic

The specified node name or address can be reached using the current network configuration, but a connection must first be established. Any traffic directed to the specified name or address will initiate the connection.

This flag was previously named kSCNetworkReachabilityFlagsConnectionAutomatic.

지정된 노드 이름 또는 주소는 현재의 네트워크 구성을 사용하여 도달할 수 있지만, 연결이 먼저 확립되어야 한다.

지정된 이름이나 주소를 향한 모든 트래픽은 연결을 시작한다.

이 플래그는 이전에 kSCNetworkReachabilityFlagsConnectionAutomatic 으로 명명되었다.


kSCNetworkReachabilityFlagsInterventionRequired

The specified node name or address can be reached using the current network configuration, but a connection must first be established.

In addition, some form of user intervention will be required to establish this connection, such as providing a password, an authentication token, etc.

Currently, this flag is returned only when there is a dial-on-traffic configuration (kSCNetworkReachabilityFlagsConnectionOnTraffic), an attempt to connect has already been made, and when some error (such as no dial tone, no answer, bad password, etc.) occurred during the automatic connection attempt. In this case the PPP controller stops attempting to establish a connection until the user has intervened.

지정된 노드 이름 또는 주소는 현재의 네트워크 구성을 사용하여 도달할 수 있지만, 연결이 먼저 확립되어야 한다.

또한, 암호, 인증 토큰 등과 같은 사용자 개입의 일부 양식이 이 연결을 확립하는데 요구될것이다.

현재, 이 플래그는 dial-on-traffic 설정(kSCNetworkReachabilityFlagsConnectionOnTraffic)이 있을 때만 반환된다.

연결 시도가 이미 이루어진 것이며, 자동 연결을 시도하는 동안 어떤 오류 (no dial tone, no answer, bad password 등) 가 발생했다.

이 경우 PPP 컨트롤러는는 사용자가 개입 될 때까지 연결을 확립하려고 시도하는 것을 멈춘다.


kSCNetworkReachabilityFlagsConnectionOnDemand

The specified node name or address can be reached using the current network configuration, but a connection must first be established. 

The connection will be established "On Demand" by the CFSocketStream programming interface (see CFStream Socket Additions for information on this). Other functions will not establish the connection.

지정된 노드 이름 또는 주소는 현재의 네트워크 구성을 사용하여 도달할 수 있지만, 연결이 먼저 확립되어야 한다.

연결이 CFSocketStream 프로그래밍 인터페이스에 의해 "On Demand"로 설정된다.

다른 기능은 연결을 설정하지 않는다.

[on-demand] 청구[요구, 일람]가 있는 즉시.


kSCNetworkReachabilityFlagsIsLocalAddress

The specified node name or address is one that is associated with a network interface on the current system.

지정된 노드 이름 또는 주소는 현재 시스템의 네트워크 인터페이스와 관련된 것이다.


kSCNetworkReachabilityFlagsIsDirect

Network traffic to the specified node name or address will not go through a gateway, but is routed directly to one of the interfaces in the system.

지정된 노드 이름 또는 주소에 대한 네트워크 트래픽은 게이트웨이를 통과하지 않지만 시스템 인터페이스 중 하나에 직접 라우팅된다.


kSCNetworkReachabilityFlagsConnectionAutomatic

The specified node name or address can be reached using the current network configuration, but a connection must first be established. Any traffic directed to the specified name or address will initiate the connection. This flag is a synonym for kSCNetworkReachabilityFlagsConnectionOnTraffic.

지정된 노드 이름 또는 주소는 현재의 네트워크 구성을 사용하여 도달할 수 있지만, 연결이 먼저 확립되어야 한다. 

지정된 이름 또는 주소를 향한 모든 트래픽은 연결을 시작한다.

이 플래그는 kSCNetworkReachabilityFlagsConnectionOnTraffic 와 동의어이다.


- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags

{

PrintReachabilityFlags(flags, "networkStatusForFlags");

if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)

{

// The target host is not reachable.

   // 대상 호스트에 연결할 수 없다.

return NotReachable;

}


    NetworkStatus returnValue = NotReachable;


if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)

{

/*

         If the target host is reachable and no connection is required then we'll assume (for now) that you're on Wi-Fi...

대상 호스트에 연결 가능하고 연결이 필요하지 않은 경우 우리는 당신이 Wi-Fi 상태에 있다고 가정한다.

         */

returnValue = ReachableViaWiFi;

}


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...

전화 어플리케이션이 CFSocketStream 또는 상위 APIs를 사용하는 경우 연결은 on-demand(요구가있는즉시연결) or on-traffic(자동연결)이다.

         */


        if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)

        {

            /*

             ... and no [user] intervention is needed...

사용자 개입이 필요없다면

             */

            returnValue = ReachableViaWiFi;

        }

    }


if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)

{

/*

         ... but WWAN connections are OK if the calling application is using the CFNetwork APIs.

그러나 WWAN 연결은 OK이다. 전화 어플리케이션이 CFNetwork APIs를 사용하여도.

         */

returnValue = ReachableViaWWAN;

}

    

return returnValue;

}


Reachability를 사용한 실시간 네트워크 상태 체크


애플에서 제공하는 Reachability

https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html


참고

[IOS] Reachability 실시간 네트워크 상태 체크

TUTORIAL : CHECK THE NETWORK STATUS, 3G OR WI-FI

'iOS' 카테고리의 다른 글

[iOS] GCD(Grand Central Dispatch) 사용하기  (0) 2015.04.23
[IOS] ARC - Toll-Free Bridging  (348) 2015.04.23
[iOS] NSString에 URL Encoding과 URL Decoding 메소드 추가하기  (0) 2015.04.20
[iOS] NSUserDefaults  (0) 2015.04.17
[iOS] KeyChain  (0) 2015.04.16
Comments