// // TFNetworkManager.m // WXReader // // Created by 谢腾飞 on 2020/12/3. // Copyright © 2020 xtfei_2011@126.com. All rights reserved. // #import "TFNetworkManager.h" @interface TFNetworkManager () @end @implementation TFNetworkManager + (void)cellularDataRestrictionDidUpdateNotifier:(void(^)(CTCellularDataRestrictedState status))complete { CTCellularData *cellularData = [[CTCellularData alloc] init]; cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState status) { if (complete) { complete(status); } }; } + (CTCellularDataRestrictedState)currentNetworkStatus { if (TARGET_IPHONE_SIMULATOR) return kCTCellularDataNotRestricted; CTCellularDataRestrictedState __block state; CTCellularData *cellularData = [[CTCellularData alloc] init]; dispatch_semaphore_t signal = dispatch_semaphore_create(0); cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState status) { state = status; dispatch_semaphore_signal(signal); }; dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER); cellularData.cellularDataRestrictionDidUpdateNotifier = nil; return state; } + (TFNetworkType)currentNetworkType { if (@available(iOS 13.0, *)) { UIStatusBarManager *statusBarManager = kRCodeSync([UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager); id statusBar = nil; // 获取当前的状态栏 if (![statusBarManager respondsToSelector:NSSelectorFromString(@"createLocalStatusBar")]) return TFNetworkTypeUnknown; SEL selector = NSSelectorFromString(@"createLocalStatusBar"); IMP imp = [statusBarManager methodForSelector:selector]; UIView * (*func) (id, SEL) = (void *)imp; UIView *localStatusBar = kRCodeSync(func(statusBarManager, selector)); if ([localStatusBar respondsToSelector:NSSelectorFromString(@"statusBar")]) { SEL selector = NSSelectorFromString(@"statusBar"); IMP imp = [localStatusBar methodForSelector:selector]; id (*func) (id, SEL) = (void *)imp; statusBar = func(localStatusBar, selector); } if (!statusBar) return TFNetworkTypeUnknown; id currentData = [[statusBar valueForKeyPath:@"_statusBar"] valueForKeyPath:@"currentData"]; id wifiEntry = [currentData valueForKeyPath:@"wifiEntry"]; id cellularEntry = [currentData valueForKeyPath:@"cellularEntry"]; if (wifiEntry && [[wifiEntry valueForKeyPath:@"isEnabled"] boolValue]) { return TFNetworkTypeWiFi; } if (cellularEntry && [[cellularEntry valueForKeyPath:@"isEnabled"] boolValue]) { NSNumber *type = [cellularEntry valueForKeyPath:@"type"]; if (![type boolValue]) return TFNetworkTypeUnknown; switch (type.integerValue) { case 0: return TFNetworkTypeNone; case 1: return TFNetworkType2G; case 4: return TFNetworkType3G; case 5: return TFNetworkType4G; default: return TFNetworkTypeDefault; } } } // iOS13.0以下的处理方法 YYReachability* reach = [YYReachability reachabilityWithHostname:@"www.baidu.com"]; if (reach.status == YYReachabilityStatusNone) { return TFNetworkTypeNone; } else if (reach.status == YYReachabilityStatusWWAN) { return TFNetworkType4G; } else { return TFNetworkTypeWiFi; } } + (BOOL)networkingStatus { BOOL originStatus = [AFNetworkReachabilityManager sharedManager].reachable; if (originStatus == NO) { TFNetworkType currentStatus = [self currentNetworkType]; if (currentStatus == TFNetworkTypeNone || currentStatus == TFNetworkTypeUnknown) { return NO; } else { return YES; } } return YES; } + (void)networkingStatus:(void(^)(BOOL status))complete { AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { if (status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi) { if (complete) { complete(YES); } } else { if (complete) { complete(NO); } } }]; [manager startMonitoring]; } @end