【问题标题】:AFNetworking 2.0 ReachabilityAFNetworking 2.0 可达性
【发布时间】:2013-11-04 19:38:05
【问题描述】:

我正在尝试使用 AFNetworking 2.0 和“AFNetworkReachabilityManager”确定用户是否已连接到互联网,但它似乎不起作用。即使互联网已关闭,它总是返回有效的互联网连接。 这是我的代码:

 -(BOOL)connected {

   __block BOOL reachable;

    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

        switch (status) {
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"No Internet Connection");
                reachable = NO;
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WIFI");

                reachable = YES;
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"3G");
                reachable = YES;
                break;
            default:
                NSLog(@"Unkown network status");
                reachable = NO;
                break;

                [[AFNetworkReachabilityManager sharedManager] startMonitoring];
        }
    }];

    return reachable;

}

这个方法是从我的 viewDidLoad 方法中调用的。我的代码有问题吗,因为它不起作用?

【问题讨论】:

标签: ios iphone afnetworking


【解决方案1】:

你让这变得比它需要的更困难。试试这个:

- (void)viewDidLoad {
   [super viewDidLoad];

   [[AFNetworkReachabilityManager sharedManager] startMonitoring];

}

- (BOOL)connected {
    return [AFNetworkReachabilityManager sharedManager].reachable;
}   

如果你也想在状态变化时得到通知,那么实现setReachabilityStatusChangeBlock

希望这会有所帮助!

【讨论】:

  • 这很完美。我不需要在我的 .pch 文件中使用 #import <SystemConfiguration/SystemConfiguration.h>。请记住在实际设备上进行测试,因为在 iOS 模拟器中它似乎总是返回 true
  • 模拟器只返回您计算机的状态。尝试断开网络,您会看到。
  • @mikker 问题是稍后在您的 Mac 上切断 wifi 似乎不会触发状态更改块。它仅适用于初始检查。
【解决方案2】:

这是因为该块仅在可达性更改时执行。

要获取当前状态,您可以这样做:

- (BOOL)connected {
    return [AFNetworkReachabilityManager sharedManager].reachable;
}

【讨论】:

  • 感谢您的回答。但它似乎不起作用,它总是返回 NO(未连接),即使 WIFI 和 3G 已打开/关闭。知道为什么会这样吗?
  • 这是当前状态。也许您想收听AFNetworkingReachabilityDidChangeNotification 或使用reachabilityStatusChangeBlock 获取更新。
  • 您是在实际设备上运行,还是在模拟器中运行?模拟器并不总是知道它的网络可用性是什么。
  • 看看下面的答案。您应该在 viewDidLoad 中开始监控并稍微检查一下连接性
  • 这总是返回 FALSE :(
【解决方案3】:

您有两个代码错误会阻止您的代码工作。

首先,您对“开始监控”的调用发生在响应可达性更改而触发的块内 - 因此,该块永远不会触发(除非您在其他地方开始监控)。

其次,无法保证该块何时会触发。结果,您将始终看到“可达”返回它初始化为的任何值——显然这通常为空。即使您修复了第一个错误,也不能保证(实际上不太可能)该块会在您返回之前触发。

最后,在更一般的层面上,您还尝试以同步方式测试可以异步执行的代码。也就是说,可达性管理器不可能瞬间准确地确定可达性。它可以说“我认为我在使用 WiFi”或“我认为我在使用 3G”,但它还需要检查它是否真的可以访问互联网(因此名称为可达性) 在确定之前。可达性不仅仅关乎“我有 wifi”或“我有 3g”连接,还关乎您是否可以通过它访问互联网。这意味着设备实际上必须发送请求,虽然从技术上讲,这可以以同步方式完成,但书中的每一条规则都坚持网络代码必须异步完成,并且永远原因。如果你这样做是同步的,你会阻塞你的 UI,直到网络调用返回......可能会在 30、40、50 甚至 60 秒之后,这取决于相关的超时时间。

您应该做的是在您的应用程序中启动可达性单例监控,并在应用程序委托的加载方法中,然后稍后检索它的数据。在不知道您的应用程序结构的情况下,我什至不会尝试保证准确性,但这至少应该有所帮助。

【讨论】:

  • 这应该是公认的答案!很有帮助,谢谢。
【解决方案4】:

试试这个,

AppDelegate中,didFinishLaunchingWithOptions方法

{ // SETUP AFNETWORKING's NETWORK INDICATOR AND REACHABILITY
    [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];
}

HttpManager 类中,

- (BOOL)isNetworkRechable {

    if ([AFNetworkReachabilityManager sharedManager].reachable) {

        if ([AFNetworkReachabilityManager sharedManager].isReachableViaWiFi)
            NSLog(@"Network reachable via WWAN");
        else
            NSLog(@"Network reachable via Wifi");

        return YES;
    }
    else {

        NSLog(@"Network is not reachable");
        return NO;
    }
}

yourViewController中,

[[HttpManager sharedObject] isNetworkRechable];

注意:一开始不要检查networkRechability。因为它不会起作用。所以请等待至少 1 秒来检查它。

【讨论】:

  • 很好的解决方案,值得欣赏
  • 不错的解决方案。谢谢@Balaji G
【解决方案5】:

根据我的经验,

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

执行setReachabilityStatusChangeBlock 需要一点时间,所以从-(BOOL)connected 返回值是没有用的。

因此,一旦网络连接/断开连接,您就可以执行一些任务。

以下功能最好现场检查连接(同步):

[AFNetworkReachabilityManager sharedManager].reachable;

【讨论】:

    【解决方案6】:

    其他答案是错误的! 最好使用它来检查可用性:

    if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable)
    

    原因是因为最初 networkReachabilityStatus 将设置为 AFNetworkReachabilityStatusUnknown 直到调用更改状态块,这会阻止您的代码认为网络不可用时不可用。

    【讨论】:

      【解决方案7】:
      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
          // Override point for customization after application launch.
      
          [self checkNetworkReachability];
      }    
      
      
      +(BOOL) isReachable{
         return [AFNetworkReachabilityManager sharedManager].reachable;
      }
      
      +(void) checkNetworkReachability{
              [[AFNetworkReachabilityManager sharedManager] startMonitoring];
              [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
                  NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
      
                  // Check the reachability status and show an alert if the internet connection is not available
                  switch (status) {
                      case -1:
                          // AFNetworkReachabilityStatusUnknown = -1,
                          NSLog(@"The reachability status is Unknown");
                          break;
                      case 0:
                          // AFNetworkReachabilityStatusNotReachable = 0
                          NSLog(@"The reachability status is not reachable");
                          break;
                      case 1:
                          NSLog(@"The reachability status is reachable via wan");
                          [[NSNotificationCenter defaultCenter] postNotificationName:@"Network_Reachable" object:nil];
                          break;
                      case 2:
                          // AFNetworkReachabilityStatusReachableViaWiFi = 2
                          NSLog(@"The reachability status is reachable via WiFi");
      
                          [[NSNotificationCenter defaultCenter] postNotificationName:@"Network_Reachable" object:nil];
                          break;
      
                      default:
                          break;
                  }
      
              }];
          }
      

      【讨论】:

        猜你喜欢
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-28
        相关资源
        最近更新 更多