使用 AFNetworking 检查 Internet 连接状态

Posted

技术标签:

【中文标题】使用 AFNetworking 检查 Internet 连接状态【英文标题】:Check Internet connection state using AFNetworking 【发布时间】:2016-10-26 08:42:34 【问题描述】:

我想创建一个通用类来检查互联网连接,它也应该在互联网改变状态时通知我。

我正在使用 AFNetworking 来检查互联网状态。

这是我尝试过的代码,但它不起作用请帮助我在哪里犯错??

CheckInternet 是我从NSObject 派生的通用类

CheckInternet.h

#import <Foundation/Foundation.h>

@interface CheckInternet : NSObject

+ (void)startNetworkMonitoring;
+ (BOOL)isInternetConnectionAvailable;
@end

CheckInternet.m

#import "CheckInternet.h"
#import "AFNetworking.h"

@implementation CheckInternet


+ (void)startNetworkMonitoring

    [[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:@"reachabilityChanged" object:nil];
                break;
            case 2:
                // AFNetworkReachabilityStatusReachableViaWiFi = 2
                NSLog(@"The reachability status is reachable via WiFi");

                [[NSNotificationCenter defaultCenter] postNotificationName:@"reachabilityChanged" object:nil];
                break;

            default:
                break;
        

    ];


#pragma mark - Check Internet Network Status
+ (BOOL)isInternetConnectionAvailable 
    return [AFNetworkReachabilityManager sharedManager].reachable;


@end

在我的ViewController.m(这里我想查看互联网状态)

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];



     [CheckInternet startNetworkMonitoring];


    if ([CheckInternet isInternetConnectionAvailable])
    
         NSLog(@"---- Internet YES------ ");
    
    else
    
         NSLog(@"----- Internet NO------ ");
    


//This is not called...
- (void)reachabilityChanged:(NSNotification *)notification

    NSLog(@"---- reachabilityChanged ----");

提前致谢!

【问题讨论】:

【参考方案1】:

首先,我建议您在AppDelegate 中开始监控您的网络活动。将[CheckInternet startNetworkMonitoring]; 移至didFinishLaunchingWithOptions

其次,将以下行添加到case == 0

 [[NSNotificationCenter defaultCenter] postNotificationName:@"reachabilityChanged" object:[NSNumber numberWithInteger:one]];

还要确保在通知中发布连接状态。因为它是一个整数,所以需要将它包装在一个对象中(通常是 NSNumber)。

第三,你需要观察reachabilityChanged通知。 将此添加到您的viewDidLoad

 [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(reachabilityChanged:) 
        name:@"reachabilityChanged"
        object:nil];

在您的函数- (void)reachabilityChanged:(NSNotification *)notification 中,您应该能够访问通知的 userInfo 属性并读取那里的状态代码。

另外,一旦你的 viewController 消失了,不要忘记取消观察通知。所以在dealloc

[NSNotificationCenter defaultCenter] removeObserver:self];

【讨论】:

当网络开启/关闭时如何通知? 如果您在 viewController 中观察到 reachabilityChanged ,您希望收到通知,那么您的函数应该被调用。 awesome answer dude 完美运行....但是视图控制器的一个问题 dealloc 方法只被调用了 别担心,它是由操作系统调用的,但我们无法真正跟踪它。将代码留在那里,因此当 VC 解除分配时,它也会删除观察。另外,如果它有效,也许将其标记为已接受的答案?

以上是关于使用 AFNetworking 检查 Internet 连接状态的主要内容,如果未能解决你的问题,请参考以下文章

sys.intern() 做啥以及何时使用?

AFNetworking 检查进度

AFNetworking 检查可用性

AFNetworking 2.0。如何检查套接字的可达性状态(managerForAddress :)?

如何使用 AFNetworking 2.0 检查 Wordpress 登录信息?

在使用 RESideMenu 显示视图控制器之前,使用 AFNetworking 在 didFinishLaunching 中尽快检查可达性