0

所以,我知道这里有很多关于实现可达性的帖子,但我找不到任何可以回答我的具体问题的帖子。

我正在实现以下代码,但由于某种原因,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 方法。

任何帮助将不胜感激!

4

1 回答 1

0

你是对的。问题是Reachability调用不是同步的。该方法-checkNetworkStatus:是一个回调,这意味着您不直接调用它。相反,只要系统注意到网络可达性发生了变化,它就会调用该方法本身。实际上,您的代码会在Reachability对象被实例化后立即检查网络状态,并且早在它们从网络得到任何回复之前。删除-checkNetworkStatus:from -viewDidLoad,你应该得到正确的结果。

(无论如何,您都会收到编译器警告,因为kReachabilityChangedNotification它是 a而非 a ——选择并右键单击并执行“跳转到定义”以查看它——它在 中)。#defineNSStringUINotificationReachability.h

-旁注 - 确保你打电话- 如果你忘记并且对象被解除分配,你会遇到烦人的崩溃(这已经让我失望了)[[NSNotificationCenter defaultCenter]removeObserver:self name:kReachabilityChangedNotification object:nil];-dealloc

于 2013-04-11T18:36:45.730 回答