如何在Cocoa中确定Internet连接?

时间:2011-10-02 14:48:14

标签: objective-c macos cocoa

我需要确定Internet连接是否可用。我不在乎它是如何连接的(WI-FI,Lan等......)。我需要确定,是否可以使用Internet连接。

P.S。我找到了一种检查WI-FI连接的方法。但我不在乎它是如何连接的(我需要检查所有可以连接到Internet的方式)。

像(isConnected)

之类的东西

3 个答案:

答案 0 :(得分:9)

我希望此代码适用于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;

}

答案 1 :(得分:8)

查看SCNetworkReachability参考。这是一个C API,因此它不像单个方法调用那样容易使用,但是当特定地址可通过网络访问或无法访问时,它可以很好地通知您的应用程序。

概括的是,您将使用SCNetworkReachabilityCreateWithAddressSCNetworkReachabilityCreateWithName创建一个对象,然后使用SCNetworkReachabilityScheduleWithRunLoop将其添加到运行循环中。确定可达性并且更改时,将调用您提供的回调函数。您可以使用它来更新应用程序的状态。

Apple提供的an example app显示了如何使用它(虽然它是专为iOS而非Mac OS X设计的)

答案 2 :(得分:3)

一种方法是:

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