2011-10-29 20 views
101

का पता लगाएं मुझे यकीन नहीं है कि यह संभव है, लेकिन मेरे पास यह परिदृश्य है।आईओएस 3 जी या वाईफाई

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

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

अब इस सवाल यह है:

मैं अगर यह WiFi या 3G (पर है पता लगाने के लिए अपने आवेदन कार्यक्रम कर सकते हैं। मैं जानता हूँ कि आप यह कर सकते हैं), लेकिन फिर उत्तर के आधार पर इस तरह

तरह खंड 1 या 2 पर जाएँ:

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

के संभावित डुप्लिकेट [iPhone SDK का पता लगाने वाईफ़ाई और कैरियर नेटवर्क] (http://stackoverflow.com/questions/1625158/iphone-sdk-detect-wifi-and- वाहक नेटवर्क) –

उत्तर

204

का उपयोग कोड सेब here

01 प्रदान
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 
} 
+0

हाँ कूल यह काम किया !!! पहुंचने योग्य फ़ाइलों की कुछ फिक्सिंग करना था क्योंकि इसमें आईओएस 5 के लिए त्रुटियां थीं - लेकिन मैं अभी बहुत खुश हूं। दुर्भाग्य से मैं केवल आपको 1 वोट दे सकता हूं :-) –

+8

क्या आपको स्थिति होने के बाद '[पहुंच योग्यता रोकथामकर्ता] 'नहीं कहा जाना चाहिए? – zekel

+3

यह उस दायरे पर निर्भर करता है जिसमें आप इस कोड का उपयोग करते हैं। यदि यह केवल एक विधि में था, तो 'पहुंच योग्यता' गुंजाइश से बाहर हो जाएगी और विधि के अंत में हटा दी जाएगी और 'स्टॉप नॉटिफायर' को पूरी तरह से बुलाया जाएगा। –

0

यहां आईओएस 6 के लिए एक अद्यतन संस्करण है जिसमें सेब से सरलपिंग भी शामिल है। यह एआरसी संगत है और मैंने दूसरे व्यक्ति के फिक्स से पहुंचने योग्यता से ठीक किया। http://elbsolutions.com/projects/reachability-with-simpleping-wrapper/

मुझे उम्मीद है कि यह किसी की मदद करेगा।

+0

यदि आप इसके उपयोग का उदाहरण दे सकते हैं। –

0

क्या आप Xamarin या Monotouch उपयोग कर रहे हैं का उपयोग कर सकते गम्यता Xamarin GitHub रिपोजिटरी से वर्ग अनुकूलित:

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

तो अपनी परियोजना के लिए इसे जोड़ने और Reachability.InternetConnectionStatus()

-1

उपयोग इस एक, के साथ बनाया गया फोन पहुंचने योग्य और उपयोग करने में आसान, एकीकृत करने के लिए कोड की केवल कुछ पंक्तियां। आपको बताने के लिए एक कॉलबैक फ़ंक्शन जब कनेक्शन बदल http://huytd.github.io/datatify/

+0

यह फिर से उपयोग करता है Reachability – Stephan

8

मैं एक बहुत सरल ब्लॉक आधारित गम्यता आवरण है कि सभी पुरानी सी-तरह गम्यता कोड स्ट्रिप्स बनाया है, एक और अधिक कोको रूप में डाल दिया है।

उपयोग जैसा:

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

eppz!blog पर Reachability with blocks for everyday use देखें, या eppz!reachability at GitHub से सीधे हड़पने।

यह आईपी पते के साथ भी काम करता है, जो एक बहुत दुर्लभ रीचैबिलिटी रैपर सुविधा साबित हुआ।

+19

उम्मम 'स्क्रीनशॉट' क्यों? – QED

+12

मुझे ब्लॉग पोस्ट, आंखों के लिए कैंडी से था। टिप्पणी – Geri

+4

एक अप :( – Dnaso

24

आप गम्यता पुस्तकालय आयात या सूचक के साथ सौदा नहीं करना चाहते, तो आप इस सरल तुल्यकालिक विधि का उपयोग कर सकते हैं:

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

यह सहायक कोड का उपयोग करने के लिए आपको और SystemConfiguration.framework के लिए लिंक #import किया है। – Dirk

+0

यह मुझे एक बड़ी समस्या से मदद की , बहुत बहुत शुक्रिया –

16

आयात एप्पल के 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"); 
    } 

    } 

संदर्भ (लिंक भविष्य में तोड़ सकते हैं):

+0

पहले, SystemConfiguration ढांचे को जोड़ने के लिए इस लिंक पर https://github.com/tonymillion/Reachabilit 'खोलने के लिए और फ़ाइल डाउनलोड करने और Reachability.h कॉपी, .m अपनी परियोजना और आयात #import "Reachability.h" करने के लिए, #import और अंत में कोड के ऊपर पेस्ट कॉपी करें ..... – Marking

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


} 
1
#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 "पुल" के लिए जाँच करें। पालन ​​के रूप में

2

कक्षा विधि है

+(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 
} 
संबंधित मुद्दे