iOS-获取当前的网络状态总结

方法一:通过一些网络类框架
如常用的AFNetworking中有一个Reachability的类,可以检测当前的网络状态

+ (void)getNetworkStates {
    // 监控网络状态
    AFNetworkReachabilityManager *reachability = [AFNetworkReachabilityManager sharedManager];
    [reachability setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"状态不知道");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"没网络");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WIFI");
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"流量");
                break;
            default:
                break;
        }
    }];
    //开始监控
    [reachability startMonitoring];
}

方法二:自己去获取网络情况(不通过第三方)

这里说一下思路:主要是获取程序的状态栏状态
由于很多的成员变量都是类私有的,都是通过了runtime去获取的,所以先写了个方法去通过runtime获取一些类的属性列表

/**
 * 通过一个类的名称获取一个类的成员变量列表
 * @param className 类的名称
 */
- (void)getIvarListByClassName:(NSString *)className {
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList(NSClassFromString(className), &count);
    for (int i = 0; i < count; i++) {
        Ivar ivar = ivars[i];
        const char *name = ivar_getName(ivar);
        NSString *objcName = [NSString stringWithUTF8String:name];
        NSLog(@"%d : %@", i, objcName);
    }
}

这样可以传入UIApplication看到有一个成员变量_statusBar
然后可以传入UIStatusBar看到有一个成员变量_foregroundView
最后从_foregroundView的子视图上找到对应信息
...
最后就可以通过以下的代码获取网络状态了

+ (NSString *)getNetworkStates {
    UIApplication *app = [UIApplication sharedApplication];
    NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
    NSString *state = [[NSString alloc] init];
    int netType = 0;
    for (id child in children) {
        if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
            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:
                    break;
            }
        }
    }
    return state;
}

你可能感兴趣的:(iOS-获取当前的网络状态总结)