在iOS应用中检查网络连接的位置

时间:2014-07-01 07:08:25

标签: ios objective-c

我正在处理一个处理Web服务的iOS应用程序。我正在使用this code来检测我是否有网络连接。如果我没有互联网连接,我将展示一个视图,说明没有互联网连接(类似于iOS应用商店的方式)。我的问题是,我不确定将此代码放入哪种方法。

我希望每次用户打开应用程序和/或使用其他应用程序切换到应用程序(即我的应用程序在后台打开并且用户切换到它)时,它会检查网络状态。我认为把它放在我的应用程序委托会工作,但它没有。我还考虑过把它放在我的每个视图控制器viewWillAppear方法中,但是没有用。

关于在何处放置此代码的任何想法?

3 个答案:

答案 0 :(得分:5)

如果您打算使用网络连接,则应该查看AFNetworking https://github.com/AFNetworking/AFNetworking

最新版本的AFNetworking(2.0)现在建立在NSURLSession之上,因此您可以获得所有提供的强大功能。但是,您还可以获得许多额外的功能 - 例如序列化,可达性支持,UIKit集成(例如在UIImageView中异步加载图像的便捷类别)等等。它也是最广泛使用的开源项目之一,在Github上拥有超过10,000颗星,2,​​600个分叉和160个贡献者。

它有一个名为AFNetworkReachabilityManager的功能来处理您的请求。

[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    DLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
    switch (status) {
        case AFNetworkReachabilityStatusReachableViaWWAN:
        case AFNetworkReachabilityStatusReachableViaWiFi:
            [operationQueue setSuspended:NO];
            NSLog(@"WIFI");
            break;
        case AFNetworkReachabilityStatusNotReachable:
        default:
            [operationQueue setSuspended:YES];
            NSLog(@"oflline");
            break;
    }
}];

您可以找到此代码here

答案 1 :(得分:2)

理想情况下,您应该在每次网络请求之前检查有效的互联网连接。

但是您发布的链接仅用于检测当时的网络状态。您需要观察通知,这会在网络状态发生变化时通知您。

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(networkStateChanged:)
                                                 name:kReachabilityChangedNotification object:nil];
Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];

- (void)networkStateChanged:(NSNotification *)notice {
    NetworkStatus currentNetStatus = [reachability currentReachabilityStatus];
    if (currentNetStatus == NotReachable) {
        // No Internet connection
    } else {
        // We are back !
    }
}

此观察员应该在您的app委托中。

答案 2 :(得分:1)

我为我的案例所做的是,我已将下面的片段放在didFinishLaunchingWithOptions

// Instantiate Shared Manager
[AFNetworkReachabilityManager sharedManager];

// Start network networking monitoring
[[AFNetworkReachabilityManager sharedManager] startMonitoring];

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));


    if ([[AFNetworkReachabilityManager sharedManager] isReachable]) {
        NSLog(@"IS REACHABILE");

        //Here check if your network connection view is already showing on screen, if positive then remove it
        if (_viewNetworkConnectionCheck) {
          //[_viewNetworkConnectionCheck removeFromSuperView];  
           _viewNetworkConnectionCheck = nil;
        }
    } else {

        NSLog(@"NOT REACHABLE");

        //You have to add your network connectivity view here, just make sure if has been has not been allowcated
        if (!_viewNetworkConnectionCheck) {

            //[[UIApplication sharedApplication].keyWindow addSubview:_viewNetworkConnectionCheck];
        }
    }
}];

此外,如果您每次应用程序从后台状态转到前台状态时都必须调用Web服务,那么您可以做的是(或我已经做了什么)将下面的代码放在委托applicationWillEnterForeground中

[self performSelector:@selector(callWebserviceToRefreshData) withObject:nil afterDelay:0.5f];

并在安全地检查互联网连接后添加此方法来调用Web服务

 -(void)callWebserviceToRefreshData {

      if ([JeebleyHelper isConnected]) {
         NSLog(@"Yes, network available");
         //Call your web service here
      } else {
         NSLog(@"No, network not available");
      }
}

请确保在一段时间延迟后调用dataRefresh方法,否则isConnected将始终为您提供以前的状态。

+ (BOOL)isConnected {
     return [AFNetworkReachabilityManager sharedManager].reachable;
}