3

Below is my code and I am trying to get signal strength through status bar.

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

Crash occurred on (iOS 11, Xcode 9, iPhone X):-

[UIStatusBar_Modern valueForUndefinedKey:]: this class is not key value coding-compliant for the key foregroundView

Ashish
  • 1,899
  • 20
  • 22

2 Answers2

6

you can use this

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];
}
yz wu
  • 71
  • 2
  • I am having issue post this, from which key to get if wifi, 3g or lte is there .. ? – Ashish Sep 28 '17 at 10:05
  • Thank you @yz wu this is exactly what I was looking for +1 – victor.vasilica Nov 30 '17 at 12:37
  • @Ashish the above snippet of code solves the issue with iPhone X changes. To get the code you have to loop the subviews to extract `UIStatusBarDataNetworkItemView` view and then get its `dataNetworkType` value. It goes something like this. `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 method` `break;` `}` `}` – victor.vasilica Nov 30 '17 at 12:47
0

Use This:

- (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 @"";
}
Abhishek Gupta
  • 601
  • 5
  • 16