iOS AFNetworking

AFNetworkReachabilityManager

這個(gè)類主要是監(jiān)聽當(dāng)前的網(wǎng)絡(luò)狀態(tài),并通過(guò)通知廣播給調(diào)用者。

網(wǎng)絡(luò)狀態(tài)有如下幾種,分別對(duì)應(yīng)的未知、斷網(wǎng)、移動(dòng)網(wǎng)絡(luò)、Wi-Fi

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

官方已經(jīng)提供一個(gè)句柄來(lái)標(biāo)識(shí)網(wǎng)絡(luò)地址狀態(tài),就是它”SCNetworkReachabilityRef”,先看看AFNetworkReachabilityManager其中幾個(gè)初始化方法。

  • 第一個(gè)方法使用domain參數(shù)來(lái)初始化一個(gè)實(shí)例,同理第二個(gè)方法使用address來(lái)初始化實(shí)例。這里需要注意,如果使用非Cocoa框架的類創(chuàng)建一個(gè)實(shí)例,需要手動(dòng)對(duì)這個(gè)對(duì)象進(jìn)行內(nèi)存管理。
  • 第四個(gè)方法是作者推薦用的初始化方法,根據(jù)當(dāng)前iOS開發(fā)最低支持編譯版本是否大于9.0來(lái)創(chuàng)建對(duì)應(yīng)的網(wǎng)絡(luò)協(xié)議對(duì)象,大于9.0則創(chuàng)建IPv6,否則創(chuàng)建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 表示當(dāng)前開發(fā)環(huán)境最低支持的版本號(hào)
// 編譯時(shí)判斷如果當(dāng)前iOS開發(fā)環(huán)境版本低于9.0則使用IPv4,否則使用IPv6的結(jié)構(gòu)體

#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];
}
  • 開啟監(jiān)聽
- (void)startMonitoring {
    [self stopMonitoring];

    if (!self.networkReachability) {
        return;
    }

     // 設(shè)置網(wǎng)絡(luò)狀態(tài)監(jiān)聽回調(diào)
    __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);
        }
    });
}
  • 關(guān)閉監(jiān)聽
- (void)stopMonitoring {
    if (!self.networkReachability) {
        return;
    }

    SCNetworkReachabilityUnscheduleFromRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • AFNetworking使用詳解 導(dǎo)語(yǔ): 眾所周知,AFNetworking是目前IOS開發(fā)中非常受歡迎的第三方網(wǎng)...
    奮拓達(dá)閱讀 2,870評(píng)論 10 2
  • 文 六孑簫 歲月都斑駁了身影 還是不懂別離 悄無(wú)聲息的揮手 假裝你們?cè)谖颐媲?列車駛來(lái)的霎那 強(qiáng)忍的微笑瞬...
    六孑簫閱讀 654評(píng)論 2 4
  • 不明天地陰陽(yáng)之變化,故畏鬼神。不能脫困于掌腹,故畏猛獸。不能憑風(fēng)借力于殿堂,故畏舉子。 其有畏,緣其無(wú)為。故有力拔...
    淺夏慕陽(yáng)閱讀 288評(píng)論 0 2
  • 我要談的文學(xué),當(dāng)是純文學(xué),這得除開諸如網(wǎng)絡(luò)文學(xué)、青春文學(xué)、評(píng)論文學(xué)以及大部分的新聞。這是因?yàn)樵谖覝\顯的一點(diǎn)兒認(rèn)知里...
    伊洋Lyon閱讀 602評(píng)論 0 0

友情鏈接更多精彩內(nèi)容