AFNetworking 2.0可达性
我试图确定用户是否通过使用AFNetworking 2.0和“AFNetworkReachabilityManager”连接到互联网,但似乎没有工作。 即使closures了互联网,总有一个有效的互联网连接。 这是我的代码:
-(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方法调用的。 我的代码有问题,因为它不工作?
这是因为该块只在可达性发生变化时执行。
要获得当前状态,可以这样做:
- (BOOL)connected { return [AFNetworkReachabilityManager sharedManager].reachable; }
你正在使这比它需要更困难。 尝试这个:
- (void)viewDidLoad { [super viewDidLoad]; [[AFNetworkReachabilityManager sharedManager] startMonitoring]; } - (BOOL)connected { return [AFNetworkReachabilityManager sharedManager].reachable; }
如果您还想在状态更改时收到通知,请执行setReachabilityStatusChangeBlock
希望这可以帮助!
你有两个代码错误会阻止你的代码工作。
首先,对“开始监控”的调用发生在响应可达性改变而触发的块内部,因此,块将永远不会启动(除非您开始监控其他地方)。
其次,这个街区什么时候起火也不能保证。 因此,您总是会看到“可达”返回初始化的任何值 – 显然这通常是空值。 即使你修正了第一个错误,但是在你返回之前,没有任何保证(实际上也不太可能)该块会被触发。
最后,在更一般的层面上,你也试图以同步方式testing只能asynchronous执行的代码。 也就是说,可达性pipe理器不可能即刻准确地确定可达性。 它可以说'我认为我在使用WiFi'或者'我认为我在使用3G',但是它也需要检查它是否真的可以到达互联网(因此名称可达性),然后才能确定。 可达性不仅仅是“我有一个wifi”或“我有一个3g”的连接,这也是关于你是否可以通过它连接到互联网。 这意味着设备实际上必须发送一个请求,虽然这在技术上可以以同步的方式完成,但书中的每条规则都坚持认为networking代码必须asynchronous完成,并且有充分的理由。 如果你是同步的,你会阻止你的用户界面,直到networking调用返回…可能是一个很好的30,40,50,甚至60秒后,取决于相关的超时。
你应该做的是开始在你的应用程序的单身监控可达性负载方法的应用程序委托,然后检索它的数据。 不知道你的应用程序的结构,我甚至不会保证准确性,但至less应该有所帮助。
尝试这个,
在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; } }
在你的控制器中 ,
[[HttpManager sharedObject] isNetworkRechable];
注意 :不要首先检查networkRechability 。 因为它不会工作。 所以请等待至less1秒钟来检查它。
根据我的经验,
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
需要花一些时间来执行setReachabilityStatusChangeBlock
所以没有用-(BOOL)connected
返回值。
所以一旦networking连接/断开,你可以执行一些任务。
以下function最好是在现场检查连通性(同步):
[AFNetworkReachabilityManager sharedManager].reachable;
其他的答案是错的! 最好用这个来检查可用性:
if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable)
之所以这样,是因为最初networkReachabilityStatus将被设置为AFNetworkReachabilityStatusUnknown,直到更改状态块被调用,这会阻止代码认为networking不可用时不可用。
- (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; } }]; }