Ios AF2.0可达性

Ios AF2.0可达性,ios,iphone,afnetworking,Ios,Iphone,Afnetworking,我试图通过使用AFNetworking 2.0和“AFNetworkReachabilityManager”来确定用户是否连接到internet,但它似乎不起作用。它总是返回存在有效的internet连接,即使internet已关闭。 这是我的代码: -(BOOL)connected { __block BOOL reachable; [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChan

我试图通过使用AFNetworking 2.0和“AFNetworkReachabilityManager”来确定用户是否连接到internet,但它似乎不起作用。它总是返回存在有效的internet连接,即使internet已关闭。 这是我的代码:

 -(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;
            }

        }];
    }