objective-c - iOS 13 获取应用程序状态栏崩溃
问题描述
只有在调用这样的代码时才会在 beta2 和 beta 3 上崩溃:
[application valueForKeyPath:@"statusBar"]
有些可以帮助我吗?我调用这个方法来获取手机的网络状态。整个代码是这样的:
if (![self isIPhoneX]) {
if ([[application valueForKeyPath:@"_statusBar"] isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
children = [[[[application valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];
} else {
children = [[[application valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];
}
Class expectClass = NSClassFromString(@"UIStatusBarDataNetworkItemView");
for (id child in children) {
if ([child isKindOfClass:expectClass]) {
int netType = [[child valueForKeyPath:@"dataNetworkType"] intValue];
switch (netType) {
case 0: state = @"";break;
case 1: state = @"2g";break;
case 2: state = @"3g";break;
case 3: state = @"4g";break;
case 5: state = @"wifi";break;
default: state = @"";break;
} /* switch */
}
}
} else {
id statusBar = [application valueForKeyPath:@"statusBar"];
id statusBarView = [statusBar valueForKeyPath:@"statusBar"];
UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"];
children = [[foregroundView subviews][2] subviews];
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
state = @"wifi";
}else if ([child isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) {
NSString *str = [child valueForKeyPath:@"_originalText"];
if ([str isEqualToString:@"4G"]) {
state = @"4g";
}else if([str isEqualToString:@"3G"]){
state = @"3g";
} else{
state = @"2g";
}
}
}
}
我安装了 iOS 13 公开测试版,除了显示一些标签外,一切都运行良好......,但在线 beta2 和 beta3 版本时我收到崩溃。
解决方案
+ (NSString *)deviceNetworkingType
{
NSString *strNetworkInfo = @"No Network";
struct sockaddr_storage zeroAddress;
bzero(&zeroAddress,sizeof(zeroAddress)); zeroAddress.ss_len = sizeof(zeroAddress);
zeroAddress.ss_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL,(struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability,&flags);
CFRelease(defaultRouteReachability);
if(!didRetrieveFlags){ return strNetworkInfo;}
BOOL isReachable = ((flags & kSCNetworkFlagsReachable)!=0);
BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired)!=0);
if(!isReachable || needsConnection) {return strNetworkInfo;}
if((flags & kSCNetworkReachabilityFlagsConnectionRequired)== 0){
strNetworkInfo = @"WIFI";
}
if(((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0) {
if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0){
strNetworkInfo = @"WIFI";
}
}
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) ==kSCNetworkReachabilityFlagsIsWWAN) {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CTTelephonyNetworkInfo * info = [[CTTelephonyNetworkInfo alloc] init];
NSString *currentRadioAccessTechnology = info.currentRadioAccessTechnology;
if (currentRadioAccessTechnology) {
if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
strNetworkInfo =@"4G";
} else if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) {
strNetworkInfo =@"2G";
} else {
strNetworkInfo =@"3G";
}
}
} else {
if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable) {
if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {
if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {
strNetworkInfo =@"2G";
} else {
strNetworkInfo =@"3G";
}
}
}
}
}
return strNetworkInfo;
}
推荐阅读
- meshlab - 从 3D 表面模型构建点云文本文件
- r - 从宽到长,成对组合列,但保留 ID 列 - R
- three.js - 通过动态更新 TubeBufferGeometry 的曲线创建光迹效果
- javascript - 如何将 JavaScript 数组索引值作为文本值输出到 html a-tag?
- split - 如何使用 C++20 std::views::split 将 std::string_views 拆分为类似元组的对象?
- spring - 在 Spring Webflux 中通过请求生命周期共享数据
- python - 箱线图可视化
- python - 用python更新json文件
- r - GGPLOT Facet Zoom 出于某种原因返回长度错误
- wordpress - 一些 Woocommerce 客户未显示在客户部分