iOS AFNetworking

AFNetworkReachabilityManager

这个类主要是监听当前的网络状态,并通过通知广播给调用者。

网络状态有如下几种,分别对应的未知、断网、移动网络、Wi-Fi

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

官方已经提供一个句柄来标识网络地址状态,就是它”SCNetworkReachabilityRef”,先看看AFNetworkReachabilityManager其中几个初始化方法。

  • 第一个方法使用domain参数来初始化一个实例,同理第二个方法使用address来初始化实例。这里需要注意,如果使用非Cocoa框架的类创建一个实例,需要手动对这个对象进行内存管理。
  • 第四个方法是作者推荐用的初始化方法,根据当前iOS开发最低支持编译版本是否大于9.0来创建对应的网络协议对象,大于9.0则创建IPv6,否则创建IPv4
+ (instancetype)managerForDomain:(NSString *)domain {
    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [domain UTF8String]);
    AFNetworkReachabilityManager *manager = [[self alloc] initWithReachability:reachability];
    CFRelease(reachability);
    return manager;
}

+ (instancetype)managerForAddress:(const void *)address {
    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)address);
    AFNetworkReachabilityManager *manager = [[self alloc] initWithReachability:reachability];
    CFRelease(reachability);
    return manager;
}

- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability {
    self = [super init];
    if (!self) {
        return nil;
    }
    _networkReachability = CFRetain(reachability);
    self.networkReachabilityStatus = AFNetworkReachabilityStatusUnknown;
    return self;
}

+ (instancetype)manager {
// __IPHONE_OS_VERSION_MIN_REQUIRED 表示当前开发环境最低支持的版本号
// 编译时判断如果当前iOS开发环境版本低于9.0则使用IPv4,否则使用IPv6的结构体

#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 90000) || (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
    struct sockaddr_in6 address;
    bzero(&address, sizeof(address));
    address.sin6_len = sizeof(address);
    address.sin6_family = AF_INET6;
#else
    struct sockaddr_in address;
    bzero(&address, sizeof(address));
    address.sin_len = sizeof(address);
    address.sin_family = AF_INET;
#endif
    return [self managerForAddress:&address];
}
  • 开启监听
- (void)startMonitoring {
    [self stopMonitoring];

    if (!self.networkReachability) {
        return;
    }

     // 设置网络状态监听回调
    __weak __typeof(self)weakSelf = self;
    AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) {
        __strong __typeof(weakSelf)strongSelf = weakSelf;
        strongSelf.networkReachabilityStatus = status;
        if (strongSelf.networkReachabilityStatusBlock) {
            strongSelf.networkReachabilityStatusBlock(status);
        }
    };

    SCNetworkReachabilityContext context = {0, (__bridge void *)callback, AFNetworkReachabilityRetainCallback, AFNetworkReachabilityReleaseCallback, NULL};
    SCNetworkReachabilitySetCallback(self.networkReachability, AFNetworkReachabilityCallback, &context);
    SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{
        SCNetworkReachabilityFlags flags;
        if (SCNetworkReachabilityGetFlags(self.networkReachability, &flags)) {
            AFPostReachabilityStatusChange(flags, callback);
        }
    });
}
  • 关闭监听
- (void)stopMonitoring {
    if (!self.networkReachability) {
        return;
    }

    SCNetworkReachabilityUnscheduleFromRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • AFNetworking使用详解 导语: 众所周知,AFNetworking是目前IOS开发中非常受欢迎的第三方网...
    奋拓达阅读 2,817评论 10 2
  • 文 六孑箫 岁月都斑驳了身影 还是不懂别离 悄无声息的挥手 假装你们在我面前 列车驶来的霎那 强忍的微笑瞬...
    六孑箫阅读 615评论 2 4
  • 不明天地阴阳之变化,故畏鬼神。不能脱困于掌腹,故畏猛兽。不能凭风借力于殿堂,故畏举子。 其有畏,缘其无为。故有力拔...
    浅夏慕阳阅读 243评论 0 2
  • 我要谈的文学,当是纯文学,这得除开诸如网络文学、青春文学、评论文学以及大部分的新闻。这是因为在我浅显的一点儿认知里...
    伊洋Lyon阅读 577评论 0 0