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