【问题标题】:Where to check for network connection in iOS app在 iOS 应用中检查网络连接的位置
【发布时间】:2014-07-01 07:08:24
【问题描述】:

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

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

知道把这段代码放在哪里吗?

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    如果你打算使用网络连接,你应该看看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

    【讨论】:

    • "If you plan to use networks connections for any reasons, you should take a look at AFNetworking" 有点大胆的声明。为什么我们应该使用AFNetworking 而不是任何其他第三方库或苹果自己的NSURLConnection?为什么不改用ASIHTTPRequest? (请注意,我确切地知道原因,我的意思是您需要支持您的陈述。在您的回答中,请不要只发表评论)
    • 感谢@Popeye 的反馈。我希望这会更好。
    • 那好多了+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 !
        }
    }
    

    这个观察者应该在你的应用委托中。

    【讨论】:

      【解决方案3】:

      我为我的案例所做的是,我在 didFinishLaunchingWithOptions 中将 sn-p 放在下面

      // 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 服务,那么您可以做的是(或者我所做的是)将委托应用程序WillEnterForeground 中的 sn-p 放在下面

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

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

       -(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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-12
        • 2019-10-03
        • 2021-09-29
        • 1970-01-01
        • 2016-12-21
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        相关资源
        最近更新 更多