美文网首页
判断iPhoneX网络状态

判断iPhoneX网络状态

作者: MccReeee | 来源:发表于2018-02-07 10:23 被阅读40次

通过遍历statusBar上层级视图结构来判断iphoneX的网络状态,其实在以前的iphone6/7/plus等机型上这个办法一直可用,不过在iphoneX上多了刘海之后,statusBar层级结构略有改变,所以判断的视图变了.

这个方法用在iphoneX上判断网络状态也是有缺陷的,就是只能区分wifi 手机网络无信号 这三种,具体是4G,3G,2G其实是无法区分的.

  • 代码如下

NSString+MR.h

#import <UIKit/UIKit.h>

@interface NSString (MR)

/**
 获取网络状态
 */
+ (NSString *)getNetStatus;

@end

NSString+MR.m

//屏幕高度
#define H [UIScreen mainScreen].bounds.size.height
#define W [UIScreen mainScreen].bounds.size.width
//适配iPhoneX的宏
#define k_iPhoneX (W == 375.f && H == 812.f ? YES : NO)

#import "NSString+MR.h"
#import <UIKit/UIApplication.h>
@implementation NSString (MR)

+ (NSString *)getNetStatus{
    NSString *network = @"";
    UIApplication *app = [UIApplication sharedApplication];//获取当前app
    UIView *statusBar = [app valueForKeyPath:@"statusBar"];
    if (k_iPhoneX) {
        id statusBarView = [statusBar valueForKeyPath:@"statusBar"];
        UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"];
        NSArray *subviews = [[foregroundView subviews][2] subviews];
        for (id subview in subviews) {
            if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
                network = @"WIFI";
            }else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) {
                network = [subview valueForKeyPath:@"originalText"];
            }
        }
        return network;
    }else{
        UIApplication *app = [UIApplication sharedApplication];//获取当前app
        NSArray *chidren = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
        int type = 0;
        for(id child in chidren){
            if([child isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
                type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
            }
        }
        switch(type) {
            case 0:
                network = @"notReachable";
                break;
            case 1:
                network = @"2g";
                break;
            case 2:
                network = @"3g";
                break;
            case 3:
                network = @"4g";
                break;
            case 4:
                network = @"LTE";
                break;
            case 5:
                network = @"wifi";
                break;
            default:
                break;
        }
        return network;
    }
}
@end

相关文章

网友评论

      本文标题:判断iPhoneX网络状态

      本文链接:https://www.haomeiwen.com/subject/redozxtx.html