Как проверить активное подключение к Интернету на iOS или OSX?

Я хотел бы проверить, есть ли у меня подключение к Интернету в iOS, используя Cocoa Touch библиотеки или OSX с помощью 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 и OSX 10.4), и если да, то что это лучший способ сделать это?

1164
задан Brock Woolf 05 июля '09 в 11:45
источник поделиться
36 ответов
  • 1
  • 2

МЕТОД 1: Используйте простой (совместимый с ARC и GCD) класс

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

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];
}

МЕТОД 2: сделайте это сами по-старому с использованием устаревшего класса Apple Reachability

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

2) Добавьте в проект версию Apple Reachability.h и Reachability.m (вы можете получить их здесь)

3) Добавьте @class Reachability; в .h файл, где вы реализуете код

4) Создайте несколько экземпляров для проверки в разделе interface файла .h:

Reachability* internetReachable;
Reachability* hostReachable;

5) Добавьте метод в .h для обновления сети:

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

6) Добавьте #import "Reachability.h" в файл .m, где вы выполняете проверку

7) В файле .m, где вы выполняете проверку, вы можете поместить это в один из первых методов (init или viewWillAppear или viewDidLoad и т.д.):

-(void) viewWillAppear:(BOOL)animated
{
    // check for internet connection
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

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

    // check if a pathway to a random host exists
    hostReachable = [Reachability reachabilityWithHostName:@"www.apple.com"];
    [hostReachable startNotifier];

    // now patiently wait for the notification
}

8) Настройте метод отправки уведомления и установите все проверки или вызовите все методы, которые вы, возможно, настроили (в моем случае я просто установил BOOL)

-(void) checkNetworkStatus:(NSNotification *)notice
{
    // called after network status changes
    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;
        }
    }
}

9) В вашем dealloc или viewWillDisappear или подобном методе удалите себя как наблюдателя

-(void) viewWillDisappear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

Примечание. Может быть экземпляр, использующий viewWillDisappear, где вы получаете предупреждение о памяти, и наблюдатель никогда не получает незарегистрированные данные, поэтому вы также должны учитывать это.


Примечание. Используемый вами домен не имеет значения. Он просто тестирует шлюз в любом домене.

Важное примечание. Класс Reachability является одним из наиболее используемых классов в проектах, поэтому вы можете столкнуться с конфликтами именования с другими проектами, такими как ShareKit. Если это произойдет, вам придется переименовать одну из пар файлов Reachability.h и Reachability.m в другое место, чтобы решить проблему.

1188
ответ дан iwasrobbed 30 авг. '10 в 2:58
источник поделиться

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

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

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

300
ответ дан cannyboy 26 авг. '11 в 16:34
источник поделиться

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

Включите в проект проект SystemConfiguration.framework.

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

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

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

/*
Connectivity testing code pulled from Apple 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 протестирован для вас.

140
ответ дан Andrew Zimmer 28 окт. '11 в 23:37
источник поделиться

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


Вы можете использовать класс Apple Reachability. Он также позволит вам проверить, включен ли 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.h/m в свой проект. Кроме того, вы должны добавить инфраструктуру SystemConfiguration в свой проект.

116
ответ дан Daniel Rinser 05 июля '09 в 13:58
источник поделиться

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

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 - путь.

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

76
ответ дан Erik Wegener 15 мая '12 в 1:25
источник поделиться

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

Swift Code

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 region universal URL reachable
        }
        else
        {
            // No "Internet" aka Apple 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 region universal URL reachable
         }
         else
         {
             // No "Internet" aka Apple region universal URL un-reachable
         }
    }];
}
68
ответ дан klcjr89 30 нояб. '12 в 6:26
источник поделиться

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

Примечание.. Обратите внимание на комментарий @KHG, касающийся использования кода доступности Apple.

54
ответ дан teabot 05 июля '09 в 11:59
источник поделиться

Вы можете использовать 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.
41
ответ дан Aleksander Azizi 25 апр. '12 в 15:20
источник поделиться

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

Reachability

39
ответ дан user133319 05 июля '09 в 11:58
источник поделиться

Обновлен только класс 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");}
32
ответ дан Ben Groot 27 авг. '10 в 12:41
источник поделиться

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

27
ответ дан Alex 07 нояб. '11 в 23:17
источник поделиться

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

Reachability

25
ответ дан JK Laiho 10 апр. '12 в 10:12
источник поделиться

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

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

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

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

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

21
ответ дан Bruno Koga 30 мая '13 в 4:18
источник поделиться

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

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

17
ответ дан Felixyz 05 июля '09 в 12:10
источник поделиться

Очень просто... Попробуйте выполнить следующие действия:

Шаг 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");
    }
}
12
ответ дан svmrajesh 15 апр. '14 в 15:42
источник поделиться
-(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;
}
}
10
ответ дан Mutawe 03 июня '13 в 14:43
источник поделиться
- (void)viewWillAppear:(BOOL)animated
{
    NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];

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

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

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

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

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

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

10
ответ дан IOS Rocks 22 нояб. '12 в 14:46
источник поделиться

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

9
ответ дан Huy Tran 31 авг. '13 в 20:13
источник поделиться

Первый: добавьте 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
ответ дан Paresh Hirpara 05 апр. '14 в 14:16
источник поделиться

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

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

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

7
ответ дан Tony 04 дек. '13 в 21:17
источник поделиться

Сначала загрузите класс достижимости и поместите файл reachability.h и reachabilty.m в 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;
}

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

7
ответ дан Latika Tiwari 07 июня '13 в 16:53
источник поделиться

Я нашел его простой и простой в использовании библиотекой SimplePingHelper.

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

7
ответ дан Piyush Dubey 07 янв. '14 в 12:04
источник поделиться

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

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

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

Не забудьте добавить "SystemConfiguration.framework" к вашему строителю проектов.

//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")
  }
6
ответ дан ViJay Avhad 17 дек. '15 в 15:14
источник поделиться

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

"Да" означает соединение. "Нет" означает "отключено".

#import "Reachability.h"

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

    if (internetStats == NotReachable)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}
6
ответ дан Mina Fawzy 01 окт. '14 в 13:49
источник поделиться
  • Загрузите файл Reachability, https://gist.github.com/darkseed/1182373

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

  • Сделайте #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");
    }
}
6
ответ дан Maulik Salvi 27 нояб. '14 в 10:29
источник поделиться

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

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

Pinging сервер интрасети с классом достижимости всегда возвращает 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;
    }
}

Этот метод был настолько полезен для меня, поэтому всякий раз, когда я пытаюсь отправить некоторые данные на сервер, я всегда проверяю доступность моего ресурса интрасети с помощью этого минимального URL-адреса URL-адреса.

6
ответ дан Durai Amuthan.H 10 июля '13 в 15:42
источник поделиться

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

     #define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
     if (hasInternetConnection){
           // To-do block
     }
5
ответ дан Himanshu Mahajan 18 окт. '13 в 9:19
источник поделиться

Существует еще один способ проверить подключение к Интернету с помощью iPhone SDK.

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

#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;
}
5
ответ дан iProgrammer 09 нояб. '13 в 12:58
источник поделиться

Помимо достижимости вы также можете использовать Простую вспомогательную библиотеку Ping. Он работает очень хорошо и легко интегрируется.

5
ответ дан user2538944 21 февр. '14 в 14:44
источник поделиться
  • Шаг 1: добавьте класс Reachability в ваш проект.
  • Шаг 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");
    }
    
4
ответ дан Anny 19 авг. '15 в 9:37
источник поделиться
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос