Как проверить активное интернет-соединение на iOS или macOS?

Я хотел бы проверить, есть ли у меня подключение к Интернету на iOS с использованием библиотек Cocoa Touch или на macOS с использованием библиотек Cocoa .

Я придумал способ сделать это, используя NSURL. То, как я это сделал, кажется немного ненадежным (потому что даже Google может однажды выйти из строя, и полагаться на третье лицо кажется плохим), и хотя я мог проверить, есть ли ответ от других веб-сайтов, если Google не отвечает, это действительно кажется расточительным и ненужными накладными расходами на мое приложение.

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

Это то, что я сделал плохо (не говоря уже о stringWithContentsOfURL устарела в iOS 3. 0 и macOS 10. 4) и если да, то как лучше это сделать?

вопрос задан 5.07.2009
Brock Woolf
24896 репутация

38 ответов


  • 1228 рейтинг

    Важно! : Эта проверка должна всегда всегда выполняться асинхронно. Большинство ответов ниже являются синхронными, поэтому будьте осторожны, иначе вы заморозите свое приложение.


    Swift

    1) Установка через CocoaPods или Carthage: https: // github. ком / ashleymills / достижимости. Свифт

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

    Objective-C

    1) Добавьте фреймворк SystemConfiguration в проект, но не беспокойтесь о его включении

    2) Добавить версию Tony Million 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 в другое, чтобы решить эту проблему.

    Примечание: Домен, который вы используете, не имеет значения. Это просто тестирование шлюза в любой домен.

    ответ дан iwasrobbed, с репутацией 40768, 29.08.2010
  • 303 рейтинг

    Мне нравится быть проще. Как я это делаю это:

    //Class.h
    #import "Reachability.h"
    #import 
    
    - (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
    }
    

    Этот метод не ждет изменения состояния сети, чтобы что-то делать. Он просто проверяет состояние, когда вы просите его.

    ответ дан cannyboy, с репутацией 14198, 26.08.2011
  • 144 рейтинг

    Используя код Reachability от Apple, я создал функцию, которая будет проверять это правильно, без необходимости включать какие-либо классы.

    Включите конфигурацию системы. рамки в вашем проекте.

    Сделайте импорт:

    #import 
    #import 
    #import 
    

    Теперь просто вызовите эту функцию:

    /*
    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 проверено для вас.

    ответ дан Andrew Zimmer, с репутацией 3162, 28.10.2011
  • 118 рейтинг

    Раньше это был правильный ответ, но теперь он устарел, так как вместо этого вы должны подписаться на уведомления о доступности Этот метод проверяет синхронно:


    Вы можете использовать класс Reachability от Apple. Это также позволит вам проверить, включен ли Wi-Fi:

    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. ч / м к вашему проекту. Кроме того, вы должны добавить инфраструктуру SystemConfiguration в ваш проект.

    ответ дан Daniel Rinser, с репутацией 8060, 5.07.2009
  • 79 рейтинг

    Вот очень простой ответ:

    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 здесь, но если бы у меня был надежный веб-сервер, я бы загрузил небольшой файл с одним символом для максимальной скорости.

    Если все, что вы хотите сделать, это проверить, является ли устройство каким-либо образом подключенным к Интернету , я определенно рекомендую использовать это простое решение. Если вам нужно знать, как пользователь подключен, используйте Reachability.

    Осторожно: это ненадолго заблокирует вашу ветку, пока он загружает сайт. В моем случае это не было проблемой, но вы должны рассмотреть это (благодарность Брэду за указание на это)

    ответ дан Erik Wegener, с репутацией 1581, 14.05.2012
  • 70 рейтинг

    Вот как я делаю это в своих приложениях: хотя код ответа 200 не гарантирует ничего, он достаточно стабилен для меня. Это не требует такой большой загрузки, как ответы NSData, опубликованные здесь, так как мой просто проверяет ответ HEAD.

    Swift Код

    func checkInternet(flag:Bool, completionHandler:(internet:Bool) -> Void)
    {
        UIApplication.sharedApplication().networkActivityIndicatorVisible = true
    
        let url = NSURL(string: "http://www.appleiphonecell.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 Apple's region universal URL reachable
            }
            else
            {
                // No "Internet" aka Apple's region universal URL un-reachable
            }
        })
    }
    

    Objective-C Код

    typedef void(^connection)(BOOL);
    
    - (void)checkInternet:(connection)block
    {
        NSURL *url = [NSURL URLWithString:@"http://www.appleiphonecell.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 Apple's region universal URL reachable
             }
             else
             {
                 // No "Internet" aka Apple's region universal URL un-reachable
             }
        }];
    }
    
    ответ дан klcjr89, с репутацией 2963, 30.11.2012
  • 54 рейтинг

    Apple предоставляет пример кода для проверки доступности различных типов сети. В качестве альтернативы в кулинарной книге разработчиков iPhone есть пример .

    Примечание: См. Комментарий @ KHG к этому ответу относительно использования кода доступности Apple.

    ответ дан teabot, с репутацией 10990, 5.07.2009
  • 43 рейтинг

    Вы можете использовать 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.
    
    ответ дан Aleksander Azizi, с репутацией 7466, 25.04.2012
  • 39 рейтинг

    Apple предоставляет пример приложения, которое делает именно это:

    Достижимость

    ответ дан does_not_exist, с репутацией , 5.07.2009
  • 32 рейтинг

    Только класс Reachability был обновлен. Теперь вы можете использовать:

    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");}
    
    ответ дан Ben Groot, с репутацией 3985, 27.08.2010
  • 27 рейтинг

    Версия на Reachability для iOS 5: темное семя / Reachability. ч . Это не мое! =)

    ответ дан Alex, с репутацией 1437, 7.11.2011
  • 25 рейтинг

    Здесь есть привлекательная модернизация Reachability с использованием ARC и GCD:

    Достижимость

    ответ дан JK Laiho, с репутацией 1854, 10.04.2012
  • 21 рейтинг

    Если вы используете AFNetworking , вы можете использовать его собственную реализацию для статуса доступности интернета.

    Лучший способ использовать AFNetworking - это создать подкласс класса AFHTTPClient и использовать его для сетевых подключений.

    Одним из преимуществ использования этого подхода является то, что вы можете использовать blocks для установки желаемого поведения при изменении состояния достижимости. Предположим, что я создал одноэлементный подкласс AFHTTPClient (как сказано в «Примечаниях по подклассам» на AFNetworking docs ) с именем BKHTTPClient, я бы сделал что-то вроде:

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

    Вы также можете проверить соединения Wi-Fi или WLAN, в частности, используя перечисления AFNetworkReachabilityStatusReachableViaWWAN и AFNetworkReachabilityStatusReachableViaWiFi (более здесь ).

    ответ дан Bruno Koga, с репутацией 3492, 30.05.2013
  • 18 рейтинг

    Я использовал код в этого обсуждения , и, кажется, он работает нормально (прочитайте весь поток ! ).

    Я не тестировал его всесторонне с каждым возможным видом соединения (например, с Wi-Fi ad hoc).

    ответ дан Felixyz, с репутацией 14648, 5.07.2009
  • 13 рейтинг

    Очень просто. , , , Попробуйте эти шаги:

    Шаг 1: Добавьте структуру SystemConfiguration в свой проект.


    Шаг 2: Импортируйте следующий код в файл header.

    #import 
    

    Шаг 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");
        }
    }
    
    ответ дан svmrajesh, с репутацией 8307, 15.04.2014
  • 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;
    }
    }
    
    ответ дан Mutawe, с репутацией 5368, 3.06.2013
  • 11 рейтинг
    - (void)viewWillAppear:(BOOL)animated
    {
        NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
    
        return (URL != NULL ) ? YES : NO;
    }
    

    Или используйте класс доступности .

    Существует два способа проверить доступность Интернета с помощью iPhone SDK:

    1. Проверьте, открыта ли страница Google или нет.

    2. Класс достижимости

    Для получения дополнительной информации, пожалуйста, обратитесь к Доступность (Apple Developer).

    ответ дан IOS Rocks, с репутацией 1728, 22.11.2012
  • 10 рейтинг

    Использование http: // huytd. GitHub. io / datatify / . Это проще, чем добавлять библиотеки и писать код самостоятельно.

    ответ дан Huy Tran, с репутацией 552, 31.08.2013
  • 9 рейтинг

    Первый : добавить 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");
        }
    }
    
    ответ дан Paresh Hirpara, с репутацией 396, 5.04.2014
  • 8 рейтинг

    Существует также другой способ проверки интернет-соединения с помощью iPhone SDK.

    Попробуйте реализовать следующий код для сетевого подключения.

    #import 
    #include 
    
    /**
         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;
    }
    
    ответ дан iProgrammer, с репутацией 3065, 9.11.2013
  • 8 рейтинг

    Сделать это самостоятельно очень просто. Следующий метод будет работать. Просто убедитесь, что вы не разрешаете протокол имени хоста, например HTTP, HTTPS и т. Д. быть переданным с именем.

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

    Это быстро, просто и безболезненно.

    ответ дан Tony, с репутацией 2668, 4.12.2013
  • 8 рейтинг

    Мне показалось, что это простая и удобная библиотека SimplePingHelper .

    Пример кода: chrishulbert / SimplePingHelper ( GitHub )

    ответ дан Piyush Dubey, с репутацией 2010, 7.01.2014
  • 8 рейтинг

    Сначала скачайте класс достижимости и поместите достижимость. ч и достижимости. м файл в вашем Xcode .

    Лучший способ - создать общий класс функций (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;
    }
    

    Теперь вы можете проверить сетевое соединение в любом классе, вызвав этот метод класса.

    ответ дан Latika Tiwari, с репутацией 298, 7.06.2013
  • 7 рейтинг

    Помимо доступности, вы также можете использовать библиотеку помощника 2754789862 Simple Ping . Он работает действительно хорошо и прост в интеграции.

    ответ дан user2538944, с репутацией 240, 21.02.2014
  • 7 рейтинг
    1. Загрузите файл Reachability, https: // gist. GitHub. com / darkseed / 1182373

    2. И добавьте CFNetwork.framework и 'SystemConfiguration. рамки »в рамках

    3. Do #import "Достижимость. ч "


    Первый : добавить 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");
        }
    }
    
    ответ дан Maulik Salvi, с репутацией 212, 27.11.2014
  • 7 рейтинг

    Класс доступности в порядке, чтобы узнать, доступно ли подключение к Интернету для устройства или нет. , ,

    Но в случае доступа к ресурсу интранета :

    Проверка связи с сервером интрасети с помощью класса достижимости всегда возвращает true.

    Таким образом, быстрым решением в этом сценарии будет создание веб-метода с именем 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 с малым временем ожидания.

    ответ дан Durai Amuthan.H, с репутацией 21715, 10.07.2013
  • 7 рейтинг

    Я думаю, что это лучший ответ.

    «Да» означает «подключен». «Нет» означает «отключен».

    #import "Reachability.h"
    
     - (BOOL)canAccessInternet
    {
        Reachability *IsReachable = [Reachability reachabilityForInternetConnection];
        NetworkStatus internetStats = [IsReachable currentReachabilityStatus];
    
        if (internetStats == NotReachable)
        {
            return NO;
        }
        else
        {
            return YES;
        }
    }
    
    ответ дан Mina Fawzy, с репутацией 12639, 1.10.2014
  • 6 рейтинг
    • Шаг 1. Добавьте класс Reachability в ваш проект.
    • Шаг 2. Импорт класса Reachability
    • Шаг 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");
      }
      
    ответ дан Anny, с репутацией 309, 19.08.2015
  • 6 рейтинг

    Проверка доступности интернет-соединения в (iOS) Xcode 8, Swift 3. 0

    Это простой метод проверки доступности сети, так как наше устройство подключено к любой сети или нет. Мне удалось перевести его на Swift 3. 0 а вот и финальный код. Существующий класс Apple Reachability и другие сторонние библиотеки казались слишком сложными для перевода на Swift.

    Это работает как для 3G, 4G и WiFi соединений.

    Не забудьте добавить «Конфигурация системы. рамки » вашему строителю проекта.

    //Create new swift class file Reachability in your project.
    import SystemConfiguration
    public class InternetReachability {
    
    class func isConnectedToNetwork() -> Bool {
       var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
       zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
       zeroAddress.sin_family = sa_family_t(AF_INET)
       let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
              SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue()
       }
       var flags: SCNetworkReachabilityFlags = 0
       if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
              return false
       }
       let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
       let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
    
       return isReachable && !needsConnection
      }
    }
    
    // Check network connectivity from anywhere in project by using this code.
     if InternetReachability.isConnectedToNetwork() == true {
             print("Internet connection OK")
      } else {
             print("Internet connection FAILED")
      }
    
    ответ дан ViJay Avhad, с репутацией 1928, 17.12.2015
  • 6 рейтинг

    Импортируйте класс Reachable.h в ViewController и используйте следующий код для проверки подключения :

         #define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
         if (hasInternetConnection){
               // To-do block
         }
    
    ответ дан Himanshu Mahajan, с репутацией 3285, 18.10.2013
  • 3 рейтинг

    Swift 3 / Swift 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)
    
    }
    
    ответ дан Dev_Tandel, с репутацией 2394, 10.08.2017
  • 3 рейтинг

    Создайте объект AFNetworkReachabilityManager и используйте следующий код для отслеживания сетевого подключения

    self.reachabilityManager = [AFNetworkReachabilityManager managerForDomain:@"yourDomain"];
    [self.reachabilityManager startMonitoring];
    [self.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            switch (status) {
                case AFNetworkReachabilityStatusReachableViaWWAN:
                case AFNetworkReachabilityStatusReachableViaWiFi:
                    break;
                case AFNetworkReachabilityStatusNotReachable:
                    break;
                default:
                    break;
            }
        }];
    
    ответ дан RandomGuy, с репутацией 147, 31.03.2015
  • 3 рейтинг

    импорт "Достижимость. ч "

    -(BOOL)netStat
    {
        Reachability *test = [Reachability reachabilityForInternetConnection];
        return [test isReachable];
    }
    
    ответ дан neo D1, с репутацией 1543, 30.09.2014
  • 3 рейтинг

    Получите класс Reachabilty из https: // github. com / tonymillion / Reachability , добавьте инфраструктуру конфигурации системы в свой проект, выполните импорт Reachability. h в вашем классе и реализуйте пользовательские методы, как показано ниже:

    - (BOOL)isConnectedToInternet
    {
        //return NO; // Force for offline testing
        Reachability *hostReach = [Reachability reachabilityForInternetConnection];
        NetworkStatus netStatus = [hostReach currentReachabilityStatus];
        return !(netStatus == NotReachable);
    }
    
    ответ дан K.D, с репутацией 380, 17.09.2013
  • 2 рейтинг

    Проверьте доступность интернет-соединения в (iOS) Xcode 9, Swift 4. 0

    Шаг 1 создать расширение файла дать имя ReachabilityManager. быстро, затем добавьте ниже коды строки

    import Foundation
    import SystemConfiguration
    public class ConnectionCheck 
    {    
       class func isConnectedToNetwork() -> Bool 
       {
        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(MemoryLayout.size)
        zeroAddress.sin_family = sa_family_t(AF_INET)
    
        guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress,         
        {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
                SCNetworkReachabilityCreateWithAddress(nil, $0)
            }
        }) else {
            return false
        }
    
        var flags: SCNetworkReachabilityFlags = []
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {
            return false
        }
    
        let isReachable = flags.contains(.reachable)
        let needsConnection = flags.contains(.connectionRequired)
    
        return (isReachable && !needsConnection)
       }
      }
    

    Шаг 2 звоните над расширением как

    if ConnectionCheck.isConnectedToNetwork()
            {
                print("Connected")
                //Online related Business logic
            }
            else{
                print("disConnected")
                // offline related business logic
    
            }
    
    ответ дан praful argiddi, с репутацией 96, 14.09.2018
  • 1 рейтинг

    Это для SWIFT 3. 0 и асинхронно. Большинство ответов - это решение для синхронизации, которое блокирует ваш основной поток, если у вас очень медленное соединение. Это решение лучше, но не идеально, потому что оно проверяет подключение на Google, поэтому не стесняйтесь использовать другой URL.

    func checkInternetConnection(completionHandler:@escaping (Bool) -> Void)
    {
        if let url = URL(string: "http://www.google.com/")
        {
            var request = URLRequest(url: url)
            request.httpMethod = "HEAD"
            request.cachePolicy = .reloadIgnoringLocalAndRemoteCacheData
            request.timeoutInterval = 5
    
            let tast = URLSession.shared.dataTask(with: request, completionHandler:
            {
                (data, response, error) in
    
                completionHandler(error == nil)
            })
            tast.resume()
        }
        else
        {
            completionHandler(true)
        }
    }
    
    ответ дан pierre23, с репутацией 1709, 17.10.2016
  • 0 рейтинг

    Alamofire

    Я знаю, что вопрос касается решения Coca Touch, но я хочу предоставить решение для людей, которые искали проверить интернет-соединение на iOS и у меня будет еще один вариант здесь.

    Если вы уже используете 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 на true / false, потому что мы начинаем прослушивать NetworkReachabilityManager при одноэлементной инициализации.

    Кроме того, чтобы отслеживать достижимость, вам нужно указать хост, в настоящее время я использую Google. com, не стесняйтесь переходить на любые другие хосты или один из ваших, если это необходимо.

    ответ дан nuynait, с репутацией 1147, 2.04.2018
  • -1 рейтинг

    Попробуйте это:

    - (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    
    
    if ([self.delegate respondsToSelector:@selector(getErrorResponse:)]) {
        [self.delegate performSelector:@selector(getErrorResponse:) withObject:@"No Network Connection"];
    }
    
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"BMC" message:@"No Network Connection" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK",nil];
    [alertView show];
    

    }

    ответ дан HariKarthick, с репутацией 132, 18.11.2016