36

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

 -(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 方法中调用的。我的代码有问题吗,因为它不起作用?

4

7 回答 7

101

你让这变得比它需要的更困难。试试这个:

- (void)viewDidLoad {
   [super viewDidLoad];

   [[AFNetworkReachabilityManager sharedManager] startMonitoring];

}

- (BOOL)connected {
    return [AFNetworkReachabilityManager sharedManager].reachable;
}   

如果您还想在状态更改时收到通知,请实施setReachabilityStatusChangeBlock

希望这可以帮助!

于 2013-11-14T18:23:29.527 回答
64

那是因为只有在可达性改变时才会执行该块。

要获取当前状态,您可以执行以下操作:

- (BOOL)connected {
    return [AFNetworkReachabilityManager sharedManager].reachable;
}
于 2013-11-04T19:55:45.343 回答
11

您有两个代码错误会阻止您的代码工作。

首先,您对“开始监控”的调用发生在响应可达性更改而触发的块内——因此,该块永远不会触发(除非您在其他地方开始监控)。

其次,无法保证该块何时触发。结果,您将始终看到“可达”返回它初始化为的任何值——显然这通常为空。即使您修复了第一个错误,也不能保证(实际上不太可能)该块会在您返回之前触发。

最后,在更一般的层面上,您还尝试以同步方式测试只能异步执行的代码。也就是说,可达性管理器不可能瞬间准确地确定可达性。它可以说“我认为我在使用 WiFi”或“我认为我在使用 3G”,但它还需要检查它是否真的可以连接互联网(因此得名可达性)才能确定。可达性不仅仅关乎“我有 wifi”或“我有 3g”连接,还关乎您是否可以通过它访问互联网。这意味着设备实际上必须发送请求,虽然从技术上讲,这可以以同步方式完成,异步完成,并且有充分的理由。如果你这样做是同步的,你会阻塞你的 UI,直到网络调用返回......可能会在 30、40、50 甚至 60 秒之后,这取决于相关的超时。

您应该做的是在您的应用程序中启动可达性单例监控,并加载应用程序委托的方法,然后稍后检索它的数据。在不知道您的应用程序结构的情况下,我什至不会尝试保证准确性,但这至少应该有所帮助。

于 2013-12-17T19:36:23.753 回答
7

试试这个,

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

在你的ViewController中,

[[HttpManager sharedObject] isNetworkRechable];

注意:不要一开始就检查networkRechability。因为它不会起作用。所以请等待至少 1 秒来检查它。

于 2015-10-13T06:00:00.210 回答
6

根据我的经验,

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

执行需要一点时间,setReachabilityStatusChangeBlock所以从-(BOOL)connected.

因此,一旦网络连接/断开连接,您就可以执行一些任务。

以下功能最好在现场(同步)检查连接性:

[AFNetworkReachabilityManager sharedManager].reachable;
于 2015-03-30T14:32:51.180 回答
3

其他答案都是错误的!最好使用它来检查可用性:

if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable)

原因是因为最初 networkReachabilityStatus 将设置为 AFNetworkReachabilityStatusUnknown,直到调用更改状态块,这会阻止您的代码认为网络不可用时不可用。

于 2016-03-29T15:35:04.940 回答
1
- (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;
            }

        }];
    }
于 2016-10-08T22:12:30.820 回答