使用 iOS SDK 检查 Internet 连接 [重复]

Posted

技术标签:

【中文标题】使用 iOS SDK 检查 Internet 连接 [重复]【英文标题】:Check for Internet connection using the iOS SDK [duplicate] 【发布时间】:2012-11-24 00:13:44 【问题描述】:

使用 ios SDK 检查互联网连接的最佳方法是什么?

【问题讨论】:

【参考方案1】:

最好的方法是使用可达性代码。检查here for apple sample code。这有很多方便的方法来检查互联网可用性、Wifi/WAN 连接检查等。

例如:-

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChanged:) name:kReachabilityChangedNotification object:nil];

reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];

- (void)networkChanged:(NSNotification *)notification


  NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

  if(remoteHostStatus == NotReachable)  NSLog(@"not reachable");
  else if (remoteHostStatus == ReachableViaWiFiNetwork)  NSLog(@"wifi"); 
  else if (remoteHostStatus == ReachableViaCarrierDataNetwork)  NSLog(@"carrier"); 

【讨论】:

你怎么知道谁投了反对票?顺便说一句.. +1 你的答案:) ReachableViaCarrierDataNetwork & ReachableViaWiFiNetwork 不可用,状态可以是ReachableViaWWANReachableViaWiFi 只有在通知之后才会显示,但需要在网络更改之前。 viewdidload方法调用时如何获取可用网络.. 最佳答案...你能告诉我,如何使用单个代码检查整个应用程序的可达性吗?【参考方案2】:

Reachability 比它需要的要多得多,而且它还没有针对 ARC 进行更新。

这是我用纯 C 语言编写的解决方案。大部分代码直接取自 Reachability,但只提炼出必要的部分。我只希望它返回是否有互联网连接,但您可以从 cmets 中读取它是否根据找到 Wifi 或蜂窝网络返回 YES。

在继续共享代码之前的最后一个注意事项:您需要进入构建目标,选择构建阶段选项卡,然后将“SystemConfiguration.framework”添加到“Link Binary With Libraries”列表中。

#import <CoreFoundation/CoreFoundation.h>
#import <SystemConfiguration/SystemConfiguration.h>
#import <netdb.h>

BOOL networkReachable()

    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *) &zeroAddress);

    SCNetworkReachabilityFlags flags;
    if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) 
        if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) 
            // if target host is not reachable
            return NO;
        

        if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0) 
            // if target host is reachable and no connection is required
            //  then we'll assume (for now) that your on Wi-Fi
            return YES; // This is a wifi connection.
        


        if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0)
            ||(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) 
            // ... and the connection is on-demand (or on-traffic) if the
            //     calling application is using the CFSocketStream or higher APIs

            if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) 
                // ... and no [user] intervention is needed
                return YES; // This is a wifi connection.
            
        

        if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) 
            // ... but WWAN connections are OK if the calling application
            //     is using the CFNetwork (CFSocketStream?) APIs.
            return YES; // This is a cellular connection.
        
    

    return NO;

【讨论】:

我非常喜欢您的解决方案,但我个人会做一些小的修改。我认为您应该返回一个常量或 ENUM 元素,而不是返回一个 BOOL 元素,这样我们才能确定是否存在连接以及什么类型。幸运的是,这个修改并不难! 我相信我在这里犯了一个错误并且这段代码泄漏了。 SCNetworkReachabilityRef 需要在某个时候发送到 CFRelease() ......最好的方法可能是打破 SCNetworkReachabilityGetFlags() 并存储其值,然后释放可达性 ref,然后继续执行 if 并检查储值。这样,堆上存储的 SCNetworkReachability 占用的内存就会被释放,但此时您需要的所有内容(标志和 SCNetworkReachabilityGetFlags() 的返回值)在堆栈上仍然可用。【参考方案3】:

试试这个代码:

- (BOOL)connectedToInternet

   NSURL *url=[NSURL URLWithString:@"http://www.google.com"];
   NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
   [request setHTTPMethod:@"HEAD"];
   NSHTTPURLResponse *response;
   [NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL];

   return ([response statusCode]==200)?YES:NO;

【讨论】:

以上是关于使用 iOS SDK 检查 Internet 连接 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Reachability 2.2 检查 Internet 连接

使用 AFNetworking 检查 Internet 连接状态

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

IOS / Objective-C:检查互联网连接的最快方法 - 2017 [重复]

如何使用 .NET、C# 和 WPF 检查 Internet 连接

如何在 xamarin 表单共享项目中检查 Internet 连接