可达性hostStatus返回false negative

vdicta 发布于 2019-03-09 ios 最后更新 2019-03-09 14:32 3 浏览

所以,我知道这里有很多关于实现可达性的帖子,但是我找不到任何回答我的具体问题的帖子。 我正在实现下面的代码,但由于某种原因,hostStatus总是作为NotReachable返回。 我的.h文件:

#import <UIKit/UIKit.h>
#import "Reachability.h"
@class Reachability;
@interface ViewController : UIViewController<UINavigationControllerDelegate>{
Reachability* hostReachable;
  Reachability* internetReachable;
}
@property (nonatomic, assign) BOOL wifiReachable;
@property (nonatomic, assign) BOOL networkReachable;
@property (nonatomic, assign) BOOL internetUsable;
我的.m文件:
#import "ViewController.h"
#import "Reachability.h"
#import "Reachability.m"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad{
  [super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];
internetReachable = [Reachability reachabilityForInternetConnection];
  hostReachable = [Reachability reachabilityWithHostName:@"www.google.com"];
[internetReachable startNotifier];
   [hostReachable startNotifier];
  // now patiently wait for the notification
  [self checkNetworkStatus:kReachabilityChangedNotification];
if(self.internetUsable==TRUE){
    //DO STUFF
  }
  else{
    [self internetAlert];
    //DO OTHER STUFF
  }
}
-(void) checkNetworkStatus:(NSNotification *)notice{
// called after network status changes
  NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
  NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
  NSLog(@"%u", hostStatus);
  if(internetStatus==NotReachable){
    NSLog(@"The internet is down.");
    self.internetUsable=FALSE;
  }
  else{
    if(internetStatus==ReachableViaWWAN){
      NSLog(@"The internet is working via WWAN.");
      self.networkReachable=TRUE;
      self.internetUsable=TRUE;
    }
    else if (internetStatus==ReachableViaWiFi) {
      NSLog(@"The internet is working via WIFI.");
      self.wifiReachable=TRUE;
      self.internetUsable=TRUE;
    }
    else{
      self.networkReachable=FALSE;
      self.wifiReachable=FALSE;
      self.internetUsable=FALSE;
      NSLog(@"The internet is NOT useable.");
    }
  }
if(self.internetUsable==TRUE)
  {
if(hostStatus==NotReachable)
    {
      self.internetUsable=FALSE;
      NSLog(@"Could not connect to the host");
    }
  }
}
我的猜测是在hostStatus连接正确检查之前,它正在进入CheckNetworkStatus方法。 任何帮助真的会很感激!
已邀请:

tiure

赞同来自:

你是对的。问题是Reachability调用不是同步的。方法-checkNetworkStatus:callback,这意味着您不直接调用它。相反,只要系统注意到网络可达性发生了变化,它就会调用方法本身。实际上,您的代码在Reachability对象实例化之后立即检查网络状态,并且很久才能从网络获得任何回复。 从-viewDidLoad中删除-checkNetworkStatus:,您应该得到正确的结果。 (无论如何,你将获得编译器警告,因为kReachabilityChangedNotificationNSString#define而不是UINotification - 选择并右键单击并执行'跳转到定义'以查看此信息 - 它位于Reachability.h中。

  • 注意 - 确保你在-dealloc中调用[[NSNotificationCenter defaultCenter]removeObserver:self name:kReachabilityChangedNotification object:nil]; - 如果你忘了并且对象被解除分配你会得到恼人的崩溃(这之前我已经抓住了)。