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

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

Я придумал способ сделать это с помощью 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), и если да, то как лучше это сделать?

30 ответов


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


Свифт

1) Установите через CocoaPods или Carthage:https://github.com/ashleymills/Reachability.swift

2) испытайте достижимость через закрытие

let reachability = Reachability()!

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

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

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

С

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

2) Добавить версию Тони миллиона Reachability.h и Reachability.m к проекту (найдено здесь:https://github.com/tonymillion/Reachability)

3) обновите раздел интерфейса

#import "Reachability.h"

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

4) затем реализуйте этот метод в.M файл вашего контроллера вида, который вы можете вызвать

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

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

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

    [internetReachableFoo startNotifier];
}

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

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


мне нравится держать вещи простыми. Вот как я это делаю:--3-->

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

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


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

включить SystemConfiguration.рамки в вашем проекте.

сделать некоторые импортные:

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

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

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

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

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


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

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

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

    return NO;
}

и iOS 5 протестировали для вас.


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


вы можете использовать класс достижимости 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) { }

класс достижимости не поставляется вместе с SDK, а является частью этот образец приложения Apple. Просто скачайте его и скопируйте достижимость.h / m к вашему проекту. Кроме того, необходимо добавить в проект systemconfiguration framework.


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

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

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

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


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

Код

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

Цель-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
         }
    }];
}

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

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


можно использовать Reachability by  (здесь).

#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.

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

доступность


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

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

версия о достижимости для iOS 5-это darkseed/достижимость.h. Это не мое! =)


здесь есть красивый, ARC - и GCD - с использованием модернизации достижимости:

доступность


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

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

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

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

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


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

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


очень удобно.... Попробуйте следующие шаги:

Шаг 1: добавить SystemConfiguration в рамках проекта.


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

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

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

- (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).


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


первый добавить 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");
    }
}

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

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


существует также другой способ проверить подключение к интернету с помощью 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;
}

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

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

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


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

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


  1. загрузите файл достижимости,https://gist.github.com/darkseed/1182373

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

  3. Do #import " достижимость.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");
    }
}

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

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

Pinging сервер интрасети с классом достижимости всегда возвращает true.

таким образом, быстрым решением в этом сценарии было бы создание веб-метода под названием pingme вместе с другими webmethods на службе. The 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 таймаута.


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


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

"да", значит, связаны. "Нет" означает отключено.

#import "Reachability.h"

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

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

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

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

  • Шаг 1: добавьте класс достижимости в свой проект.
  • Шаг 2: импортируйте класс достижимости
  • Шаг 3: Создайте приведенную ниже функцию

    - (BOOL)checkNetConnection {
        self.internetReachability = [Reachability reachabilityForInternetConnection];
        [self.internetReachability startNotifier];
        NetworkStatus netStatus = [self.internetReachability currentReachabilityStatus];
        switch (netStatus) {
            case NotReachable:
            {
                return NO;
            }
    
            case ReachableViaWWAN:
            {
                 return YES;
            }
    
            case ReachableViaWiFi:
            {
                 return YES;
            }
        }
    }
    
  • Шаг 4: вызовите функцию, как показано ниже:

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

проверка доступности подключения к Интернету в (iOS) Xcode 8 , Swift 3.0

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

это работает как для 3G, 4G и WiFi подключение.

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

//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()).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")
  }