IOS पर इंटरनेट कनेक्शन का पता लगाने का सबसे आसान तरीका?


147

मुझे पता है कि यह प्रश्न कई अन्य लोगों के लिए एक धोखा होगा, हालांकि, मुझे नहीं लगता कि सरल मामला यहां अच्छी तरह से समझाया गया है। एंड्रॉइड और ब्लैकबेरी पृष्ठभूमि से आ रहा है, HTTPUrlConnectionअगर कोई कनेक्शन उपलब्ध नहीं है, तो तुरंत के माध्यम से अनुरोध करना विफल हो जाता है। यह पूरी तरह से समझदार व्यवहार की तरह लगता है, और मुझे आश्चर्य NSURLConnectionथा कि आईओएस में इसे अनुकरण नहीं किया गया था।

मैं समझता हूं कि Apple (और अन्य जिन्होंने इसे बढ़ाया है) Reachabilityनेटवर्क राज्य का निर्धारण करने में सहायता करने के लिए एक वर्ग प्रदान करते हैं । मुझे यह देखकर पहली बार खुशी हुई और पूरी तरह से कुछ देखने की उम्मीद थी bool isNetworkAvailable(), लेकिन मेरे आश्चर्य के बजाय मुझे एक जटिल प्रणाली मिली, जिसमें अधिसूचना पंजीकरण और कॉलबैक और आवश्यक अनावश्यक विवरणों का एक समूह था। इसके लिए अवश्य ही एक बेहतर तरीका होना चाहिए। '

मेरा ऐप पहले से ही बिना किसी कनेक्टिविटी सहित कनेक्शन विफलता को संभालता है। उपयोगकर्ता को विफलता के बारे में सूचित किया जाता है, और ऐप चलता रहता है।

इस प्रकार मेरी आवश्यकताएं सरल हैं: एकल, सिंक्रोनस फ़ंक्शन मैं यह निर्धारित करने के लिए सभी HTTP अनुरोधों से पहले कॉल कर सकता हूं कि क्या मुझे वास्तव में अनुरोध भेजने या न करने के लिए परेशान करना चाहिए। आदर्श रूप से इसके लिए सेट अप की आवश्यकता नहीं है और बस एक बूलियन देता है।

क्या यह वास्तव में आईओएस पर संभव नहीं है?



आपको हर HTTP रिक्वेस्ट से पहले कभी भी सिंक्रोनस नेटवर्क रीचैबिलिटी विधि नहीं कहनी चाहिए; यह उस तरह का काम करने के लिए पागल है जब तक कि पुनरावर्तनीयता यह नहीं बताती है कि नेटवर्क की स्थिति में बदलाव था और फिर आप HTTP अनुरोध भेजने के लिए नहीं चुन सकते हैं। यह भी पूरे कारण से समय-समय पर मौजूद है (और फिर आपको उस परिदृश्य को इनायत से संभालना चाहिए)। ऊपर दिए गए लिंक को इस प्रकार देखें
iwasrobbed

जवाबों:


251

मैंने थोड़ा और शोध किया और मैं अपने उत्तर को अधिक वर्तमान समाधान के साथ अपडेट कर रहा हूं। मुझे यकीन नहीं है कि आप पहले से ही इसे देख चुके हैं लेकिन Apple द्वारा प्रदान किया गया एक अच्छा नमूना कोड है।

यहां सैंपल कोड डाउनलोड करें

अपने प्रोजेक्ट में Reachability.h और Reachability.m फ़ाइलों को शामिल करें। ReachabilityAppDelegate.m पर एक नज़र डालें कि कैसे मेजबान पुनराचार्यता, वाईफाई द्वारा पुनरावृत्ति निर्धारित करने के लिए एक उदाहरण देखें, WWAN इत्यादि द्वारा। नेटवर्क रीचबिलिटी की बहुत ही सरल जाँच के लिए, आप कुछ इस तरह से कर सकते हैं।

Reachability *networkReachability = [Reachability reachabilityForInternetConnection];   
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];    
if (networkStatus == NotReachable) {        
    NSLog(@"There IS NO internet connection");        
} else {        
     NSLog(@"There IS internet connection");        
}

@ बेंजामिनपिट्टे: अपने प्रोजेक्ट में SystemConfiguration.framework जोड़ना न भूलें।


46
अपने प्रोजेक्ट में SystemConfiguration.framework जोड़ना न भूलें।
बेंजामिन पीटर

1
@ चंद्रू यह काम करता है। यह सबसे आसान और सबसे प्रभावी तरीका है जो मैं नेटवर्क कनेक्शन का पता लगाने के लिए देखता हूं। सरल और आसान!
S1U

3
इससे सावधान। मुझे लग रहा है कि नेटवर्क बहाल होने पर यह मज़बूती से काम नहीं करता है, कम से कम सिम्युलेटर में। मैं वाईफाई से लॉन्च करता हूं, और यह सही ढंग से कोई नेटवर्क उपलब्ध नहीं होने की रिपोर्ट करता है; लेकिन फिर मैं वाईफ़ाई को चालू करता हूं, और SCNetworkReachabilityGetFlags 0 पर वापस लौटना जारी रखता है, भले ही वास्तविक नेटवर्क क्वेरीज़ ठीक काम करें।
जो स्ट्रेट

2
मेरा मानना ​​है कि नीचे मेरा जवाब ( stackoverflow.com/a/26593728/557362 ) को कम काम (अन्य फ़ाइलों को डाउनलोड नहीं करना) की आवश्यकता है, लेकिन यह सिर्फ मेरी राय है।
गाइल्समिडलटन

3
ध्यान दें कि यह केवल आपको बताता है कि क्या विशिष्ट होस्ट के लिए कनेक्शन नियमित है । इसका मतलब यह नहीं है कि आप वास्तव में कनेक्ट करने में सक्षम हैं। उदाहरण: आप अपने iPhone की वाईफाई को अपने कैमरे की वाईफाई से कनेक्ट करते हैं। वाईफ़ाई एक डिफ़ॉल्ट गेटवे के साथ जुड़ा हुआ है: सभी होस्ट पुन: प्राप्य रिपोर्ट करेंगे। लेकिन वे वास्तव में नहीं हैं - कैमरा एक डेड-एंड कनेक्शन है।
xaphod

45

इस प्रकार के प्रश्न के लिए यह थ्रेड Google के शीर्ष परिणाम के रूप में देखकर, मुझे लगा कि मैं उस समाधान को प्रदान करूंगा जो मेरे लिए काम करता है। मैं पहले से ही AFNetworking का उपयोग कर रहा था , लेकिन खोज में यह पता नहीं चला कि अपने प्रोजेक्ट के माध्यम से AFNetworking के साथ इस कार्य को कैसे पूरा किया जाए।

आप क्या चाहते हैं AFNetworkingReachabilityManager

// -- Start monitoring network reachability (globally available) -- //
[[AFNetworkReachabilityManager sharedManager] startMonitoring];

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

    NSLog(@"Reachability changed: %@", AFStringFromNetworkReachabilityStatus(status));


    switch (status) {
        case AFNetworkReachabilityStatusReachableViaWWAN:
        case AFNetworkReachabilityStatusReachableViaWiFi:
            // -- Reachable -- //
            NSLog(@"Reachable");
            break;
        case AFNetworkReachabilityStatusNotReachable:
        default:
            // -- Not reachable -- //
            NSLog(@"Not Reachable");
            break;
    }

}];

आप पुनरावर्तन को एक बार परीक्षण करने के लिए निम्न का उपयोग कर सकते हैं (एक बार निगरानी शुरू हो गई है):

-(BOOL) isInternetReachable
{
    return [AFNetworkReachabilityManager sharedManager].reachable;
}

3
मैं AFNetworkReachabilityManagerप्रकाश में लाने के लिए upvott !
सेल्विन

उन लोगों के लिए जिनके लिए यह तुरंत स्पष्ट नहीं था: AFNetworking एक तृतीय-पक्ष लाइब्रेरी है।
अर्लोमेडिया

1
नेटवर्क पुनरावृत्ति एक नैदानिक ​​उपकरण है जिसका उपयोग यह समझने के लिए किया जा सकता है कि अनुरोध क्यों विफल हो सकता है। यह निर्धारित करने के लिए इस्तेमाल नहीं किया जाना चाहिए कि अनुरोध करने के लिए या नहीं। - यही प्रलेखन कहता है।
नोसोव पावेल

AFNetworkReachabilityManager.reachableकिसी प्रकार की समकालिक जाँच नहीं करता है। यह रिटर्न एक तार्किक या की reachableViaWWANऔरreachableViaWifi
जदोलन

40

बहुत देर से जवाब देने के लिए क्षमा करें, लेकिन मुझे आशा है कि यह उत्तर भविष्य में किसी की मदद कर सकता है।

निम्नलिखित एक छोटा देशी सी कोड स्निपेट है जो बिना किसी अतिरिक्त वर्ग के इंटरनेट कनेक्टिविटी की जांच कर सकता है।

निम्नलिखित शीर्ष लेख जोड़ें:

#include<unistd.h>
#include<netdb.h>

कोड:

-(BOOL)isNetworkAvailable
{
    char *hostname;
    struct hostent *hostinfo;
    hostname = "google.com";
    hostinfo = gethostbyname (hostname);
    if (hostinfo == NULL){
        NSLog(@"-> no connection!\n");
        return NO;
    }
    else{
        NSLog(@"-> connection established!\n");
        return YES;
    }
}

स्विफ्ट 3

func isConnectedToInternet() -> Bool {
    let hostname = "google.com"
    //let hostinfo = gethostbyname(hostname)
    let hostinfo = gethostbyname2(hostname, AF_INET6)//AF_INET6
    if hostinfo != nil {
        return true // internet available
      }
     return false // no internet
    }

3
Apple Reachability की तुलना में बहुत बेहतर काम करता है। लेकिन डॉक्स के अनुसार gethostbyname अप्रचलित है और आपको getaddrinfo का उपयोग करना चाहिए: संरचनात्मक addrinfo * res = NULL; int s = getaddrinfo ("apple.com", NULL, NULL, & res); bool network_ok = (s == 0 && res! = NULL); freeaddrinfo (रेस);
टर्शियम

1
हालाँकि इंटरनेट उपलब्धता के लिए google.com का उपयोग करना आम है, लेकिन यह ध्यान देने योग्य है कि यह कुछ देशों में अवरुद्ध है। एक बेहतर विकल्प yahoo.com या microsoft.com जैसी अधिक "सरकार के अनुकूल" कंपनियों से डोमेन होगा।
लौरेंट

8
@ लॉरेंट: सबसे अच्छा विकल्प उस सर्वर पते का उपयोग करना है जिससे आप डेटा का अनुरोध करने जा रहे हैं। यहाँ पर google.com केवल एक उदाहरण है।
प्रेषण

7
यह सिर्फ एक DNS खोज कर रहा है? यदि ऐसा है, तो कैश्ड डीएनएस परिणाम समारोह में यह विश्वास दिला सकता है कि नेटवर्क उपलब्ध है?
स्टीफन मूर

2
@ इसको एक लूप में चलाने से वायरलेस डेटा की खपत होगी, आप ऐसा नहीं करना चाहते।
अर्थ-मायने रखता है

31

मैं वर्तमान में इस सरल तुल्यकालिक विधि का उपयोग करता हूं जिसके लिए आपकी परियोजनाओं या प्रतिनिधियों में अतिरिक्त फ़ाइलों की आवश्यकता नहीं है।

आयात:

#import <SystemConfiguration/SCNetworkReachability.h>

इस विधि बनाएँ:

+(bool)isNetworkAvailable
{
    SCNetworkReachabilityFlags flags;
    SCNetworkReachabilityRef address;
    address = SCNetworkReachabilityCreateWithName(NULL, "www.apple.com" );
    Boolean success = SCNetworkReachabilityGetFlags(address, &flags);
    CFRelease(address);

    bool canReach = success
                    && !(flags & kSCNetworkReachabilityFlagsConnectionRequired)
                    && (flags & kSCNetworkReachabilityFlagsReachable);

    return canReach;
}

फिर, यदि आपने इसे एक में डाल दिया है MyNetworkClass:

if( [MyNetworkClass isNetworkAvailable] )
{
   // do something networky.
}

यदि आप सिम्युलेटर में परीक्षण कर रहे हैं, तो अपने मैक की वाईफाई को चालू और बंद करें, क्योंकि ऐसा प्रतीत होता है कि सिम्युलेटर फोन की सेटिंग को अनदेखा करेगा।

अपडेट करें:

  1. अंत में मैंने मुख्य धागे को अवरुद्ध करने से बचने के लिए थ्रेड / एसिंक्रोनस कॉलबैक का उपयोग किया; और नियमित रूप से फिर से परीक्षण करना ताकि मैं कैश्ड परिणाम का उपयोग कर सकूं - हालांकि आपको डेटा कनेक्शन को अनावश्यक रूप से खुले रखने से बचना चाहिए।

  2. जैसा कि @thunk ने बताया, उपयोग करने के लिए बेहतर URL हैं, जो Apple खुद उपयोग करता है। http://cadinc.com/blog/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network


1
धन्यवाद, और इस धागे में अन्य लोगों के समान: अपने प्रोजेक्ट में SystemConfiguration.framework जोड़ना न भूलें।
निकल गया

1
अपने Xcode प्रोजेक्ट में अजीब, मुझे SystemConfiguration.framework को जोड़ना नहीं था। मुझे SpriteKit, UIKit, StoreKit, Foundation और CoreGraphics मिल गए हैं, लेकिन SystemConfiguration नहीं .... क्या कुछ निहित समावेश चल रहा है?
गाइल्समिडलटन

3
यह मेरे लिए काम करता है, लेकिन जब मैंने इसे वाई-फाई नेटवर्क से जोड़ा था, जिसमें कोई इंटरनेट कनेक्शन नहीं था, तो इसने लगभग 30 सेकंड के लिए मेरे यूआई को लॉक कर दिया। उस स्थिति में एक अतुल्यकालिक दृष्टिकोण की आवश्यकता होती है।
अर्लोमेडिया

2
www.apple.comबड़ी वेबसाइट है ... बेहतर विकल्प होगाwww.google.com
फहीम पारकर

2
शानदार जवाब! एक सुझाव: परीक्षण URL, www.appleiphonecell.comइस उद्देश्य के लिए सख्ती से उपलब्ध है और स्पष्ट रूप से चीन में अवरुद्ध नहीं है।
thunk

11

यह संभव है और यह वास्तव में सरल है यदि आप कार्यान्वयन को पूरा करते समय इसे देखते हैं, जो फिर से है - बहुत सरल है, केवल आवश्यक वस्तुओं के लिए आपको दो बूलियन चर हैं: इंटरनेट रीचबिलिटी और होस्ट रीचबिलिटी (आपको अक्सर इनमें से एक की आवश्यकता होती है )। एक बार जब आप अपने सहायक वर्ग को इकट्ठा कर सकते हैं जो कनेक्शन की स्थिति निर्धारित कर सकते हैं, तो आप वास्तव में इन प्रक्रियाओं को जानने के लिए आवश्यक कार्यान्वयन की फिर से परवाह नहीं करते हैं।

उदाहरण:

#import <Foundation/Foundation.h>

@class Reachability;

@interface ConnectionManager : NSObject {
    Reachability *internetReachable;
    Reachability *hostReachable;
}

@property BOOL internetActive;
@property BOOL hostActive;

- (void) checkNetworkStatus:(NSNotification *)notice;

@end

और .m फ़ाइल:

#import "ConnectionManager.h"
#import "Reachability.h"

@implementation ConnectionManager
@synthesize internetActive, hostActive;

-(id)init {
    self = [super init];
    if(self) {

    }
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

    internetReachable = [[Reachability reachabilityForInternetConnection] retain];
    [internetReachable startNotifier];

    hostReachable = [[Reachability reachabilityWithHostName:@"www.apple.com"] retain];
    [hostReachable startNotifier];

    return self;
}

- (void) checkNetworkStatus:(NSNotification *)notice {
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)

    {
        case NotReachable:
        {
            NSLog(@"The internet is down.");
            self.internetActive = NO;

            break;

        }
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is working via WIFI.");
            self.internetActive = YES;

            break;

        }
        case ReachableViaWWAN:
        {
            NSLog(@"The internet is working via WWAN.");
            self.internetActive = YES;

            break;

        }
    }

    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus)

    {
        case NotReachable:
        {
            NSLog(@"A gateway to the host server is down.");
            self.hostActive = NO;

            break;

        }
        case ReachableViaWiFi:
        {
            NSLog(@"A gateway to the host server is working via WIFI.");
            self.hostActive = YES;

            break;

        }
        case ReachableViaWWAN:
        {
            NSLog(@"A gateway to the host server is working via WWAN.");
            self.hostActive = YES;

            break;

        }
    }

}

// If lower than SDK 5 : Otherwise, remove the observer as pleased.

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

@end

6

किसी ने पहले इसे एक सरल, पुन: प्रयोज्य तरीके से हल किया है। DDGReachability

संपादित करें: या tonymillion/Reachability


4

मैंने कोड निकाला और एक एकल विधि में डाल दिया, आशा है कि यह दूसरों की मदद करेगा।

#import <SystemConfiguration/SystemConfiguration.h>

#import <netinet/in.h>
#import <netinet6/in6.h>

...

- (BOOL)isInternetReachable
{    
    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);
    SCNetworkReachabilityFlags flags;

    if(reachability == NULL)
        return false;

    if (!(SCNetworkReachabilityGetFlags(reachability, &flags)))
        return false;

    if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
        // if target host is not reachable
        return false;


    BOOL isReachable = false;


    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
        isReachable = true;
    }


    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
            isReachable = true;
        }
    }

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


    return isReachable;


}

[A] आपने यह कोड कहाँ से निकाला? क्या आप स्रोत से लिंक पोस्ट कर सकते हैं? [ख] आपके निष्कर्षण कार्य के लिए बहुत बहुत धन्यवाद! मुझे जिस चीज की जरूरत थी। मैं खुद इस काम को करने वाला था।
बेसिल बोर्के

तो, ऐसा लगता है कि यह एकमात्र उत्तर है जो किसी भी दूरस्थ सर्वर (नों) की जांच नहीं करता है?
जैस्पर

MacOS पर यह परीक्षण करने वाले अन्य लोगों के लिए, ध्यान दें कि kSCNetworkReachabilityFlagsIsWWAN OS_IPHONE macOS नहीं है।
ज्योफकोप

4

मैं यहां स्वीकृत उत्तर का स्विफ्ट संस्करण लिख रहा हूं , अगर कोई इसे उपयोगी पाता है, तो कोड को स्विफ्ट 2 लिखा जाता है,

आप नमूना फ़ाइलों को नमूनाकोड से डाउनलोड कर सकते हैं

अपनी परियोजना में जोड़ें Reachability.hऔर Reachability.mफ़ाइल करें,

Bridging-Header.hयदि किसी को आपकी परियोजना के लिए कोई मौजूद नहीं है, तो अब फाइल बनाने की आवश्यकता होगी ।

अपनी Bridging-Header.hफ़ाइल के अंदर इस पंक्ति को जोड़ें:

#import "Reachability.h"

अब इंटरनेट कनेक्शन की जांच करने के लिए

static func isInternetAvailable() -> Bool {
    let networkReachability : Reachability = Reachability.reachabilityForInternetConnection()
    let networkStatus : NetworkStatus = networkReachability.currentReachabilityStatus()

    if networkStatus == NotReachable {
        print("No Internet")
        return false
    } else {
        print("Internet Available")
        return true
    }

}

3

मुझे लगता है कि यह मदद कर सकता है ..

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

if([AFNetworkReachabilityManager sharedManager].isReachable)
{
    NSLog(@"Network reachable");
}
else
{   
   NSLog(@"Network not reachable");
}

यह काम नहीं करता है यदि नेटवर्क इंटरफ़ेस नहीं बदला गया है और इंटरनेट कनेक्टिविटी खो गई है।
प्रत्यूष सोमैया

2

यदि आप पहले से ही अपने प्रोजेक्ट में AFNetworking कॉन्फ़िगर करते हैं तो आप यह भी कोशिश कर सकते हैं।

-(void)viewDidLoad{  // -- add connectivity notification --//
[[NSNotificationCenter defaultCenter ] addObserver:self selector:@selector(ReachabilityDidChangeNotification:) name:AFNetworkingReachabilityDidChangeNotification object:nil];}
-(void)ReachabilityDidChangeNotification:(NSNotification *)notify
{
// -- NSLog(@"Reachability changed: %@", AFStringFromNetworkReachabilityStatus(status));  -- //
NSDictionary *userInfo =[notif userInfo];
AFNetworkReachabilityStatus status= [[userInfo valueForKey:AFNetworkingReachabilityNotificationStatusItem] intValue];
switch (status)
{
    case AFNetworkReachabilityStatusReachableViaWWAN:
    case AFNetworkReachabilityStatusReachableViaWiFi:
        // -- Reachable -- //
// -- Do your stuff when internet connection is available -- //
        [self getLatestStuff];
        NSLog(@"Reachable");
        break;
    case AFNetworkReachabilityStatusNotReachable:
    default:
        // -- Not reachable -- //
        // -- Do your stuff for internet connection not available -- //
NSLog(@"Not Reachable");
        break;
}
}

1

यहां रिऐचबिलिटी का उपयोग किए बिना स्विफ्ट का उपयोग करके कनेक्टिविटी की जांच करने का एक अच्छा समाधान है। मैंने इसे इस ब्लॉग पर पाया ।

अपने प्रोजेक्ट में एक नई स्विफ्ट फ़ाइल बनाएं Network.swift(उदाहरण के लिए)। इस कोड को उस फ़ाइल के अंदर पेस्ट करें:

import Foundation

public class Network {

    class func isConnectedToNetwork()->Bool{

        var Status:Bool = false
        let url = NSURL(string: "http://google.com/")
        let request = NSMutableURLRequest(URL: url!)
        request.HTTPMethod = "HEAD"
        request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
        request.timeoutInterval = 10.0

        var response: NSURLResponse?

        var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: nil) as NSData?

        if let httpResponse = response as? NSHTTPURLResponse {
            if httpResponse.statusCode == 200 {
                Status = true
            }
        }

        return Status
    }
}

तब आप अपने प्रोजेक्ट में कहीं भी कनेक्टिविटी का उपयोग करके देख सकते हैं:

if Network.isConnectedToNetwork() == true {
    println("Internet connection OK")
} else {
    println("Internet connection FAILED")
}

0

संपादित करें: यह नेटवर्क URL के लिए काम नहीं करेगा (टिप्पणियां देखें)

IOS 5 के रूप में, एक नया NSURL उदाहरण विधि है:

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error

इसे उस वेबसाइट पर इंगित करें जिसकी आप परवाह करते हैं या इसे apple.com पर इंगित करते हैं; मुझे लगता है कि यह देखने के लिए नया एक-लाइन कॉल है कि क्या इंटरनेट आपके डिवाइस पर काम कर रहा है।


वास्तव में मेरे अपने परीक्षणों में यह हमेशा गलत होता है। डॉक्स स्थिति यह 4.x के लिए मामला है, लेकिन 5+ में यह काम करना चाहिए। YMMV
SG1

यह उस स्थिति के लिए काम नहीं करता है जिसे आप देख रहे हैं। देखें stackoverflow.com/questions/9266154/…
मीका हैनलाइन

7
इसका उपयोग फ़ाइल URL के लिए होता है, इंटरनेट URL के लिए नहीं।
विक्टर बोगदान

0

मैं भी उपलब्ध इंटरनेट जाँच विकल्पों से खुश नहीं था (यह मूल एपीआई क्यों नहीं है?!?)

मेरा अपना मुद्दा 100% पैकेट नुकसान के साथ था - जब कोई डिवाइस राउटर से जुड़ा होता है, लेकिन राउटर इंटरनेट से कनेक्ट नहीं होता है। पुनर्जीवन और अन्य लोग उम्र के लिए लटका देंगे। मैंने एक एसिंच टाइम-आउट जोड़कर इससे निपटने के लिए एक उपयोगिता एकल वर्ग बनाया। यह मेरे ऐप में ठीक काम करता है। आशा करता हूँ की ये काम करेगा। यहाँ github पर लिंक है:

https://github.com/fareast555/TFInternetChecker


0

(IOS) Xcode 8.2, स्विफ्ट 3.0 में इंटरनेट कनेक्शन की उपलब्धता की जाँच करना

यह नेटवर्क उपलब्धता की जाँच के लिए सरल विधि है। मैं इसे Swift 2.0 और यहाँ अंतिम कोड में अनुवाद करने में कामयाब रहा। मौजूदा Apple रीचैबिलिटी क्लास और अन्य थर्ड पार्टी लाइब्रेरी स्विफ्ट में अनुवाद करने के लिए बहुत जटिल लग रहे थे।

यह 3 जी और वाईफाई कनेक्शन दोनों के लिए काम करता है।

अपने प्रोजेक्ट बिल्डर में "SystemConfiguration.framework" को जोड़ना न भूलें।

//Create new swift class file Reachability in your project.

import SystemConfiguration

public class Reachability {
class 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)
   }
}

// Check network connectivity from anywhere in project by using this code.

if Reachability.isConnectedToNetwork() == true {
     print("Internet connection OK")
} else {
 print("Internet connection FAILED")
}

Xcode संस्करण 7.2 (7C68) के साथ, इस कोड में संकलक त्रुटियां हैं
डैनियल

@ डैनियल, इश्यू इशू करने के लिए धन्यवाद, इस वजह से असुरक्षित पॉइंटर्स के रूप में, स्विफ्ट 2 / एक्सकोड वहाँ सिंटैक्स को अपडेट कर रहा है, हमें उनका पालन करना चाहिए। मैंने उसी के लिए कोड अपडेट किया है। ty;)
विजे अवध

यदि आप एक वाई-फाई से जुड़े हैं, लेकिन इंटरनेट से कनेक्ट नहीं कर पा रहे हैं (एक गूगल पेज खोलें) तब भी यह पुन: प्राप्य के लिए सही है। यह गलत है।
19

0

टॉइमलाइन से प्रेरित स्विफ्ट में एप्पल के रीचबिलिटी के लिए रिप्लेसमेंट, फिर से लिखा गया : https://github.com/ashleymills/Reachability.swift

  1. फ़ाइल Reachability.swiftको अपनी परियोजना में छोड़ें । वैकल्पिक रूप से, कोकोआपोड्स या कार्थेज का उपयोग करें - परियोजना की README के स्थापना अनुभाग को देखें ।

  2. नेटवर्क कनेक्टिविटी के बारे में सूचनाएं प्राप्त करें:

    //declare this property where it won't go out of scope relative to your listener
    let reachability = Reachability()!
    
    reachability.whenReachable = { reachability in
        if reachability.isReachableViaWiFi {
            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")
    }

    और सूचनाएं रोकने के लिए

    reachability.stopNotifier()

0

Alamofire

यदि आप पहले से ही सभी रैस्टफुल आपी के लिए अलमॉफायर का उपयोग कर रहे हैं , तो यहां आप उससे क्या कर सकते हैं।

आप अपने एप्लिकेशन में निम्न वर्ग जोड़ सकते हैं, और कॉल MNNetworkUtils.main.isConnected()कर सकते हैं कि यह जुड़ा हुआ है या नहीं।

#import Alamofire

class MNNetworkUtils {
  static let main = MNNetworkUtils()
  init() {
    manager = NetworkReachabilityManager(host: "google.com")
    listenForReachability()
  }

  private let manager: NetworkReachabilityManager?
  private var reachable: Bool = false
  private func listenForReachability() {
    self.manager?.listener = { [unowned self] status in
      switch status {
      case .notReachable:
        self.reachable = false
      case .reachable(_), .unknown:
        self.reachable = true
      }
    }
    self.manager?.startListening()
  }

  func isConnected() -> Bool {
    return reachable
  }
}

यह एक एकल वर्ग है। हर बार, जब उपयोगकर्ता नेटवर्क को कनेक्ट या डिस्कनेक्ट करता है, तो यह self.reachableसही / गलत तरीके से सही हो जाएगा, क्योंकि हम NetworkReachabilityManagerसिंगलटन आरंभीकरण के लिए सुनना शुरू करते हैं ।

इसके अलावा, अभिकर्मक की निगरानी करने के लिए, आपको एक होस्ट प्रदान करने की आवश्यकता है, वर्तमान में मैं google.comजरूरत पड़ने पर किसी भी अन्य मेजबान या आपके किसी एक को बदलने के लिए स्वतंत्र महसूस कर रहा हूं ।

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