您的位置:首页 > 理论基础 > 计算机网络

iOS用来获取设备上的网络状态(2G,3G,WIFI...)

2016-02-22 14:57 411 查看
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()

@property (nonatomic, copy) NSString *status;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [[self class] networkingStatesFromStatebar];
    [self AFNetWorkingStatus];
}

//  使用这种方法时一定要保证statusbar(状态栏)没有隐藏。如果你的App隐藏了statusbar,那么你也就不能通过这种方法获得网络状态。
+ (NSString *)networkingStatesFromStatebar {

    //
状态栏是由当前app控制的,首先获取当前app
    UIApplication *app = [UIApplication sharedApplication];

    
    NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];

    
    int type = 0;
    for (id child in children) {
        if ([child isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
            type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
        }
    }

    
    NSString *stateString = @"wifi";

    
    switch (type) {
        case 0:
            stateString = @"notReachable";  //
没有网络
            NSLog(@"%@", stateString);
            break;

            
        case 1:
            stateString = @"2G";
            NSLog(@"%@", stateString);
            break;

            
        case 2:
            stateString = @"3G";NSLog(@"%@", stateString);
            break;

            
        case 3:
            stateString = @"4G";NSLog(@"%@", stateString);
            break;

            
        case 4:
            stateString = @"LTE";  //
比4G更快的蜂窝网
            NSLog(@"%@", stateString);
            break;

            
        case 5:
            stateString = @"wifi";
            NSLog(@"%@", stateString);
            break;

            
    }

    
    return stateString;
}

- (void)AFNetWorkingStatus
{
    /**
     AFNetworkReachabilityStatusUnknown          = -1,  //
未知
     AFNetworkReachabilityStatusNotReachable     = 0,   //
无连接
     AFNetworkReachabilityStatusReachableViaWWAN = 1,   // 3G
花钱
     AFNetworkReachabilityStatusReachableViaWiFi = 2,   // WiFi
     */

    //
如果要检测网络状态的变化,必须用检测管理器的单例的startMonitoring
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];

    

    //
检测网络连接的单例,网络变化时的回调方法
    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

        

        
        if (status == -1) {
            //未知
            self.status = @"您目前网络状态为:未知,请小心";
            [self showalt];

            
        } else if (status == 0) {
            //无连接
            self.status = @"您目前网络状态为:无连接";

            
            [self showalt];
        } else if (status == 1) {
            //3g网络
            self.status = @"您目前网络状态为供应商网络,请注意流量";
            [self showalt];
        } else if (status == 2) {
            //wifi连接
            self.status = @"您目前网络状态为:wifi,请放心浏览";

            
            [self showalt];
        }
    }];
}

- (void)showalt
{
    UIAlertController *al = [UIAlertController alertControllerWithTitle:@"提示" message:self.status preferredStyle:(UIAlertControllerStyleAlert)];
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"确定" style:(UIAlertActionStyleCancel) handler:nil];
    [al addAction:cancel];

    
    [self presentViewController:al animated:YES completion:nil];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息