2011-10-02 15 views
5

मुझे यह निर्धारित करने की आवश्यकता है कि इंटरनेट कनेक्शन उपलब्ध है या नहीं। मुझे परवाह नहीं है कि यह कैसे जुड़ा हुआ है (डब्ल्यूआई-एफआई, लैन, आदि ..)। मुझे यह निर्धारित करने की ज़रूरत है कि इंटरनेट कनेक्शन बिल्कुल उपलब्ध है।कोको में इंटरनेट कनेक्शन कैसे निर्धारित करें?

पीएस मुझे डब्ल्यूआई-एफआई कनेक्शन की जांच करने का एक तरीका मिला। लेकिन मुझे परवाह नहीं है कि यह कैसे जुड़ा हुआ है (मुझे उन सभी तरीकों की जांच करने की ज़रूरत है जो इंटरनेट से कनेक्ट हो सकते हैं)।

कुछ (isConnected)

+1

http://stackoverflow.com/questions/2995822/check-internet-connection-in-cocoa-application – bryanmac

+0

का शिकार यह है और न ही वास्तव में नकल है। वह लिंक आईफोन इंटरनेट कनेक्शन के बारे में अधिक है। और केवल वाई-फाई के लिए। – User1234

+0

@ उपयोगकर्ता 1234: आपको क्या विश्वास है कि प्रश्नकर्ता आईफोन या वाई-फाई के बारे में पूछ रहा था? –

उत्तर

8

तरह SCNetworkReachability संदर्भ पर एक नजर डालें। यह एक सी एपीआई है, इसलिए एक विधि कॉल के रूप में उपयोग करना उतना आसान नहीं है, लेकिन यह आपके ऐप को सूचित करने का एक अच्छा काम करता है जब कोई विशेष पता नेटवर्क पर पहुंचा जा सकता है या पहुंच योग्य नहीं होता है।

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

एप्पल आपूर्ति an example app पता चलता है कि (हालांकि यह आईओएस, नहीं मैक ओएस एक्स के लिए डिज़ाइन किया गया है)

+0

धन्यवाद बहुत कुछ जानना दिलचस्प था। लेकिन मुझे मैक ओएस के लिए इसकी ज़रूरत है। मुझे लगता है कि उपयोग करने के लिए कुछ और आसान होना चाहिए। मैं यह जांचना चाहता हूं कि क्या मैं इंटरनेट से जुड़ा हूं -do कुछ। जैसे (अगर कनेक्ट किया गया) {// यहां करें} – User1234

+2

यह मैक ओएस एक्स पर उपलब्ध है (लिंक किया गया दस्तावेज़ मैक ओएस एक्स लाइब्रेरी से है)। उदाहरण आईओएस के लिए लिखा जाना है। कोई सिस्टम-प्रदान की गई 'कनेक्ट की गई' विधि नहीं है। लेकिन आप इसका उपयोग अपनी 'कनेक्टेड' विधि लिखने के लिए कर सकते हैं। – Alex

+0

ठीक है धन्यवाद। – User1234

3

एक तरह से यह करने के लिए कि यह कैसे उपयोग करने के लिए है:

// Check whether the user has internet 
- (bool)hasInternet { 
    NSURL *url = [[NSURL alloc] initWithString:@"http://www.google.com"]; 
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5.0]; 
    BOOL connectedToInternet = NO; 
    if ([NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]) { 
     connectedToInternet = YES; 
    } 
    //if (connectedToInternet) 
     //NSLog(@"We Have Internet!"); 
    [request release]; 
    [url release]; 
    return connectedToInternet; 
} 
+0

यह वही करता है जो मैं चाहता हूं। धन्यवाद। – User1234

+0

कोई समस्या नहीं! अपवित्र के लिए धन्यवाद! – Fatso

+6

यह एक बुरा समाधान है। आपका आवेदन तब तक स्थिर हो जाएगा जब तक अनुरोध सफल नहीं हो जाता है या विफल रहता है। यह आपके एप्लिकेशन को 60 सेकंड तक रुकने का कारण बन सकता है यदि उनके पास रूटिंग समस्या है जो अनुरोध को समाप्त होने तक विफल होने का कारण बनता है। आपका उपयोगकर्ता इसकी सराहना नहीं करेगा। यहां तक ​​कि यदि यह सफल होता है, तो एप्लिकेशन कई सेकंड के लिए बंद हो जाएगा, खासकर एक धीमी कनेक्शन पर। – Alex

7

इस कोड को दोनों iOS के लिए काम करता है और ओएसएक्स मंच, मुझे उम्मीद है।

#include <SystemConfiguration/SystemConfiguration.h> 
static BOOL isInternetConnection() 
{ 
    BOOL returnValue = NO; 

#ifdef TARGET_OS_MAC 

    struct sockaddr zeroAddress; 
    bzero(&zeroAddress, sizeof(zeroAddress)); 
    zeroAddress.sa_len = sizeof(zeroAddress); 
    zeroAddress.sa_family = AF_INET; 

    SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(NULL, (const struct sockaddr*)&zeroAddress); 


#elif TARGET_OS_IPHONE 

    struct sockaddr_in address; 
    size_t address_len = sizeof(address); 
    memset(&address, 0, address_len); 
    address.sin_len = address_len; 
    address.sin_family = AF_INET; 

    SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(NULL, (const struct sockaddr*)&address); 

#endif 

    if (reachabilityRef != NULL) 
    { 
     SCNetworkReachabilityFlags flags = 0; 

     if(SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) 
     { 
      BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0); 
      BOOL connectionRequired = ((flags & kSCNetworkFlagsConnectionRequired) != 0); 
      returnValue = (isReachable && !connectionRequired) ? YES : NO; 
     } 

     CFRelease(reachabilityRef); 
    } 

    return returnValue; 

} 
+0

यह जवाब होना चाहिए! धन्यवाद! – rocky

+0

क्या कोई और इसका परीक्षण करता है? – bgplaya

+0

मैंने इसका परीक्षण किया और यह बहुत अच्छा काम करता है। – Mike

संबंधित मुद्दे