Objective c 如何在Cocoa中确定Internet连接?

Objective c 如何在Cocoa中确定Internet连接?,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我需要确定互联网连接是否可用。我不在乎它是如何连接的(WI-FI、Lan等)。我需要确定,互联网连接是否可用 另外,我找到了一种检查WI-FI连接的方法。但我不在乎它是如何连接的(我需要检查所有可以连接到互联网的方式) 类似于(断开连接)请查看参考资料。这是一个C API,因此它不像单个方法调用那么容易使用,但它在特定地址通过网络变得可访问或不可访问时,可以很好地通知您的应用程序 概括地说,您将使用SCNetworkReachabilityCreateWithAddress或SCNetworkR

我需要确定互联网连接是否可用。我不在乎它是如何连接的(WI-FI、Lan等)。我需要确定,互联网连接是否可用

另外,我找到了一种检查WI-FI连接的方法。但我不在乎它是如何连接的(我需要检查所有可以连接到互联网的方式)

类似于(断开连接)

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

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

苹果提供了演示如何使用它的软件(尽管它是为iOS而不是Mac OS X设计的)

一种方法是:

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

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

}
#包括
静态布尔isInternetConnection()
{
布尔返回值=否;
#ifdef目标操作系统MAC
结构sockaddr零地址;
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
地址中的结构sockaddr_;
大小\u t地址\u len=sizeof(地址);
memset(&address,0,address\u len);
address.sinu len=地址;
address.sin_family=AF_INET;
SCNetworkReachabilityRef-reachabilityRef=SCNetworkReachabilityCreateWithAddress(NULL,(const struct sockaddr*)&地址);
#恩迪夫
if(reachabilityRef!=NULL)
{
SCNetworkReachabilityFlags标志=0;
if(SCNetworkReachabilityGetFlags(reachabilityRef和flags))
{
BOOL isReachable=((flags&kSCNetworkFlagsReachable)!=0);
BOOL connectionRequired=((需要标志和KSCNetworkFlagsConnection)!=0);
returnValue=(isReachable&&!connectionRequired)?是:否;
}
CFRelease(可达性ref);
}
返回值;
}

Dupe of也不是真正的重复。这个链接更多的是关于Iphone的互联网连接。仅适用于Wi-Fi。@User1234:是什么让你相信提问者问的是关于iPhone或Wi-Fi的问题?可能是重复的感谢非常有意思知道。但我在MAC OS上需要它。我认为应该有更简单的使用方法。我想检查我是否连接到互联网-做点什么。类似(ifConnected){//do here}这在Mac OS X上可用(链接的文档来自Mac OS X库)。这个例子恰好是为iOS编写的。没有提供连接的系统
方法。但是你可以用它来编写你自己的
isConnected
方法。它正是我想要的。谢谢。这是一个糟糕的解决方案。您的应用程序将冻结,直到请求成功或失败。如果应用程序存在路由问题,导致请求在达到超时之前不会失败,则这可能会导致应用程序暂停60秒。您的用户不会欣赏这一点。即使成功,应用程序也可能会暂停几秒钟,特别是在连接速度较慢的情况下。但是如果使用NSOperation或GCD wor这种方法会怎么样?我认为它可以很好地工作,并且不会冻结UI。在这样一个固定的URL上测试连接的可达性不是一个好的做法。若谷歌离线,但客户端有互联网,你们能说什么?此外,在许多情况下,当您在HTTPS url上测试连接时,此测试失败。对这个答案竖起大拇指。这对阻止谷歌的国家仍然有效吗?这应该是答案!非常感谢。还有其他人测试过吗?
中的
sockaddr
sockaddr\u之间有什么区别?哪些应该在tvOS上使用?