You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.6 KiB
139 lines
4.6 KiB
// |
|
// 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
|
|
|