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.
140 lines
4.6 KiB
140 lines
4.6 KiB
4 years ago
|
//
|
||
|
// 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
|