检查 Internet 访问是否可用

Kes*_*lme 0 nsurlrequest reachability ios nsurlsession nsurlsessionconfiguration

在我的应用程序中,我只想在可以访问互联网的情况下拨打网络电话。

注意:我连接到没有互联网的 WiFi 点

我想测试互联网是否可用。我尝试使用这里描述的可达性,我也尝试了一个更简单的解决方案,如这里描述

问题在于 Reachability 会返回 Internet 可达的信息,而当它不可达时。另一种解决方案需要太多时间才能做出响应。我试图为请求和会话设置超时间隔,但它被忽略了。

如果我连接到没有互联网的 wifi,如何测试互联网可达性?

这是我使用的一些代码:

- (void) postAsyncTaskWithUrl:(NSString*)urlString
                      andType:(NSString*)requestType
                     andToken:(NSString*)token
          andPropertiesObject:(id)propObject
                   urlEncoded:(BOOL)isUrlEncoded
                  withSuccess:(nullable void(^)(id _Nullable))success
                   andFailure:(nullable void(^)(id _Nullable))failure
{

    internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];

    __weak typeof(self) weakSelf = self;
    // Internet is reachable
    internetReachableFoo.reachableBlock = ^(Reachability*reach)
    {
                 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlSt];
        [request setTimeoutInterval:20]; //Ignored ... WHY?

        NSURLSessionConfiguration *sessionConfigurations = [NSURLSessionConfiguration defaultSessionConfiguration];
        [sessionConfigurations setTimeoutIntervalForRequest:20]; //Ignored ... WHY?
        [sessionConfigurations setTimeoutIntervalForResource:20]; //Ignored ... WHY?
//        NSURLSession *session = [NSURLSession sharedSession];
        NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfigurations];
        [[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {


     }

}

}
Run Code Online (Sandbox Code Playgroud)

Seb*_*hec 5

尽管这是过去在历史上做过的事情,但我不认为值得尝试检查网络是否可访问,因为它不是可靠的事情,或者在几乎所有情况下发出请求之前都应该做的事情现在的情况。

根据苹果官方文档

始终尝试建立连接。不要试图猜测网络服务是否可用,也不要缓存该决定

Jared Sinclair 关于这个主题的类似博客文章,使用SCNetworkReachability(这是 Reachability 库在幕后使用的):

SCNetworkReachability 应仅用于影响您对已失败的网络请求执行的操作,而不是尚未尝试的初始请求。使用否定状态来确定您是否尝试自动重试,或调整警报的面向用户的语言。使用肯定状态来考虑重试较早失败的请求。永远不要仅仅因为 SCNetworkReachability 认为没有可访问的网络而阻止尝试用户发起的请求

借用最近的 Reddit 帖子

可达性是 iOS 世界中的一个或“这些主题”。互联网可达是什么意思?即使您检查网络接口,您也可能无法访问 apple.com 或 google.com。即使您访问 Google,您也可能无法访问您的本地服务器或云。如果您检查是否可以访问您感兴趣的服务器,为什么不立即发送请求?