Как определить интернет-соединение в какао? - PullRequest
6 голосов
/ 02 октября 2011

Мне нужно определить, доступно ли подключение к Интернету или нет. Мне все равно, как это связано (WI-FI, Lan и т. Д.). Мне нужно определить, доступно ли подключение к Интернету вообще.

P.S. Я нашел способ проверить соединение WI-FI. Но мне все равно, как он подключен (мне нужно проверить все способы подключения к Интернету).

Что-то вроде (isConnected)

Ответы [ 3 ]

9 голосов
/ 12 сентября 2013

Надеюсь, этот код работает для платформ iOS и OSX.

#include <SystemConfiguration/SystemConfiguration.h>
static BOOL isInternetConnection()
{
    BOOL returnValue = NO;

#ifdef TARGET_OS_MAC

    struct sockaddr zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sa_len = sizeof(zeroAddress);
    zeroAddress.sa_family = AF_INET;

    SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(NULL, (const struct sockaddr*)&zeroAddress);


#elif TARGET_OS_IPHONE

    struct sockaddr_in address;
    size_t address_len = sizeof(address);
    memset(&address, 0, address_len);
    address.sin_len = address_len;
    address.sin_family = AF_INET;

    SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(NULL, (const struct sockaddr*)&address);

#endif

    if (reachabilityRef != NULL)
    {
        SCNetworkReachabilityFlags flags = 0;

        if(SCNetworkReachabilityGetFlags(reachabilityRef, &flags))
        {
            BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
            BOOL connectionRequired = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
            returnValue = (isReachable && !connectionRequired) ? YES : NO;
        }

        CFRelease(reachabilityRef);
    }

    return returnValue;

}
8 голосов
/ 02 октября 2011

Взгляните на ссылку SCNetworkReachability. Это C API, поэтому его не так просто использовать, как один вызов метода, но он отлично справляется с уведомлением вашего приложения, когда определенный адрес становится доступным или недоступным по сети.

В общих чертах вы создадите объект с SCNetworkReachabilityCreateWithAddress или SCNetworkReachabilityCreateWithName, а затем добавите его в цикл выполнения с помощью SCNetworkReachabilityScheduleWithRunLoop. Когда определена достижимость и когда она изменится, будет вызвана предоставленная вами функция обратного вызова Вы можете использовать это для обновления состояния вашего приложения.

Apple поставляет пример приложения , в котором показано, как его использовать (хотя оно разработано для iOS, а не Mac OS X)

3 голосов
/ 02 октября 2011

Один из способов сделать это:

// Check whether the user has internet
- (bool)hasInternet {
    NSURL *url = [[NSURL alloc] initWithString:@"http://www.google.com"];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5.0];
    BOOL connectedToInternet = NO;
    if ([NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]) {
        connectedToInternet = YES;
    }
    //if (connectedToInternet)
        //NSLog(@"We Have Internet!");
    [request release];
    [url release];
    return connectedToInternet;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...