IOS가 현재 네트워크 상태를 판단하는 세 가지 방법을 자세히 설명합니다.

프로젝트에서 좋은 사용자 체험을 위해 일부 장면은 반드시 네트워크 상태를 라인으로 판단한 후에야 무엇을 해야 할지 결정할 수 있다.예를 들어 영상 재생은 와이파이인지 4G인지 선이 판단해야 한다. 와이파이가 직접 재생되고 4G는 사용자에게 먼저 알려야 한다.네트워크 상태를 가져오는 방법은 크게 세 가지입니다.

1. Reachability


이것은 애플의 공식 프레젠테이션 데모에서 사용하는 방법이다. 우리는 애플의 공식 문서에서 데모(왼쪽 상단 다운로드 샘플 코드를 누르면 다운로드)를 다운로드한 다음에 데모의 Reachability를 다운로드할 수 있다.h와.m 자신의 프로젝트에 합격하고 Build Phases의 Link Binary에 SystemConfiguration을 추가합니다.프레임워크 프레임워크, 그리고 사용할 곳에서 Reachability 헤더 파일 가져오기
Reachability 헤더 파일에서 네트워크, 와이파이, 벌집망 세 개의 네트워크 상태의 매거진 값을 볼 수 있습니다. 다음과 같습니다.

typedef enum : NSInteger {
    NotReachable = 0,
    ReachableViaWiFi,
    ReachableViaWWAN
} NetworkStatus;

(1) 네트워크 상태 가져오기


iOS 7 이전에는 사용자 네트워크가 벌집 네트워크일 때 3G, 4G 등 네트워크 유형을 판단할 수 없었고, iOS 7 이후에는 판단할 수 있었다

(NSString *)internetStatus {
    Reachability *reachability   = [Reachability reachabilityWithHostName:@"www.apple.com"];
    NetworkStatus internetStatus = [reachability currentReachabilityStatus];
    NSString *net = @"WIFI";
    switch (internetStatus) {
        case ReachableViaWiFi:
            net = @"WIFI";
            break;
        case ReachableViaWWAN:
            net = @" ";
            //net = [self getNetType ];   // 
            break;
        case NotReachable:
            net = @" ";
        default:
            break;
    }
    return net;
}

(2) 사용자가 휴대전화에 인터넷을 가지고 있을 때 구체적인 네트워크 유형을 판단한다


이때 시스템이 자체적으로 가지고 있는 API를 사용하여 2G, 3G, 4G인지 판단할 수 있다. 이것은 CTTelephony Network Info와 같은 종류로 사용해야 한다. 프로젝트에 CoreTelephony를 추가하는 것을 기억해야 한다.프레임워크, 헤더 파일 가져오기

- (NSString *)getNetType
{
    CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
    NSString *currentStatus = info.currentRadioAccessTechnology;
    if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyGPRS"]) {
        netconnType = @"GPRS";
    }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyEdge"]) {
        netconnType = @"2.75G EDGE";
    }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyWCDMA"]){
        netconnType = @"3G";
    }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyHSDPA"]){
        netconnType = @"3.5G HSDPA";
    }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyHSUPA"]){
        netconnType = @"3.5G HSUPA";
    }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMA1x"]){
        netconnType = @"2G";
    }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORev0"]){
        netconnType = @"3G";
    }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORevA"]){
        netconnType = @"3G";
    }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORevB"]){
        netconnType = @"3G";
    }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyeHRPD"]){
        netconnType = @"HRPD";
    }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyLTE"]){
        netconnType = @"4G";
    }
}
이 방법으로 판단되는 벌집 네트워크 유형은 다음과 같습니다.
CTRadioAccessTechnologyGPRS//는 2G와 3G 사이이며 2.5G라고도 하며 과도한 기술
CTRadioAccessTechnology Edge/EDGE는 GPRS에서 3세대 이동통신으로의 전환, EDGE는 2.75G
CTRadioAccessTechnologyWCDMA
CTRadioAccessTechnologyHSDPA//또는 3.5G(3?G)
CTRadioAccessTechnologyHSUPA//3G에서 4G까지의 과도한 기술
CTRadioAccessTechnologyCDMA1x       //3G
CTRadioAccessTechnologyCDMAEVDORev0/3G 표준
CTRadioAccessTechnologyCDMAEVDORevA
CTRadioAccessTechnologyCDMAEVDORevB
CTRadio Access Technology HRPD//전신에서 사용하는 3G에서 4G까지의 진전 기술, 3.75G
CTRadioAccessTechnologyLTE//4G 근접

2. 시스템 statusBar를 통해 판단


이런 방법은 아이폰 X에서 궤멸을 일으킬 수 있다. 애플이 status Bar의 키 Path를 수정했기 때문에 얻은 물건은 nil로 현재 네트워크 상태를 붕괴//획득할 수 있다(아이폰 X에서 붕괴를 일으킬 수 있다)

+ (NSString *)networkingStatesFromStatebar {
    //  app , app
    UIApplication *app = [UIApplication sharedApplication];
    //iphone X  
    NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
    int type = 0;
    for (id child in children) {
        if ([child isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
            type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
        }
    }
    NSString *stateString = @"wifi";
    switch (type) {
        case 0:
            stateString = @"notReachable";
             break;
        case 1:
            stateString = @"2G";
            break;
        case 2:
            stateString = @"3G";
            break;
        case 3:
            stateString = @"4G";
            break;
        case 4:
            stateString = @"LTE";
            break;
        case 5:
            stateString = @"wifi";
            break;
        default:
            break;
    }
    return stateString;
}

3. AFNetworking을 통해


이 방법은 AppDelegate에 쓰여 네트워크 상태가 변화할 때마다 알림을 보내고 네트워크 변화를 실시간으로 모니터링한 다음에 해당하는 처리를 할 수 있다

#pragma mark - -------------   -------------
- (void)monitorNetworking
{
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];
    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case -1:
                NSLog(@" ");
                break;
            case 0:
                NSLog(@" ");
                break;
            case 1:
                {
                NSLog(@"GPRS ");
                // , 
                [[NSNotificationCenter defaultCenter] postNotificationName:@"monitorNetworking" object:@"1" userInfo:nil];
                }
            break;
            case 2:
                {
                NSLog(@"wifi ");
                // , 
                [[NSNotificationCenter defaultCenter] postNotificationName:@"monitorNetworking" object:@"2" userInfo:nil];
                }
                break;
            default:
                break;
        }
        if (status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi) {
            NSLog(@" ");
        }else{
            NSLog(@" ");
        }
    }];
}
이상은 IOS가 현재 네트워크 상태를 판단하는 세 가지 방법에 대한 상세한 내용입니다. IOS가 현재 네트워크 상태를 판단하는 것에 대한 더 많은 자료는 저희 기타 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기