AFNetworking联网状态监测初探索

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BelugaW/article/details/52249453

个人博客链接 http://yintokey.github.io/2016/07/20/AFNetworking%E8%81%94%E7%BD%91%E7%8A%B6%E6%80%81%E7%9B%91%E6%B5%8B%E5%88%9D%E6%8E%A2%E7%B4%A2/

基本使用

 1.创建manager
      AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
2.配置
    [mgr.reachabilityManager    setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        if (status==AFNetworkReachabilityStatusReachableViaWiFi ||status==AFNetworkReachabilityStatusReachableViaWWAN) {
            NSLog(@"可以联网");
        }else if(status==AFNetworkReachabilityStatusNotReachable){
            [MBProgressHUD showError:@"请检查网络连接"];
        }else{
            NSLog(@"未知网络");
        }
    }];
3.开启监测
    [mgr.reachabilityManager startMonitoring];

第一步创建AFHTTPSessionManager的实例对象比较熟悉,就不多说了。
第二步的mgr.reachabilityManager ,查看它的定义

#if !TARGET_OS_WATCH
///--------------------------------------
/// @name Monitoring Network Reachability
///--------------------------------------

/**
 The network reachability manager. `AFURLSessionManager` uses the `sharedManager` by default.
 */
@property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager;
#endif

这是一个预编译,我们先进入TARGET_OS_WATCH的定义来看一下。
截取了部分代码:

/*
 *    gcc based compiler used on Mac OS X
 */

#if defined(__GNUC__) && ( defined(__APPLE_CPP__) || defined(__APPLE_CC__) || defined(__MACOS_CLASSIC__) )
     #define TARGET_OS_WATCH             0

TARGET_OS_WATCH 是运行于Mac OS X的gcc编译器下 的一个宏。我们跳回reachabilityManager的声明,由于TARGET_OS_WATCH是0,因此#if !TARGET_OS_WATCH,字面上的意思是 如果系统监测开启,那么就声明一个AFNetworkReachabilityManager的实例变量。
我们继续看第二步里AFNetworkReachabilityStatus
在头文件里有个枚举量

typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
    AFNetworkReachabilityStatusUnknown          = -1,
    AFNetworkReachabilityStatusNotReachable     = 0,
    AFNetworkReachabilityStatusReachableViaWWAN = 1,
    AFNetworkReachabilityStatusReachableViaWiFi = 2,
};

从字面意思也挺容易理解,这里我们深入挖掘一下这些状态码
在 AFNetworkReachabilityManager.m里我们看到这么一段代码

NSString * AFStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus status) {
    switch (status) {
        case AFNetworkReachabilityStatusNotReachable:
            return NSLocalizedStringFromTable(@"Not Reachable", @"AFNetworking", nil);
        case AFNetworkReachabilityStatusReachableViaWWAN:
            return NSLocalizedStringFromTable(@"Reachable via WWAN", @"AFNetworking", nil);
        case AFNetworkReachabilityStatusReachableViaWiFi:
            return NSLocalizedStringFromTable(@"Reachable via WiFi", @"AFNetworking", nil);
        case AFNetworkReachabilityStatusUnknown:
        default:
            return NSLocalizedStringFromTable(@"Unknown", @"AFNetworking", nil);
    }

其中 NSLocalizedStringFromTable是一个宏,我们查看它的定义

#define NSLocalizedStringFromTable(key, tbl, comment) \
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:(tbl)]

这是一个本地化相关的宏,似乎从这里还看不到我们所想要的信息,我们继续看 AFNetworkReachabilityManager.m文件,

static AFNetworkReachabilityStatus AFNetworkReachabilityStatusForFlags(SCNetworkReachabilityFlags flags) {
    BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0);
    BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0);
    BOOL canConnectionAutomatically = (((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || ((flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0));
    BOOL canConnectWithoutUserInteraction = (canConnectionAutomatically && (flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0);
    BOOL isNetworkReachable = (isReachable && (!needsConnection || canConnectWithoutUserInteraction));

    AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusUnknown;
    if (isNetworkReachable == NO) {
        status = AFNetworkReachabilityStatusNotReachable;

最后,在这里我们可以看到AFNetworking的联网状态监测,其实就是是对 iOS 的 Availability 里的 SCNetworkReachability API进一步封装.

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页