iOS 13获取应用程序statusBar崩溃

时间:2019-07-06 15:31:16

标签: objective-c ios13

仅当像这样的调用代码时在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版本出现崩溃时。

1 个答案:

答案 0 :(得分:0)

+ (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;
}