实时检查网络可达性

Posted

技术标签:

【中文标题】实时检查网络可达性【英文标题】:checking network reachability in real time 【发布时间】:2013-08-09 17:27:09 【问题描述】:

当用户按下按钮时,我需要知道设备是否在那个瞬间连接到互联网——而不是他是否在 3 秒前连接。在网络可达性发生变化后,可达性 (tonymillion) 通知器大约需要很长时间才能更新。

我认为我可以使用以下方法实时检查实际访问:

if (!([[Reachability reachabilityWithHostname:@"www.google.com"] currentReachabilityStatus] == NotReachable)) NSLog(@"reachable");
if ([[Reachability reachabilityWithHostname:@"www.google.com"] currentReachabilityStatus] == NotReachable) NSLog(@"not reachable");

但结果表明实际上currentReachabilityStatus 不检查互联网访问;它只检查延迟约 3 秒更新的相同标志。

在现场实际检查网络访问的有效方法是什么?

【问题讨论】:

您可以使用 NSURLRequest 向 google.com 发送标头请求。这应该很快。 除非 Google.com 关闭。 @HAS 听起来不错,但我不确定如何创建标头请求。如果您在答案中输入一些代码,我会接受。谢谢。 如果三秒是不可接受的延迟,多长时间可以接受? @CarlVeazey 问题不在于延迟的长度;就是状态不是实时更新的。我有一个 if/then 语句,只有在有互联网连接的情况下,我才需要走一条路——目前,而不是 3 秒前。 【参考方案1】:

正如您在上面的 cmets 中所希望的,这里是使用“HEAD”请求的解决方案。

    让你的类符合 NSURLConnectionDelegate。 实现connection:didReceiveResponse:委托方法 可选择实现connection:didFailWithError: 委托方法

所以您的设置可能如下所示:

YourClass.m

@interface YourClass () <NSURLConnectionDelegate>
@property (strong, nonatomic) NSURLConnection *headerConnection;
@end

@implementation YourClass

- (void)viewDidLoad 
    // You can do this in whatever method you want
    NSMutableURLRequest *headerRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10.0];
    headerRequest.HTTPMethod = @"HEAD";
    self.headerConnection = [[NSURLConnection alloc] initWithRequest:headerRequest delegate:self];


#pragma mark - NSURLConnectionDelegate Methods

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
    if (connection == self.headerConnection) 
        // Handle the case that you have Internet; if you receive a response you are definitely connected to the Internet
    


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
    // Note: Check the error using `error.localizedDescription` for getting the reason of failing
    NSLog(@"Failed: %@", error.localizedDescription);

【讨论】:

【参考方案2】:

您是否尝试过将观察者置于可达性状态?

我以前使用的 Reachabilty 扩展 (NPReachability) 允许 KVO 状态。

【讨论】:

以上是关于实时检查网络可达性的主要内容,如果未能解决你的问题,请参考以下文章

ios上网络类型的可达性错误检查

如何在运行时使用可达性检查 Internet 连接的网络连接更改?

检查iphone中的网络可达性后应用程序崩溃?

检查可达性和 App Store 提交提示的正确方法

如何检查网络关闭

我应该在哪里执行可达性检查?