iOS 3G 또는 WiFi 감지


106

이것이 가능한지 잘 모르겠지만이 시나리오가 있습니다.

UISegmentedController에 링크가 설정된 내 UIWebView에 웹 사이트가 표시됩니다. 웹 사이트는 Wi-Fi 또는 3g 네트워크에 있는지 감지 할 수 있습니다.

이제 세그먼트 화 된 컨트롤러는 2 개의 다른 페이지를 가리 킵니다. 1-iPhone 친화적 인 로그인 화면 2-로그인 한 후 홈 페이지.

이제 여기에 질문이 있습니다.

내 응용 프로그램이 WIFI인지 3G인지 감지하도록 프로그래밍 할 수 있습니까 (이 작업을 수행 할 수 있는지 알고 있습니다). 그런 다음 답변에 따라 세그먼트 1 또는 2로 이동합니다.

다음과 같은 종류 :

if (iPhone device is on 3g) {
    Go to Segment 1;
} else {
    Go to Segment 0;
}

답변:


210

Apple이 여기에 제공 한 코드 사용

Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];

NetworkStatus status = [reachability currentReachabilityStatus];

if(status == NotReachable) 
{
    //No internet
}
else if (status == ReachableViaWiFi)
{
    //WiFi
}
else if (status == ReachableViaWWAN) 
{
    //3G
}

네 멋져요 !!! iOS5에 대한 오류가 있었기 때문에 도달 가능성 파일을 수정해야했지만 지금은 너무 행복합니다. 불행히도 1 개의 찬성표 만 줄 수 있습니다 :-)
jwknz

10
[reachability stopNotifier]신분 확인 후 전화하지 않겠습니까?
zekel 2011

3
이 코드를 사용하는 범위에 따라 다릅니다. 이것이 메서드에 있으면 reachability범위를 벗어나 메서드의 끝에서 할당이 취소되고 stopNotifier암시 적으로 호출됩니다.
James Webster

편집 해 주셔서 감사합니다. 나는 그것이 사용 된이 코드의 이전 버전이라고 가정합니다ReachableViaWifiNetwork
James Webster

그것은 잘 작동하지만, 그렇지 않으면 링커 문제를 얻을 것이다, 프로젝트 일반 systemConfiguration.framework에 포함 잊지 마세요
Jevgenij Kononov

30

Reachability 라이브러리를 가져 오거나 알리미를 처리하지 않으려면 다음과 같은 간단한 동기식 방법을 사용할 수 있습니다.

typedef enum {
    ConnectionTypeUnknown,
    ConnectionTypeNone,
    ConnectionType3G,
    ConnectionTypeWiFi
} ConnectionType;


+ (ConnectionType)connectionType
{
    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, "8.8.8.8");
    SCNetworkReachabilityFlags flags;
    BOOL success = SCNetworkReachabilityGetFlags(reachability, &flags);
    CFRelease(reachability);
    if (!success) {
        return ConnectionTypeUnknown;
    }
    BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0);
    BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0);
    BOOL isNetworkReachable = (isReachable && !needsConnection);

    if (!isNetworkReachable) {
        return ConnectionTypeNone;
    } else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) {
        return ConnectionType3G;
    } else {
        return ConnectionTypeWiFi;
    }
}

이 유용한 코드를 사용하려면 #import <SystemConfiguration / SystemConfiguration.h> 및 SystemConfiguration.framework에 링크해야합니다.
Dirk

18

Apple의 Reachability를 가져 와서 시도해보십시오.

#import "Reachability.h"
#import <CoreTelephony/CTTelephonyNetworkInfo.h>

//Try this
Reachability *reachability = [Reachability reachabilityForInternetConnection];
    [reachability startNotifier];

    NetworkStatus status = [reachability currentReachabilityStatus];

    if(status == NotReachable)
    {
       NSLog(@"none");
        //No internet
    }
    else if (status == ReachableViaWiFi)
    {
        NSLog(@"Wifi");
        //WiFi
    }
    else if (status == ReachableViaWWAN)
    {
        NSLog(@"WWAN");


    //connection type
    CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
    _carrier = [[netinfo subscriberCellularProvider] carrierName];

    if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) {
        NSLog(@"2G");
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) {
        NSLog(@"2G");
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) {
        NSLog(@"3G");
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) {
        NSLog(@"3G");
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) {
        NSLog(@"3G");
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) {
        NSLog(@"2G");
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) {
        NSLog(@"3G");
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) {
        NSLog(@"3G");
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) {
        NSLog(@"3G");
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
        NSLog(@"3G");
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
        NSLog(@"4G");
    }

    }

참고 문헌 (링크는 향후 끊어 질 수 있음) :


먼저 SystemConfiguration 프레임 워크를 추가하고이 링크 github.com/tonymillion/Reachabilit '를 열고 파일을 다운로드하고 Reachability.h, .m을 프로젝트에 복사하고 #import "Reachability.h", #import <CoreTelephony / CTTelephonyNetworkInfo.h>를 가져옵니다. 마지막으로 코드 위의 붙여 넣기를 복사합니다 .....
Marking

8

저는 구식 C와 유사한 Reachability 코드를 모두 제거하는 매우 간단한 블록 기반 Reachability 래퍼를 만들어 훨씬 더 많은 Cocoa 형식에 부어 넣었습니다.

다음과 같은 사용법 :

[EPPZReachability reachHost:hostNameOrIPaddress
               completition:^(EPPZReachability *reachability)
{
    if (reachability.reachableViaCellular) [self doSomeLightweightStuff];
}];

eppz! blog 에서 일상적인 사용위한 블록으로 도달 가능성을 참조 하거나 GitHub의 eppz! reachability에서 직접 가져 옵니다 .

또한 매우 드문 도달 가능성 래퍼 기능으로 밝혀진 IP 주소에서도 작동 합니다.


19
음 왜 '스크린 샷'인가요?
QED

12
나는 블로그 게시물에서 가져 왔습니다.
Geri Borbás 2014 년

6

iOS 12 이상을 사용 NWPathMonitor하는 경우 선사 시대 Reachability클래스 대신 사용할 수 있습니다 .

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

테스트 할 호스트를 정의 할 수 있습니까 Reachability.reachabilityWithHostName?
agirault

5

신속하게 사용할 수 있습니다.

func getNetworkType()->String {
    do{
        let reachability:Reachability = try Reachability.reachabilityForInternetConnection()
        do{
            try reachability.startNotifier()
            let status = reachability.currentReachabilityStatus
            if(status == .NotReachable){
                return ""
            }else if (status == .ReachableViaWiFi){
                return "Wifi"
            }else if (status == .ReachableViaWWAN){
                let networkInfo = CTTelephonyNetworkInfo()
                let carrierType = networkInfo.currentRadioAccessTechnology
                switch carrierType{
                case CTRadioAccessTechnologyGPRS?,CTRadioAccessTechnologyEdge?,CTRadioAccessTechnologyCDMA1x?: return "2G"
                case CTRadioAccessTechnologyWCDMA?,CTRadioAccessTechnologyHSDPA?,CTRadioAccessTechnologyHSUPA?,CTRadioAccessTechnologyCDMAEVDORev0?,CTRadioAccessTechnologyCDMAEVDORevA?,CTRadioAccessTechnologyCDMAEVDORevB?,CTRadioAccessTechnologyeHRPD?: return "3G"
                case CTRadioAccessTechnologyLTE?: return "4G"
                default: return ""
                }

                // Get carrier name

            }else{
                return ""
            }
        }catch{
            return ""
        }

    }catch{
        return ""
    }


}

3

수업 방법은 다음과 같습니다.

+(NSString*)connectedNetworkType {
     Reachability *reachability = [Reachability reachabilityForInternetConnection];
        [reachability startNotifier];

        NetworkStatus status = [reachability currentReachabilityStatus];

        if(status == NotReachable) {
            NSLog(@"none");
            //No internet
        }
        else if (status == ReachableViaWiFi) {
            NSLog(@"Wifi");
            //WiFi
            return @"Wifi";
        }
        else if (status == ReachableViaWWAN){
            NSLog(@"WWAN");
            //connection type
            CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
            //    _carrier = [[netinfo subscriberCellularProvider] carrierName];
            if (([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS])
                ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge])
                ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x])) {
                NSLog(@"2G");
                return @"2G";
            }
            else if (([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA])
                     ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA])
                     ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA])
                     ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0])
                     ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA])
                     ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB])
                     ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD])){
                NSLog(@"3G");
                return @"3G";
            }
            else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
                NSLog(@"4G");
                return @"4G";

            }
        }
        return @"-1";//default unknown
}

2
#import <ifaddrs.h>
#import <arpa/inet.h>

BOOL CheckWiFi() {

    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;

    BOOL hasWifi = NO;

    int err = getifaddrs(&interfaces);
    if(err == 0) {

        temp_addr = interfaces; 

        while(temp_addr) {

            if(temp_addr->ifa_addr->sa_family == AF_INET) {

                struct sockaddr_in *addr = (struct sockaddr_in *)temp_addr->ifa_addr;

                if(memcmp(temp_addr->ifa_name, "en", 2) == 0) {
                    hasWifi = YES;
                    break;
                }
            }

            temp_addr = temp_addr->ifa_next;
        }
    }

    freeifaddrs(interfaces);
    return hasWifi;
}

Wi-Fi에 연결되어 있는지 확인하려면 비용이 많이 드는 연결 확인 시간을 절약 할 수 있습니다. 인터넷 공유를 확인하려면 ifa_name "bridge"를 확인하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.