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

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

【问题讨论】:

    标签: iphone objective-c ios ipad connection


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多