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

//
// 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