首页 > 解决方案 > 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 版本时我收到崩溃。

标签: objective-cios13

解决方案


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

推荐阅读