Ios AF2.0可达性
我试图通过使用AFNetworking 2.0和“AFNetworkReachabilityManager”来确定用户是否连接到internet,但它似乎不起作用。它总是返回存在有效的internet连接,即使internet已关闭。 这是我的代码:Ios AF2.0可达性,ios,iphone,afnetworking,Ios,Iphone,Afnetworking,我试图通过使用AFNetworking 2.0和“AFNetworkReachabilityManager”来确定用户是否连接到internet,但它似乎不起作用。它总是返回存在有效的internet连接,即使internet已关闭。 这是我的代码: -(BOOL)connected { __block BOOL reachable; [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChan
-(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
希望这有帮助 您有两个代码错误,它们将阻止您的代码工作 首先,您对“启动监视”的调用发生在响应可达性更改而触发的块内部——因此,该块永远不会触发(除非您在别处开始监视) 第二,无法保证该街区何时起火。因此,您将始终看到“reachable”返回它初始化为的任何值——显然这通常是空的。即使您修复了第一个错误,也不能保证(实际上不太可能)在您返回之前会触发块 最后,在更一般的层面上,您还尝试以同步方式测试只能异步执行的代码。也就是说,可达性管理器不可能在瞬间准确地确定可达性。它可以说‘我想我在使用WiFi’或‘我想我在使用3G’,但在确定之前,它还需要检查它是否真的可以访问互联网(因此称为可达性)。可达性不仅仅是“我有一个wifi”或“我有一个3g”连接,它还关系到你是否可以通过它访问互联网。这意味着设备实际上必须发送一个请求,虽然从技术上讲,这可以以同步方式完成,但书中的每一条规则都坚持网络代码必须异步完成,这是有充分理由的。如果是同步的,则会阻止UI,直到网络调用返回。。。可能是30、40、50甚至60秒之后,这取决于相关的超时 您应该做的是在应用程序中启动应用程序委托的did load方法中的可达性单例监视,然后稍后检索其数据。在不了解应用程序结构的情况下,我甚至不会尝试保证准确性,但这至少会有所帮助。根据我的经验
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
执行setReachabilityStatusChangeBlock
需要一些时间,因此从-(BOOL)connected
返回值是没有用的
所以,一旦网络连接/断开,您就可以执行某些任务
以下功能最适合在现场(同步)检查连接:
试试这个
在AppDelegate中,使用选项方法完成启动
{ // 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];
注意:不要一开始就检查网络可访问性。因为它不起作用。因此,请至少等待1秒钟进行检查。其他答案是错误的! 最好使用此选项检查可用性:
if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable)
原因是,在调用更改状态块之前,NetworkReachibilityStatus最初将被设置为AfNetworkReachibilityStatus Unknown,这会阻止代码认为网络不可用时网络不可用。为什么不使用apple给出的示例?因为我使用AFP网络。但感谢您的评论:)请确保执行[[AFNetworkReachabilityManager sharedManager]startMonitoring];谢谢你的回答。但它似乎不起作用,它总是返回NO(未连接),即使WIFI和3G已打开/关闭。知道为什么会这样吗?这是目前的状况。可能您想收听
网络可达性IDChangeNotification
或使用可达性状态更改块
获取更新。您是在实际设备上运行还是在模拟器中运行?模拟器并不总是知道它的网络可用性是什么。看看下面的答案。您应该在viewDidLoad中启动监视,并稍微检查一下连接情况。这总是返回FALSE:(这很好用。我不需要在我的.pch文件中导入。记住在实际设备上测试这一点,因为在iOS模拟器中,它似乎总是返回true
。模拟器只返回计算机的状态。尝试断开网络连接,你就会看到。@mikker问题是切断了你电脑上的wifiac later似乎不会触发状态更改块。它只适用于初始检查。很好的解决方案,值得欣赏。很好的解决方案。谢谢@Balaji G这应该是公认的答案!非常有用,谢谢。
- (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;
}
}];
}
- (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;
}
}];
}