IOS या macOS पर सक्रिय इंटरनेट कनेक्शन की जांच कैसे करें?


1324

मैं यह देखने के लिए जांच करना चाहूंगा कि क्या मेरे पास कोको टच पुस्तकालयों का उपयोग करके आईओएस पर या कोकोआ लाइब्रेरी का उपयोग करके मैकओएस पर इंटरनेट कनेक्शन है या नहीं ।

मैं एक का उपयोग कर यह करने के लिए एक तरीका के साथ आया था NSURL। जिस तरह से मैंने किया वह थोड़ा अविश्वसनीय लगता है (क्योंकि Google एक दिन भी डाउन हो सकता है और किसी थर्ड पार्टी पर निर्भर होना बुरा लगता है), और जब मैं Google का जवाब नहीं देता तो कुछ अन्य वेबसाइटों से प्रतिक्रिया देखने के लिए जाँच कर सकता था, यह बेकार और मेरे आवेदन पर एक अनावश्यक उपरि लगता है।

- (BOOL) connectedToInternet
{
    NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
    return ( URLString != NULL ) ? YES : NO;
}

क्या मैंने बुरा किया है, ( stringWithContentsOfURLआईओएस 3.0 और मैकओएस 10.4 में उल्लेखित नहीं है) और यदि हां, तो इसे पूरा करने का एक बेहतर तरीका क्या है?


11
बल्कि return (BOOL)URLString;, या इससे भी बेहतर, return !!URLStringयाreturn URLString != nil

3
मुझे नहीं पता कि आपका उपयोग मामला क्या है, लेकिन यदि आप अनुरोध को आजमाना और कनेक्शन की कमी जैसे किसी भी त्रुटि को संभालना बेहतर कर सकते हैं। यदि आप ऐसा नहीं कर सकते, तो इस मामले में यहाँ बहुत अच्छी सलाह है।
SK9

2
आपका समाधान चतुर है, और मैं इसे पसंद करता हूं। आप NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://twitter.com/getibox"] encoding:NSUTF8StringEncoding error:nil];कष्टप्रद चेतावनी से छुटकारा पाने के लिए भी उपयोग कर सकते हैं ।
अब्देल्रहमान ईद

4
नीचे दिए गए लिंक से Reachability वर्ग का उपयोग करने का प्रयास करें, यह आपके लिए काम करेगा github.com/tonymillion/Reachability
Dhaval H. Nena

4
हाल ही में इस जवाब को खोजने वालों के लिए: stackoverflow.com/a/8813279
afollestad

जवाबों:


1284

महत्वपूर्ण : इस चेक को हमेशा एसिंक्रोनस रूप से किया जाना चाहिए । नीचे दिए गए अधिकांश उत्तर समकालिक हैं इसलिए सावधान रहें अन्यथा आप अपने ऐप को फ्रीज कर देंगे।


तीव्र

1) कोकोआपोड्स या कार्थेज के माध्यम से स्थापित करें: https://github.com/ashleymills/Reachability.orift

2) क्लोजर के माध्यम से परीक्षण की पुनरावृत्ति

let reachability = Reachability()!

reachability.whenReachable = { reachability in
    if reachability.connection == .wifi {
        print("Reachable via WiFi")
    } else {
        print("Reachable via Cellular")
    }
}

reachability.whenUnreachable = { _ in
    print("Not reachable")
}

do {
    try reachability.startNotifier()
} catch {
    print("Unable to start notifier")
}

उद्देश्य सी

1) SystemConfigurationपरियोजना में रूपरेखा जोड़ें , लेकिन इसके बारे में कहीं भी चिंता न करें

2) प्रोजेक्ट में Reachability.hऔर Reachability.m(यहाँ पाया गया: https://github.com/tonymillion/Reachability ) टोनी मिलियन का संस्करण जोड़ें

3) इंटरफ़ेस सेक्शन को अपडेट करें

#import "Reachability.h"

// Add this to the interface in the .m file of your view controller
@interface MyViewController ()
{
    Reachability *internetReachableFoo;
}
@end

4) फिर इस विधि को अपने व्यू कंट्रोलर की .m फाइल में लागू करें जिसे आप कॉल कर सकते हैं

// Checks if we have an internet connection or not
- (void)testInternetConnection
{   
    internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];

    // Internet is reachable
    internetReachableFoo.reachableBlock = ^(Reachability*reach)
    {
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"Yayyy, we have the interwebs!");
        });
    };

    // Internet is not reachable
    internetReachableFoo.unreachableBlock = ^(Reachability*reach)
    {
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"Someone broke the internet :(");
        });
    };

    [internetReachableFoo startNotifier];
}

महत्वपूर्ण नोट:Reachability ताकि आप अन्य परियोजनाओं के साथ संघर्ष के नामकरण में आ सकते हैं वर्ग परियोजनाओं में सबसे अधिक इस्तेमाल किया वर्गों में से एक है। यदि ऐसा होता है, तो आप के जोड़े में से एक का नाम बदलने का होगा Reachability.hऔर Reachability.mइस मुद्दे को हल करने के लिए कुछ और करने के लिए फ़ाइलों।

नोट: आपके द्वारा उपयोग किया जाने वाला डोमेन कोई मायने नहीं रखता। यह किसी भी डोमेन के प्रवेश द्वार के लिए परीक्षण कर रहा है।


4
@gonzobrains: आपके द्वारा उपयोग किया जाने वाला डोमेन कोई मायने नहीं रखता। यह किसी भी डोमेन के प्रवेश द्वार के लिए परीक्षण कर रहा है ।
इवासब्रोब

3
@KanDedeoglu यह केवल एक उदाहरण है, जो भी डोमेन आप चाहते हैं उसका उपयोग करें। यह बस इंटरनेट के लिए एक प्रवेश द्वार की जाँच करता है, यह नहीं कि डोमेन वास्तव में उपलब्ध है।
'16:04 पर Iasasrobed

1
ओह, btw आप SystemConfiguration.frameworkइस परियोजना के लिए भी जोड़ने की जरूरत है (विधि 1 के लिए)।
वारिंदी

2
Google.com के बजाय www.appleiphonecell.com का उपयोग करें - यह url इसी कारण से Apple द्वारा बनाया गया था।
स्माइकी

1
Www.appleiphonecell.com का उपयोग अब (2018) एक बुरा विकल्प है। यह अब Apple.com पर रीडायरेक्ट करता है जो एक> 40kB html फाइल है। Google.com पर वापस - यह केवल 11kB है। BTW google.com/m समान आकार का है लेकिन 120 मिसे द्वारा धीमा होने की सूचना है।
BlueskyMed

310

मैं चीजों को सरल रखना पसंद करता हूं। जिस तरह से मैं यह कर रहा हूँ:

//Class.h
#import "Reachability.h"
#import <SystemConfiguration/SystemConfiguration.h>

- (BOOL)connected;

//Class.m
- (BOOL)connected
{
    Reachability *reachability = [Reachability reachabilityForInternetConnection];
    NetworkStatus networkStatus = [reachability currentReachabilityStatus];
    return networkStatus != NotReachable;
}

फिर, जब भी मेरा कनेक्शन हो, मैं यह देखना चाहता हूं कि मैं इसका उपयोग करूं:

if (![self connected]) {
    // Not connected
} else {
    // Connected. Do some Internet stuff
}

सामान करने के लिए यह विधि परिवर्तित नेटवर्क स्थितियों की प्रतीक्षा नहीं करती है। यह सिर्फ उस स्थिति का परीक्षण करता है जब आप उससे पूछते हैं।


हाय @msec, आप इस पृष्ठ में एंड्रयू Zimmer समाधान की कोशिश कर सकते हैं, यह adsl डिस्कनेक्ट (और वाईफाई जुड़ा) के साथ ठीक काम करता है
Williew

1
उन लोगों के लिए जो उपरोक्त कोड के साथ बस कॉपी और पेस्ट करते हैं। इसके अलावा SystemConfiguration.framework मैन्युअल रूप से जोड़ें या आपको लिंकिंग त्रुटि मिलेगी।
इफ्तिखार अली अंसारी

अगर मैं वाईफाई से कनेक्ट करता हूं तो हमेशा पहुंच में आता है। वाईफाई का मतलब यह नहीं है कि यह इंटरनेट कनेक्शन है। मैं इंटरनेट कनेक्शन को सत्यापित करना चाहता हूं यहां तक ​​कि इसमें वाईफाई कनेक्टिविटी भी है। क्या तुम कृप्या मेरी मदद कर सकते हो?
वेस्ले

@wesley आपने इसे कैसे हल किया?
केसेलमे

145

Apple के रीचैबिलिटी कोड का उपयोग करते हुए, मैंने एक फ़ंक्शन बनाया जो बिना किसी वर्ग को शामिल किए बिना इसे सही ढंग से जांच करेगा।

अपने प्रोजेक्ट में SystemConfiguration.framework शामिल करें।

कुछ आयात करें:

#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>

अब बस इस फ़ंक्शन को कॉल करें:

/*
Connectivity testing code pulled from Apple's Reachability Example: https://developer.apple.com/library/content/samplecode/Reachability
 */
+(BOOL)hasConnectivity {
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
    if (reachability != NULL) {
        //NetworkStatus retVal = NotReachable;
        SCNetworkReachabilityFlags flags;
        if (SCNetworkReachabilityGetFlags(reachability, &flags)) {
            if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
            {
                // If target host is not reachable
                return NO;
            }

            if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
            {
                // If target host is reachable and no connection is required
                //  then we'll assume (for now) that your on Wi-Fi
                return YES;
            }


            if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
                 (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
            {
                // ... and the connection is on-demand (or on-traffic) if the
                //     calling application is using the CFSocketStream or higher APIs.

                if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
                {
                    // ... and no [user] intervention is needed
                    return YES;
                }
            }

            if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
            {
                // ... but WWAN connections are OK if the calling application
                //     is using the CFNetwork (CFSocketStream?) APIs.
                return YES;
            }
        }
    }

    return NO;
}

और यह iOS 5 आपके लिए परीक्षण किया गया है।


@JezenThomas यह एसिंक्रोनस रूप से इंटरनेट की जांच नहीं करता है, यही कारण है कि यह "बहुत स्लिमर" है ... आपको हमेशा इस एसिंक्रोनस को सूचनाओं की सदस्यता देकर करना चाहिए ताकि आप इस प्रक्रिया पर ऐप को लटका न दें।
इवासब्रोब

धन्यवाद, यह काम भले ही आप wifi adsl का उपयोग कर रहे हों और adsl जुड़ा नहीं है, ठीक वैसा ही है जैसा मुझे चाहिए।
विल्व

5
यह स्मृति लीक करती है - 'पठनीयता' संरचना (वस्तु, वस्तु) को CFRelease () के साथ मुक्त करने की आवश्यकता है।
रसेल मुल

@RussellMull ... कैसे रिसाव को ठीक करने के लिए कोई विचार?
I_raqz

अजीब है कि यह उत्तर मेरा (2 के द्वारा एक डुप्लिकेट के रूप में चिह्नित प्रश्न पर) पूर्वसूचक है, बिल्कुल मेरे जैसा ही है, लेकिन मैंने इसे आज तक कभी नहीं देखा।
आर्टऑफवर्फ

121

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


आप Apple के रीचैबिलिटी क्लास का उपयोग कर सकते हैं। वाई-फाई सक्षम होने पर यह भी जांचने की अनुमति देगा:

Reachability* reachability = [Reachability sharedReachability];
[reachability setHostName:@"www.example.com"];    // Set your host name here
NetworkStatus remoteHostStatus = [reachability remoteHostStatus];

if (remoteHostStatus == NotReachable) { }
else if (remoteHostStatus == ReachableViaWiFiNetwork) { }
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { }

Reachability वर्ग को SDK के साथ नहीं भेजा जाता है, बल्कि इस Apple नमूना अनुप्रयोग का एक हिस्सा है । बस इसे डाउनलोड करें, और अपने प्रोजेक्ट में Reachability.h / m कॉपी करें। इसके अलावा, आपको अपने प्रोजेक्ट में SystemConfiguration ढांचा जोड़ना होगा।


6
ऊपर दिए गए रीचैबिलिटी का उपयोग न करने के बारे में मेरी टिप्पणी देखें। इसे अतुल्यकालिक मोड में उपयोग करें और इसके द्वारा भेजे जाने वाले नोटिफिकेशन की सदस्यता लें - नहीं।
केंडल हेल्मसटेटर गेलनर

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

82

यहाँ एक बहुत ही सरल उत्तर है:

NSURL *scriptUrl = [NSURL URLWithString:@"http://www.google.com/m"];
NSData *data = [NSData dataWithContentsOfURL:scriptUrl];
if (data)
    NSLog(@"Device is connected to the Internet");
else
    NSLog(@"Device is not connected to the Internet");

URL को एक बहुत छोटी वेबसाइट की ओर इशारा करना चाहिए। मैं यहां Google की मोबाइल वेबसाइट का उपयोग करता हूं, लेकिन अगर मेरे पास एक विश्वसनीय वेब सर्वर था तो मैं अधिकतम गति के लिए इसमें केवल एक चरित्र के साथ एक छोटी फ़ाइल अपलोड करूंगा ।

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

सावधान: वेबसाइट लोड करते समय यह आपके धागे को संक्षेप में ब्लॉक करेगा। मेरे मामले में, यह कोई समस्या नहीं थी, लेकिन आपको इस पर विचार करना चाहिए (ब्रैड को इसे इंगित करने का श्रेय)।


10
मुझे वास्तव में यह विचार पसंद है, लेकिन मैं एक छोटे से प्रतिक्रिया आकार को बनाए रखते हुए 99.999% विश्वसनीयता के लिए कहूंगा, www.google.com/m के साथ जाएं जो कि Google के लिए मोबाइल दृश्य है।
रवालैंड

1
बहुत बढ़िया समाधान @ एरिक। जैसा कि रवाईलैंड ने कहा है कि मैं आपको www.google.com के बजाय www.google.com का उपयोग करने की सलाह देता हूं। यह अजीब है, लेकिन मेरे परीक्षण से मोबाइल संस्करण हमेशा www.google.com से लगभग 120ms अधिक लेता है
Sebyddd

4
Apple डॉक्स ऐसा नहीं करने की सलाह देते हैं क्योंकि यह एक धीमे नेटवर्क पर थ्रेड को ब्लॉक कर सकता है, जिससे आईओएस में ऐप समाप्त हो सकता है
ब्रैड थॉमस

सकारात्मक प्रतिक्रिया के लिए धन्यवाद, सहमत हूं कि विश्वसनीयता के कारण www.google.com/m सबसे अच्छा समाधान है!
एरिक

3
LOL, मुझे यकीन है कि Google आपकी सराहना करता है कि लोग इंटरनेट जाँच संसाधन के रूप में उनका उपयोग करते हैं।
mxcl

73

यहां बताया गया है कि मैं इसे अपने ऐप्स में कैसे करता हूं: जबकि 200 स्टेटस रिस्पॉन्स कोड कुछ भी गारंटी नहीं देता है, लेकिन यह मेरे लिए काफी स्थिर है। इसके लिए NSData के उत्तर के रूप में उतने लोडिंग की आवश्यकता नहीं है, जितना कि मेरा सिर्फ HEAD प्रतिक्रिया की जाँच करता है।

स्विफ्ट कोड

func checkInternet(flag:Bool, completionHandler:(internet:Bool) -> Void)
{
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    let url = NSURL(string: "http://www.google.com/")
    let request = NSMutableURLRequest(URL: url!)

    request.HTTPMethod = "HEAD"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
    request.timeoutInterval = 10.0

    NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.mainQueue(), completionHandler:
    {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        UIApplication.sharedApplication().networkActivityIndicatorVisible = false

        let rsp = response as! NSHTTPURLResponse?

        completionHandler(internet:rsp?.statusCode == 200)
    })
}

func yourMethod()
{
    self.checkInternet(false, completionHandler:
    {(internet:Bool) -> Void in

        if (internet)
        {
            // "Internet" aka Google URL reachable
        }
        else
        {
            // No "Internet" aka Google URL un-reachable
        }
    })
}

उद्देश्य-सी कोड

typedef void(^connection)(BOOL);

- (void)checkInternet:(connection)block
{
    NSURL *url = [NSURL URLWithString:@"http://www.google.com/"];
    NSMutableURLRequest *headRequest = [NSMutableURLRequest requestWithURL:url];
    headRequest.HTTPMethod = @"HEAD";

    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    defaultConfigObject.timeoutIntervalForResource = 10.0;
    defaultConfigObject.requestCachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;

    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];

    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:headRequest
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
        if (!error && response)
        {
            block([(NSHTTPURLResponse *)response statusCode] == 200);
        }
    }];
    [dataTask resume];
}

- (void)yourMethod
{
    [self checkInternet:^(BOOL internet)
    {
         if (internet)
         {
             // "Internet" aka Google URL reachable
         }
         else
         {
             // No "Internet" aka Google URL un-reachable
         }
    }];
}

3
ऐसा लगता है कि यह सबसे तेज़ तरीका है
पावेल

3
सावधानी: मेरे अनुभव में, यह समाधान हर समय काम नहीं करता है। कई मामलों में, प्रतिक्रिया मधुर समय लेने के बाद, वापसी 403 है। यह समाधान सही लग रहा था, लेकिन 100% परिणामों की गारंटी नहीं देता है।
मुस्तफा

10
जून 2014 तक, यह मुख्य भूमि चीन में विफल हो जाएगा, चीनी सरकार के कारण अब google.com को पूरी तरह से अवरुद्ध कर दिया जाएगा। (google.cn काम करता है, हालांकि, लेकिन मुख्य भूमि चीन में, कोई baidu.com, कोई इंटरनेट नहीं) संभवत: जो भी सर्वर आपसे संवाद करने की आवश्यकता है, उसे पिंग करने के लिए बेहतर है।
पूर्ववर्ती

4
इसके बजाय www.appleiphonecell.com का उपयोग करें - सेब ने इस कारण के लिए इस यूआरएल को बनाया है।
स्माइकी

1
मैंने Appleiphonecell का उपयोग किया है क्योंकि यह Apple का अपना है, चीन में भी इस्तेमाल किया जा सकता है, और यह बहुत तेज़ वेबसाइट है। यह, आपके उत्तर के साथ मिलकर मुझे निकटतम और सबसे तेज़ समाधान प्रदान करता है। धन्यवाद
सेप्टिक क्रोनिक

57

Apple विभिन्न प्रकार की नेटवर्क उपलब्धता के लिए जाँच करने के लिए नमूना कोड की आपूर्ति करता है । वैकल्पिक रूप से iPhone डेवलपर्स कुकबुक में एक उदाहरण है।

नोट: Apple के रीचबिलिटी कोड के उपयोग के संबंध में कृपया इस उत्तर पर @ KHG की टिप्पणी देखें।


धन्यवाद। मुझे पता चला कि 3.0 में Xcode दस्तावेज़ीकरण में स्रोत कोड भी शामिल है, जिसे दस्तावेज़ में "पुन: खोज" के लिए खोजा गया है।
ब्रुक वुल्फ

7
ध्यान दें कि Apple से रीचैबिलिटी नमूना कोड का नया संशोधन (09-08-09) अतुल्यकालिक है।
डैनियल हेपर

46

आप could Reachability( यहां उपलब्ध ) द्वारा उपयोग कर सकते हैं ।

#import "Reachability.h"

- (BOOL)networkConnection {
    return [[Reachability reachabilityWithHostName:@"www.google.com"] currentReachabilityStatus];
}

if ([self networkConnection] == NotReachable) { /* No Network */ } else { /* Network */ } //Use ReachableViaWiFi / ReachableViaWWAN to get the type of connection.

@Supertecnoboff नहीं, यह async है।
अलेक्जेंडर अज़ीज़ी

39

Apple एक नमूना ऐप प्रदान करता है जो बिल्कुल ऐसा करता है:

गम्यता


7
आपको ध्यान देना चाहिए कि रीचैबिलिटी सैंपल केवल यह पता लगाता है कि कौन से इंटरफेस सक्रिय हैं, लेकिन वे नहीं जिनके पास इंटरनेट से वैध कनेक्शन है। जब भी सब कुछ जाने के लिए तैयार हो जाता है, तो एप्लिकेशन को शालीनता से असफलता को संभालना चाहिए।
रैप्ट्रीच

3.0 में खुशी से स्थिति बहुत बेहतर है, क्योंकि सिस्टम लॉक डाउन वाईफाई के पीछे उपयोगकर्ताओं के लिए एक लॉगिन पृष्ठ प्रस्तुत करेगा, जहां आपको उपयोग करने के लिए लॉगिन करना होगा ... आप मैन्युअल रूप से रीडायरेक्ट के लिए जांच करने के लिए उपयोग करते हैं (और आप अभी भी करते हैं अगर 2.2.1 एप्स का विकास हो रहा है)
केंडल हेल्मसटेटर गेलर

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

टूटी हुई लिंक !, अगर यह जाँच / तय की जा सकती है, तो बहुत धन्यवाद
Heider Sati

33

केवल रीचैबिलिटी क्लास को अपडेट किया गया है। अब आप उपयोग कर सकते हैं:

Reachability* reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

if (remoteHostStatus == NotReachable) { NSLog(@"not reachable");}
else if (remoteHostStatus == ReachableViaWWAN) { NSLog(@"reachable via wwan");}
else if (remoteHostStatus == ReachableViaWiFi) { NSLog(@"reachable via wifi");}

1
जब तक 4.0 जारी होने के बाद कुछ बदला नहीं गया, तब तक वह कोड अतुल्यकालिक नहीं है और आपको क्रैश रिपोर्ट में यह दिखाने की गारंटी है - मेरे साथ पहले भी हुआ था।
bpapa

1
मैं bpapa से सहमत हूँ। सिंक्रोनस कोड का उपयोग करना अच्छा विचार नहीं है। हालांकि जानकारी के लिए धन्यवाद
Brock Woolf



22

यदि आप उपयोग कर रहे हैं AFNetworking स्थिति के लिए अपने स्वयं के कार्यान्वयन कर सकते हैं।

उपयोग करने का सबसे अच्छा तरीका AFNetworking उपवर्ग हैAFHTTPClient वर्ग वर्ग करना और अपने नेटवर्क कनेक्शन करने के लिए इस वर्ग का उपयोग करना है।

इस दृष्टिकोण का उपयोग करने के फायदों में से एक यह है कि आप blocksरीचैबिलिटी स्टेटस बदलने पर वांछित व्यवहार सेट करने के लिए उपयोग कर सकते हैं । यह मानते हुए कि मैंने नाम के एक सिंगलटन उपवर्ग AFHTTPClient(जैसा कि "सबक्लासिंग नोट्स" AFNetworking डॉक्स पर कहा है ) के रूप में बनाया है BKHTTPClient, मैं कुछ ऐसा करूंगा:

BKHTTPClient *httpClient = [BKHTTPClient sharedClient];
[httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
{
    if (status == AFNetworkReachabilityStatusNotReachable) 
    {
    // Not reachable
    }
    else
    {
        // Reachable
    }
}];

आप वाई-फाई या डब्ल्यूएलएएन कनेक्शनों के लिए विशेष रूप से AFNetworkReachabilityStatusReachableViaWWANऔर AFNetworkReachabilityStatusReachableViaWiFiएनमों का उपयोग करके ( यहां अधिक ) जांच कर सकते हैं।


18

मैंने इस चर्चा में कोड का उपयोग किया है , और यह ठीक काम करने लगता है ( पूरा पढ़ें धागा !)।

मैंने इसे हर तरह के बोधगम्य कनेक्शन (जैसे तदर्थ वाई-फाई) के साथ नहीं दिया है।


यह कोड पूरी तरह से अच्छा नहीं है क्योंकि यह सिर्फ यह देखने के लिए जाँचता है कि क्या आपके पास एक रूटर के साथ वाईफाई कनेक्शन है, न कि अगर वेब तक पहुंचा जा सकता है। आप वाईफाई काम कर सकते हैं और वेब तक पहुंचने में सक्षम बना सकते हैं।
DuckDucking

15

बहुत सरल .... इन चरणों का प्रयास करें:

चरण 1:SystemConfiguration अपनी परियोजना में रूपरेखा जोड़ें ।


चरण 2: अपनी headerफ़ाइल में निम्न कोड आयात करें ।

#import <SystemConfiguration/SystemConfiguration.h>

चरण 3: निम्नलिखित विधि का उपयोग करें

  • श्रेणी 1:

    - (BOOL) currentNetworkStatus {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        BOOL connected;
        BOOL isConnected;
        const char *host = "www.apple.com";
        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host);
        SCNetworkReachabilityFlags flags;
        connected = SCNetworkReachabilityGetFlags(reachability, &flags);
        isConnected = NO;
        isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
        CFRelease(reachability);
        return isConnected;
    }

  • टाइप 2:

    आयात हेडर :#import "Reachability.h"

    - (BOOL)currentNetworkStatus
    {
        Reachability *reachability = [Reachability reachabilityForInternetConnection];
        NetworkStatus networkStatus = [reachability currentReachabilityStatus];
        return networkStatus != NotReachable;
    }

चरण 4: कैसे उपयोग करें:

- (void)CheckInternet
{
    BOOL network = [self currentNetworkStatus];
    if (network)
    {
        NSLog(@"Network Available");
    }
    else
    {
        NSLog(@"No Network Available");
    }
}

क्या टाइप 1 अतुल्यकालिक है?
सुपरटेकनोफॉफ़

मुझे आपके उत्तर से टाइप 2 फिक्स चाहिए। मैंने रीचबिलिटी क्लासेस को जोड़ा है और मैंने आपके उत्तर के ऊपर का उपयोग करके कनेक्शन सत्यापन की जांच करने की कोशिश की है। वाईफाई से कनेक्ट होने पर भी यह हमेशा उपलब्ध रहता है, लेकिन इसमें इंटरनेट कनेक्शन नहीं है। वाईफाई का मतलब यह नहीं है कि यह इंटरनेट कनेक्शन है। मैं इंटरनेट कनेक्शन को सत्यापित करना चाहता हूं यहां तक ​​कि इसमें वाईफाई कनेक्टिविटी भी है। क्या तुम कृप्या मेरी मदद कर सकते हो?
वेस्ले

12
-(void)newtworkType {

 NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@"statusBar"] valueForKey:@"foregroundView"]subviews];
NSNumber *dataNetworkItemView = nil;

for (id subview in subviews) {
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
        dataNetworkItemView = subview;
        break;
    }
}


switch ([[dataNetworkItemView valueForKey:@"dataNetworkType"]integerValue]) {
    case 0:
        NSLog(@"No wifi or cellular");
        break;

    case 1:
        NSLog(@"2G");
        break;

    case 2:
        NSLog(@"3G");
        break;

    case 3:
        NSLog(@"4G");
        break;

    case 4:
        NSLog(@"LTE");
        break;

    case 5:
        NSLog(@"Wifi");
        break;


    default:
        break;
}
}

7
भले ही डिवाइस Wifi या किसी अन्य नेटवर्क प्रकार से जुड़ा हो, फिर भी इंटरनेट कनेक्शन अनुपलब्ध हो सकता है। सरल परीक्षण: अपने घर वाईफाई से कनेक्ट करें और फिर अपने केबल मॉडेम को अनप्लग करें। अभी भी वाईफाई से जुड़ा है, लेकिन शून्य इंटरनेट।
Iasrobrob

11
- (void)viewWillAppear:(BOOL)animated
{
    NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];

    return (URL != NULL ) ? YES : NO;
}

या रीचैबिलिटी क्लास का उपयोग करें ।

IPhone एसडीके का उपयोग करके इंटरनेट उपलब्धता की जांच करने के दो तरीके हैं:

1. जांचें कि Google पृष्ठ खोला गया है या नहीं।

2. रीचैबिलिटी क्लास

अधिक जानकारी के लिए, कृपया रीचैबिलिटी (Apple डेवलपर) देखें।


1
IPhone एसडीके 1 में इंटरनेट की उपलब्धता की जांच करने के दो तरीके हैं) Google पृष्ठ खोला गया है या नहीं, इसकी जांच करें।
IOS रॉक्स

1
-1: यह एक सिंक्रोनस विधि है जो मुख्य थ्रेड को ब्लॉक करेगी (वह है जिसे ऐप यूआई को बदल दिया जाता है) जबकि यह google.com से कनेक्ट करने का प्रयास करता है। यदि आपका उपयोगकर्ता बहुत धीमे डेटा कनेक्शन पर है, तो फ़ोन कार्य करेगा जैसे प्रक्रिया अप्रतिसादी है।
२३


10

पहला : CFNetwork.frameworkढांचे में जोड़ें

कोड :ViewController.m

#import "Reachability.h"

- (void)viewWillAppear:(BOOL)animated
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];

    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
    {
        /// Create an alert if connection doesn't work
        UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection"   message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [myAlert show];
        [myAlert release];
    }
    else
    {
         NSLog(@"INTERNET IS CONNECT");
    }
}

8

सबसे पहले reachability वर्ग डाउनलोड करें और अपने Xcode में reachability.h और reachabilty.m फ़ाइल डालें ।

सबसे अच्छा तरीका है कि आप एक सामान्य फ़ंक्शंस क्लास (NSObject) बनाएं ताकि आप इसे किसी भी क्लास में इस्तेमाल कर सकें। ये एक नेटवर्क कनेक्शन पुनः जाँच क्षमता के लिए दो तरीके हैं:

+(BOOL) reachabiltyCheck
{
    NSLog(@"reachabiltyCheck");
    BOOL status =YES;
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(reachabilityChanged:)
                                          name:kReachabilityChangedNotification
                                          object:nil];
    Reachability * reach = [Reachability reachabilityForInternetConnection];
    NSLog(@"status : %d",[reach currentReachabilityStatus]);
    if([reach currentReachabilityStatus]==0)
    {
        status = NO;
        NSLog(@"network not connected");
    }
    reach.reachableBlock = ^(Reachability * reachability)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    };
    reach.unreachableBlock = ^(Reachability * reachability)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    };
    [reach startNotifier];
    return status;
}

+(BOOL)reachabilityChanged:(NSNotification*)note
{
    BOOL status =YES;
    NSLog(@"reachabilityChanged");
    Reachability * reach = [note object];
    NetworkStatus netStatus = [reach currentReachabilityStatus];
    switch (netStatus)
    {
        case NotReachable:
            {
                status = NO;
                NSLog(@"Not Reachable");
            }
            break;

        default:
            {
                if (!isSyncingReportPulseFlag)
                {
                    status = YES;
                    isSyncingReportPulseFlag = TRUE;
                    [DatabaseHandler checkForFailedReportStatusAndReSync];
                }
            }
            break;
    }
    return status;
}

+ (BOOL) connectedToNetwork
{
    // Create zero addy
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);
    if (!didRetrieveFlags)
    {
        NSLog(@"Error. Could not recover network reachability flags");
        return NO;
    }
    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
    BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
    NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"];
    NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
    NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self];
    return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;
}

अब आप इस वर्ग विधि को कॉल करके किसी भी वर्ग में नेटवर्क कनेक्शन की जांच कर सकते हैं।


8

IPhone एसडीके का उपयोग करके इंटरनेट कनेक्शन की जांच करने के लिए एक और तरीका भी है।

नेटवर्क कनेक्शन के लिए निम्न कोड लागू करने का प्रयास करें।

#import <SystemConfiguration/SystemConfiguration.h>
#include <netdb.h>

/**
     Checking for network availability. It returns
     YES if the network is available.
*/
+ (BOOL) connectedToNetwork
{

    // Create zero addy
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability =
        SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;

    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);

    if (!didRetrieveFlags)
    {
        printf("Error. Could not recover network reachability flags\n");
        return NO;
    }

    BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
    BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);

    return (isReachable && !needsConnection) ? YES : NO;
}


8
  1. रीचबिलिटी फ़ाइल, https://gist.github.com/darkseed/1182373 डाउनलोड करें

  2. और CFNetwork.frameworkफ्रेमवर्क में 'SystemConfiguration.framework' जोड़ें और

  3. #Import "Reachability.h" करें


पहला : CFNetwork.frameworkढांचे में जोड़ें

कोड :ViewController.m

- (void)viewWillAppear:(BOOL)animated
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];

    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
    {
        /// Create an alert if connection doesn't work
        UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection"   message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [myAlert show];
        [myAlert release];
    }
    else
    {
         NSLog(@"INTERNET IS CONNECT");
    }
}

8

स्विफ्ट 3 / स्विफ्ट 4

आपको पहले आयात करना होगा

import SystemConfiguration

आप निम्न विधि से इंटरनेट कनेक्शन की जांच कर सकते हैं

func isConnectedToNetwork() -> Bool {

    var zeroAddress = sockaddr_in()
    zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
    zeroAddress.sin_family = sa_family_t(AF_INET)

    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
        $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
            SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
        }
    }

    var flags = SCNetworkReachabilityFlags()
    if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
        return false
    }
    let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
    let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
    return (isReachable && !needsConnection)

}

7

गम्यता वर्ग जानने के लिए कि इंटरनेट कनेक्शन के लिए एक उपकरण के लिए है या नहीं उपलब्ध है ठीक है ...

लेकिन एक इंट्रानेट संसाधन तक पहुंचने के मामले में :

रीचैबिलिटी क्लास के साथ इंट्रानेट सर्वर को पिंग करना हमेशा सही होता है।

तो इस परिदृश्य में एक त्वरित समाधान एक वेब विधि बनाने के लिए होगा pingmeजो सेवा पर अन्य वेबमिथोड्स के साथ कहा जाता है । pingmeकुछ लौटना चाहिए।

इसलिए मैंने सामान्य कार्यों पर निम्नलिखित विधि लिखी

-(BOOL)PingServiceServer
{
    NSURL *url=[NSURL URLWithString:@"http://www.serveraddress/service.asmx/Ping"];

    NSMutableURLRequest *urlReq=[NSMutableURLRequest requestWithURL:url];

    [urlReq setTimeoutInterval:10];

    NSURLResponse *response;

    NSError *error = nil;

    NSData *receivedData = [NSURLConnection sendSynchronousRequest:urlReq
                                                 returningResponse:&response
                                                             error:&error];
    NSLog(@"receivedData:%@",receivedData);

    if (receivedData !=nil)
    {
        return YES;
    }
    else
    {
        NSLog(@"Data is null");
        return NO;
    }
}

उपरोक्त विधि मेरे लिए बहुत उपयोगी थी, इसलिए जब भी मैं सर्वर पर कुछ डेटा भेजने की कोशिश करता हूं तो मैं हमेशा इस कम समय वाले URLRequest का उपयोग करके अपने इंट्रानेट संसाधन की पुनरावृत्ति की जांच करता हूं।


7

ऐसा करना अपने आप में बेहद सरल है। निम्नलिखित विधि काम करेगी। बस होस्टनाम प्रोटोकॉल जैसे एचटीटीपी, एचटीटीपीएस आदि को नाम के साथ पारित करने की अनुमति न दें।

-(BOOL)hasInternetConnection:(NSString*)urlAddress
{
    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [urlAddress UTF8String]);
    SCNetworkReachabilityFlags flags;
    if (!SCNetworkReachabilityGetFlags(ref, &flags))
    {
        return NO;
    }
    return flags & kSCNetworkReachabilityFlagsReachable;
}

यह जल्दी सरल और दर्द रहित है।



7

मुझे लगता है कि यह सबसे अच्छा जवाब है।

"हाँ" का अर्थ है जुड़ा हुआ। "नहीं" का अर्थ है काट दिया गया।

#import "Reachability.h"

 - (BOOL)canAccessInternet
{
    Reachability *IsReachable = [Reachability reachabilityForInternetConnection];
    NetworkStatus internetStats = [IsReachable currentReachabilityStatus];

    if (internetStats == NotReachable)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}

6

कनेक्टिविटी को जांचने के लिए Reachable.hअपने में आयात वर्ग ViewController, और निम्न कोड का उपयोग करें :

     #define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
     if (hasInternetConnection){
           // To-do block
     }

आपका जवाब बिल्कुल वही है जो मैं खोज रहा हूं। आप सर एक वोट के हकदार हैं XD
निकेल Arteta

अगर आप बिना इंटरनेट के वाईफाई से जुड़े हैं तो काम नहीं करता।
केसेलमे

6
  • चरण 1: अपने प्रोजेक्ट में रीचैबिलिटी क्लास जोड़ें।
  • चरण 2: रीचैबिलिटी क्लास का आयात करें
  • चरण 3: नीचे फ़ंक्शन बनाएँ

    - (BOOL)checkNetConnection {
        self.internetReachability = [Reachability reachabilityForInternetConnection];
        [self.internetReachability startNotifier];
        NetworkStatus netStatus = [self.internetReachability currentReachabilityStatus];
        switch (netStatus) {
            case NotReachable:
            {
                return NO;
            }
    
            case ReachableViaWWAN:
            {
                 return YES;
            }
    
            case ReachableViaWiFi:
            {
                 return YES;
            }
        }
    }
  • चरण 4: नीचे दिए गए फ़ंक्शन को कॉल करें:

    if (![self checkNetConnection]) {
        [GlobalFunctions showAlert:@""
                         message:@"Please connect to the Internet!"
                         canBtntitle:nil
                         otherBtnTitle:@"Ok"];
        return;
    }
    else
    {
        Log.v("internet is connected","ok");
    }

Apple के डॉक्स यह नोट करते हैं: यदि आप किसी विशेष होस्ट से कनेक्ट कर सकते हैं, तो रीचबिलिटी आपके एप्लिकेशन को नहीं बता सकती, केवल यह कि एक इंटरफ़ेस उपलब्ध है जो कनेक्शन की अनुमति दे सकता है, और क्या वह इंटरफ़ेस WWAN है।
noobsmcgoobs
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.