3

在我的 iOS 项目中,我想在某些网络操作之前​​向用户显示一条连接到 Internet 的消息,所以我使用 Apple 的 Reachability 类编写了以下检查:

Reachability *reach = [Reachability reachabilityWithHostName:@"google.com"];
if([reach currentReachabilityStatus] == NotReachable) {
    // ...prompt user to establish an internet connection
} else {
    // ...send an asynchronous request with a timeout
}

然而,这有一个非常大的问题——当设备在一个非常有损的网络上时(例如,当 OS X Lion 的Network Link Conditioner上的上行链路数据包丢失设置为 100% 时),[Reachability reachabilityWithHostName:@"google.com"]会阻塞主线程 30 秒之前确定连接不可用。但是,以下代码不会阻塞:

if([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] == NotReachable) {
    // ...prompt user to establish an internet connection
} else {
    // ...send an asynchronous request with a timeout
}

查看 Reachability 的实现表明这两种方法都使用SystemConfiguration.framework,但第一种方法使用SCNetworkReachabilityCreateWithName,而第二种方法使用SCNetworkReachabilityCreateWithAddress。为什么第一种方法会阻塞,而第二种方法不会呢?第二种方法是检查连通性的好方法吗?或者,还有更好的方法?

4

2 回答 2

4

检查此功能:

- (BOOL)isNetworkAvailable
{
CFNetDiagnosticRef diag;        
diag = CFNetDiagnosticCreateWithURL (NULL, (__bridge CFURLRef)[NSURL URLWithString:@"www.apple.com"]);



CFNetDiagnosticStatus status;
status = CFNetDiagnosticCopyNetworkStatusPassively (diag, NULL);        

CFRelease (diag);

if ( status == kCFNetDiagnosticConnectionUp )
{
    //NSLog (@"Connection is up");
    return YES;
} else {
    NSLog (@"Connection is down");
    return NO;

}
}

这会很好..

于 2012-11-26T10:32:58.117 回答
2

第一个测试它是否可以到达google.com,而第二个只是检查是否有任何可能的互联网连接(它认为存在,即使有数据包丢失)。

基本上只是把它放在一个线程或后台队列中。可靠地知道您是否有良好连接的唯一方法是对其进行测试,并且任何测试都将是阻塞或异步的。您根本无法立即使用它。

于 2012-07-03T16:09:04.747 回答