this code must be changed as there‘s no longer a status bar or status bar window.
原创
©著作权归作者所有:来自51CTO博客作者拔山河的原创作品,请联系作者获取转载授权,否则将追究法律责任
ModalName: 文件日志, ErrorLevel: Error, Function: UncaughtExceptionHandler, Line: 227, Format: <- 2021-04-19 15:59:36 ->[ Uncaught Exception ]
Name: NSInternalInconsistencyException, Reason: App called -statusBar or -statusBarWindow on UIApplication: this code must be changed as there’s no longer a status bar or status bar window. Use the statusBarManager object on the window scene instead.
[ Fe Symbols Start ]
0 CoreFoundation 0x0000000187881880 727F2644-EB4E-3D57-BC2E-E6803BA92366 + 1202304
1 libobjc.A.dylib 0x000000019c89ac50 objc_exception_throw + 60
2 CoreFoundation 0x0000000187787000 727F2644-EB4E-3D57-BC2E-E6803BA92366 + 176128
3 Foundation 0x0000000188b1b91c 7698BF3E-0CF6-31C0-85E9-562714F01276 + 518428
4 UIKitCore 0x000000018a23e068 8518EAE3-832B-3FF0-9FA5-9DBE3041F26C + 12386408
5 UIKitCore 0x000000018a23e55c 8518EAE3-832B-3FF0-9FA5-9DBE3041F26C + 12387676
6 Foundation 0x0000000188aa8f14 7698BF3E-0CF6-31C0-85E9-562714F01276 + 48916
7 稚美家长端 0x0000000104d56000 -[BITSingleObject getNetWorkStatesWithStatus:] + 248
8 稚美家长端 0x0000000104c0c3ec __38-[PPBizModule monitoringNetworkStatus]_block_invoke + 344
9 稚美家长端 0x0000000104ca1600 __47-[AFNetworkReachabilityManager startMonitoring]_block_invoke + 148
10 稚美家长端 0x0000000104ca1cc0 __AFPostReachabilityStatusChange_block_invoke + 80
11 libdispatch.dylib 0x0000000105f9bbcc _dispatch_call_block_and_release + 32
12 libdispatch.dylib 0x0000000105f9d6c0 _dispatch_client_callout + 20
13 libdispatch.dylib 0x0000000105facf34 _dispatch_main_queue_callback_4CF + 1000
14 CoreFoundation 0x00000001877fd11c 727F2644-EB4E-3D57-BC2E-E6803BA92366 + 659740
15 CoreFoundation 0x00000001877f7120 727F2644-EB4E-3D57-BC2E-E6803BA92366 + 635168
16 CoreFoundation 0x00000001877f621c CFRunLoopRunSpecific + 600
17 GraphicsServices 0x000000019f3c0784 GSEventRunModal + 164
18 UIKitCore 0x000000018a236ee8 8518EAE3-832B-3FF0-9FA5-9DBE3041F26C + 12357352
19 UIKitCore 0x000000018a23c75c UIApplicationMain + 168
20 稚美家长端 0x0000000104bea330 main + 140
21 libdyld.dylib 0x00000001874b66b0 21B19919-1334-38BC-B233-896E929945E0 + 5808
[ Fe Symbols End ]
.
原因分析:
// iOS 13 弃用keyWindow属性 从所有windowl数组中取
代码修改例子:
//请注意:该函数只有在显示状态栏的页面才能获取到2G/3G/4G网络
- (BGNetworkReachabilityStatus)getNetWorkStatesWithStatus : (AFNetworkReachabilityStatus)status
{
if(AFNetworkReachabilityStatusUnknown == status)
{
return BGNetworkReachabilityStatusUnknown;
}
else if(AFNetworkReachabilityStatusNotReachable == status)
{
return BGNetworkReachabilityStatusNotReachable;
}
else if(AFNetworkReachabilityStatusReachableViaWiFi == status)
{
return BGNetworkReachabilityStatusReachableViaWiFi;
}else if (@available(iOS 12.1, *))
{
return [self getNetType];
}
// if(LL_iPhoneX)
// {
// return BGNetworkReachabilityStatusReachableViaWWAN;
// }
UIApplication *app = [UIApplication sharedApplication];
// NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];
NSArray *children;
// 不能用 [[self deviceVersion] isEqualToString:@"iPhone X"] 来判断,因为模拟器不会返回 iPhone X
// NSLog(@"%@ %@", [[app valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar"], [[[app valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar.currentData"]);
if (@available(iOS 13.0, *))
{
return BGNetworkReachabilityStatusReachableViaWWAN;
}
else
{
if ([[app valueForKeyPath:@"_statusBar"] isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
children = [[[[app valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];
}
else
{
children = [[[app valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];
// if ([[app valueForKeyPath:@"_statusBar"] isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
// id curData = [statusBar valueForKeyPath:@"statusBar.currentData"];
// BOOL wifiEnable = [[curData valueForKeyPath:@"_wifiEntry.isEnabled"] boolValue];
// BOOL cellEnable = [[curData valueForKeyPath:@"_cellularEntry.isEnabled"] boolValue];
// // iPhone X上通过StatusBar只能获取到网络是WiFi还是蜂窝网
// // 当网络为蜂窝网的时候,无法获取到具体的网络状态
// if (wifiEnable) {
// states = @"WiFi";
// } else if (cellEnable) {
// states = @"Cellular";
// }
}
int netType = 0;
//获取到网络返回码
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
//获取到状态栏
netType = [[child valueForKeyPath:@"dataNetworkType"]intValue];
switch (netType) {
case 0:
{
NSLog(@"无网络");
//无网模式
return BGNetworkReachabilityStatusNotReachable;
}
break;
case 1:
{
NSLog(@"2G");
return BGNetworkReachabilityStatusReachableViaWWAN2G;
}
break;
case 2:
{
NSLog(@"3G");
return BGNetworkReachabilityStatusReachableViaWWAN3G;
}
break;
case 3:
{
NSLog(@"4G");
return BGNetworkReachabilityStatusReachableViaWWAN4G;
}
case 4:
{
NSLog(@"5G");
return BGNetworkReachabilityStatusReachableViaWWAN5G;
}
break;
case 5:
{
NSLog(@"wifi");
return BGNetworkReachabilityStatusReachableViaWWAN5G;
}
break;
default:
break;
}
}
//根据状态选择
return BGNetworkReachabilityStatusReachableViaWWAN;
}
}
return BGNetworkReachabilityStatusReachableViaWWAN;
}