在開發(fā)APP時,涉及網(wǎng)絡連接的時候扳剿,都會想著提前判斷一下當前的網(wǎng)絡連接狀態(tài)框杜,在這里介紹一下如何獲取狀態(tài)欄上的當前的網(wǎng)絡狀態(tài)贾节。
1.獲取狀態(tài)欄
#import "ViewController.h"
#import <objc/message.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// 狀態(tài)欄是由當前app控制的,首先獲取當前app
UIApplication *app = [UIApplication sharedApplication];
// 遍歷當前app的所有屬性撮抓,找到關于狀態(tài)欄的
unsigned int outCount = 0;
Ivar *ivars = class_copyIvarList(app.class, &outCount);
for(int i = 0; i < outCount; i++){
Ivar ivar = ivars[i];
NSLog(@"%s",ivar_getName(ivar));
}
}
打印出來日志如下圖:
屏幕快照 2016-08-02 上午9.41.26.png
通過上圖我們可以看到是有狀態(tài)欄這個成員的雄家,所以直接通過KVC來獲取當前狀態(tài)欄。
2.獲取狀態(tài)欄的所有當前顯示視圖
// 狀態(tài)欄是由當前app控制的胀滚,首先獲取當前app
UIApplication *app = [UIApplication sharedApplication];
//獲取狀態(tài)欄
id statusBar = [app valueForKeyPath:@"statusBar"];
// 遍歷狀態(tài)欄的所有成員
unsigned int outCount = 0;
Ivar *ivars = class_copyIvarList([statusBar class], &outCount);
for(int i = 0; i < outCount; i++){
Ivar ivar = ivars[i];
NSLog(@"%s",ivar_getName(ivar));
}
打印日志如下圖
屏幕快照 2016-08-02 上午10.25.19.png
通過上圖可以看到狀態(tài)欄中有一個foregroundView成員趟济,它就是當前顯示的所有視圖
3.遍歷所有子視圖。
// 狀態(tài)欄是由當前app控制的咽笼,首先獲取當前app
UIApplication *app = [UIApplication sharedApplication];
//獲取狀態(tài)欄的所有子視圖
NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
//遍歷子視圖
for (id child in children) {
NSLog(@"--%@", [child class]);
}
打印日志如下圖
屏幕快照 2016-08-02 上午10.40.07.png
可以看到UIStatusBarDataNetworkItemView就是我們所需要的顯示當前網(wǎng)絡狀態(tài)的視圖顷编。
4.取出用于顯示網(wǎng)絡狀態(tài)的視圖,并遍歷其內部的所有成員變量
// 狀態(tài)欄是由當前app控制的剑刑,首先獲取當前app
UIApplication *app = [UIApplication sharedApplication];
//獲取狀態(tài)欄的所有子視圖
NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
//遍歷子視圖
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
unsigned int outCount = 0;
Ivar *ivars = class_copyIvarList([child class], &outCount);
for(int i = 0; i < outCount; i++){
Ivar ivar = ivars[i];
NSLog(@"%s",ivar_getName(ivar));
}
}
}
屏幕快照 2016-08-02 上午10.46.30.png
此時就可以看到有_dataNetworkType這個成員媳纬,很明顯它就是用來表示當前網(wǎng)絡狀態(tài)的
5.取得當前網(wǎng)絡狀態(tài)
// 狀態(tài)欄是由當前app控制的双肤,首先獲取當前app
UIApplication *app = [UIApplication sharedApplication];
//獲取狀態(tài)欄的所有子視圖
NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
int type = 0;
//遍歷子視圖
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
}
}
NSLog(@"----%d", type);
打印出的type數(shù)字對應的網(wǎng)絡狀態(tài)依次是:0 - 無網(wǎng)絡; 1 - 2G; 2 - 3G; 3 - 4G; 5 - WIFI