【问题标题】:Get cellular signal from statusbar crash从状态栏崩溃中获取蜂窝信号
【发布时间】:2018-03-08 13:13:54
【问题描述】:

以下是我的代码,我正在尝试通过状态栏获取信号强度。

UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];

在(iOS 11、Xcode 9、iPhone X)上发生崩溃:-

[UIStatusBar_Modern valueForUndefinedKey:]:这个类不符合键foregroundView的键值编码

【问题讨论】:

  • 你想要什么?无线信号?没有酒吧?
  • wifi信号活跃栏数?还是信号模式?
  • @KiranJasvanee 我想要网络类型 3g、4g、Wifi、LTE ..

标签: ios11 xcode9 uistatusbar iphone-x


【解决方案1】:

你可以用这个

NSArray *subviews = nil;
id statusBar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
if ([statusBar isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
    subviews = [[[statusBar valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
} else {
    subviews = [[statusBar valueForKey:@"foregroundView"] subviews];
}

【讨论】:

  • 我在发布这个问题时遇到问题,如果有 wifi、3g 或 lte,从哪个键获取 ..?
  • 谢谢@yz wu,这正是我想要的+1
  • @Ashish 上面的 sn-p 代码解决了 iPhone X 更改的问题。要获取代码,您必须循环子视图以提取 UIStatusBarDataNetworkItemView 视图,然后获取其 dataNetworkType 值。它是这样的。 for (id subview in subviews) {if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {[(NSNumber*)[subview valueForKey:@"dataNetworkType"] intValue]; // dataNetworkType value be sure to store and use it, or return it from a methodbreak;}}
【解决方案2】:

使用这个:

- (NSString*)newtworkType {
    NSArray *subviews = nil;
    id statusBar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
    if ([statusBar isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
        subviews = [[[statusBar valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
    } else {
        subviews = [[statusBar valueForKey:@"foregroundView"] subviews];
    }
    NSNumber *dataNetworkItemView = nil;

    for (id subview in subviews) {
        if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
            dataNetworkItemView = subview;
            break;
        }
    }

    switch ([[dataNetworkItemView valueForKey:@"dataNetworkType"]integerValue]) {
        case 0:
            return @"No wifi or cellular";
            break;

        case 1:
            return @"2G";
            break;

        case 2:
            return @"3G";
            break;

        case 3:
            return @"4G";
            break;

        case 4:
            return @"LTE";
            break;

        case 5:
            return @"WIFI";
            break;


        default:
            break;

    }
    return @"";
}

【讨论】:

    猜你喜欢
    • 2013-01-05
    • 2011-06-24
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多