所以,我知道这里有很多关于实现Reachability的帖子,但我找不到任何能回答我特定问题的帖子。
我正在实现以下代码,但由于某种原因,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方法。
真的很感激任何帮助!
答案 0 :(得分:0)
你是对的。问题是Reachability
调用不是同步的。方法-checkNetworkStatus:
是callback,这意味着您不直接调用它。相反,只要系统注意到网络可达性已发生变化,它就会调用方法本身。实际上,您的代码在实例化Reachability
对象之后立即检查网络状态,并且很久才能从网络获得任何回复。
从-checkNetworkStatus:
移除-viewDidLoad
,您应该会得到正确的结果。
(无论如何,您将收到编译器警告,因为kReachabilityChangedNotification
是#define
的{{1}}而不是NSString
- 选择并右键单击并执行“跳转到定义”以查看此内容 - 它位于UINotification
)。
- 侧面注意 - 确保你在Reachability.h
中调用[[NSNotificationCenter defaultCenter]removeObserver:self name:kReachabilityChangedNotification object:nil];
- 如果你忘了并且对象被解除分配,你将会遇到令人讨厌的崩溃事件(之前我已经抓住了)。