小说绘上架版本
This commit is contained in:
+55
@@ -0,0 +1,55 @@
|
||||
//
|
||||
// TFNetworkManager.h
|
||||
// WXReader
|
||||
//
|
||||
// Created by 谢腾飞 on 2020/12/3.
|
||||
// Copyright © 2020 xtfei_2011@126.com. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <CoreTelephony/CTCellularData.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
/*** 详细的网络类型 ***/
|
||||
typedef NS_ENUM(NSUInteger, TFNetworkType) {
|
||||
/** 默认类型 WWAN */
|
||||
TFNetworkTypeDefault = 0,
|
||||
/** 无网络 */
|
||||
TFNetworkTypeNone = 1,
|
||||
/** 未知网络 */
|
||||
TFNetworkTypeUnknown = 2,
|
||||
/** LTE */
|
||||
TFNetworkTypeLTE = 3,
|
||||
/** WiFi */
|
||||
TFNetworkTypeWiFi = 4,
|
||||
/** 2G */
|
||||
TFNetworkType2G = 5,
|
||||
/** 3G */
|
||||
TFNetworkType3G = 6,
|
||||
/** 4G */
|
||||
TFNetworkType4G = 7,
|
||||
|
||||
};
|
||||
|
||||
@interface TFNetworkManager : NSObject
|
||||
|
||||
/// 实时获取APP网络访问状态
|
||||
/// @param complete 一个回调,返回APP的网络访问状态
|
||||
+ (void)cellularDataRestrictionDidUpdateNotifier:(void(^)(CTCellularDataRestrictedState status))complete;
|
||||
|
||||
/// 获取APP网络访问状态
|
||||
+ (CTCellularDataRestrictedState)currentNetworkStatus;
|
||||
|
||||
/// 获取网络类型
|
||||
+ (TFNetworkType)currentNetworkType;
|
||||
|
||||
/// 获取APP的联网状态,YES:有网络,NO:无网络
|
||||
+ (BOOL)networkingStatus;
|
||||
|
||||
/// 实时获取APP的联网状态
|
||||
/// @param complete 一个回调,返回APP的联网状态,YES:有网络,NO:无网络
|
||||
+ (void)networkingStatus:(void(^)(BOOL status))complete;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
+139
@@ -0,0 +1,139 @@
|
||||
//
|
||||
// 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
|
||||
Reference in New Issue
Block a user