iOS 3 जी या वाईफाई का पता लगाता है


106

मुझे यकीन नहीं है कि यह संभव है, लेकिन मेरे पास यह परिदृश्य है।

मेरे पास अपने UIWebView में प्रदर्शित एक वेबसाइट है जिसमें एक UISegmentedController में लिंक सेट है। वे यह पता लगा सकते हैं कि आप वाईफाई पर हैं या 3 जी नेटवर्क पर हैं।

अब खंडित नियंत्रक 2 अलग-अलग पृष्ठों की ओर इशारा करता है: 1 - एक iPhone अनुकूल लॉगिन स्क्रीन 2 - होम पेज, एक बार जब आप लॉग इन होते हैं।

अब यहाँ प्रश्न है:

क्या मैं यह पता लगाने के लिए अपना आवेदन कर सकता हूं कि यह वाईफ़ाई या 3 जी के लिए है (मुझे पता है कि आप ऐसा कर सकते हैं), लेकिन फिर उत्तर के आधार पर खंड 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]स्टेटस होने के बाद क्या आपको फोन नहीं करना चाहिए ?
४१ पर ज़ेकेल

3
यह उस दायरे पर निर्भर करता है जिसमें आप इस कोड का उपयोग करते हैं। यदि यह सिर्फ एक विधि में थे, reachabilityतो दायरे से बाहर हो जाएगा और विधि के अंत में निपटा stopNotifierजाएगा और इसे अंतर्निहित रूप से कहा जाएगा।
जेम्स वेबस्टर

संपादन के लिए धन्यवाद। मुझे लगता है कि यह इस कोड का एक पुराना संस्करण था जिसका इस्तेमाल किया गया थाReachableViaWifiNetwork
जेम्स वेबस्टर

यह बहुत अच्छा काम करता है, लेकिन परियोजना में शामिल न करें सामान्य प्रणालीसुविधाएँ.फ्रेमवर्क, अन्यथा आपको लिंकर समस्या मिल जाएगी
Jevgenij Kononov

30

यदि आप रीचैबिलिटी लाइब्रेरी आयात नहीं करना चाहते हैं या नोटिफ़ायर से निपटना चाहते हैं, तो आप इस सरल तुल्यकालिक विधि का उपयोग कर सकते हैं:

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 से लिंक करना होगा।
डिर्क

18

Apple के रीचैबिलिटी को आयात करें और यह प्रयास करें,

#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 पर कॉपी करें, अपने प्रोजेक्ट पर जाएं और #import "Reachability .h", #import <CoreTelephony / CTTelephonyNetworkInfo.h> आयात करें। और अंत में इसके बाद के संस्करण कोड पेस्ट कॉपी .....
अंकन

8

मैंने एक बहुत ही सरल ब्लॉक आधारित रीचैबिलिटी रैपर बनाया जो सभी पुराने सी-लाइक रीचैबिलिटी कोड को स्ट्रिप्स करता है, जो कि बहुत अधिक कोको फॉर्म में डाला जाता है।

उपयोग की तरह:

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

Eppz! ब्लॉग पर रोज़ाना उपयोग के लिए ब्लॉक के साथ रीचैबिलिटी देखें , या इसे सीधे eppz से पकड़ें! GitHub पर रीचबिलिटी

यह IP पतों के साथ भी काम करता है , जो कि एक बहुत ही दुर्लभ रीचैबिलिटी रैपर फीचर है।


19
Ummm क्यों 'स्क्रीनशॉट'?
QED

12
मैंने इसे ब्लॉग पोस्ट, आँखों के लिए कैंडी से लिया था।
गेरी बोरबस

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?
अगिर्तुल्ट

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

यह जाँचने के लिए कि क्या आप वाईफाई में हैं, यह कनेक्शन बनाने की महंगी जाँच से बचाता है। इंटरनेट साझाकरण के लिए जाँच करने के लिए ifa_name "ब्रिज" की जाँच करें।


1

यदि आप Xamarin या Monotouch का उपयोग कर रहे हैं, तो आप Xamarin GitHubosos से Reachability अनुकूलित वर्ग का उपयोग कर सकते हैं:

https://github.com/xamarin/monotouch-samples/blob/master/ReachabilitySample/reachability.cs

इसलिए इसे अपने प्रोजेक्ट में जोड़ें और कॉल करें Reachability.InternetConnectionStatus()


लिंक टूट गया है।
क्रिस्टोफर स्टीफ़न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.