獲取當前網路狀態
阿新 • • 發佈:2019-02-13
runtime獲取網路狀態
首先匯入標頭檔案:
#import <objc/message.h>
實現如下程式碼判斷:
// 狀態列是由當前控制器控制的,首先獲取當前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")] {
type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
}
}
// type數字對應的網路狀態依次是:0:無網路;1:2G網路;2:3G網路;3:4G網路;5:WIFI訊號
NSLog(@"type is '%d'." , type);
tips:此方法通過真機除錯,只對真機有效,模擬器由於始終Wi-Fi線上,因此不能準確獲取模擬器當前網路狀態。
系統方法
第1步:新增
SystemConfiguration
庫;選中
Target
,進入工程配置介面 -> 選擇Build Phases
->選擇Link Binary With Libraries
-> 點選+
->輸入SystemConfiguration.framework
->點選Add
第2步:匯入框架
#import <CommonCrypto/CommonHMAC.h>
#import <SystemConfiguration/SystemConfiguration.h>
#import <netdb.h>
#import <arpa/inet.h>
- 第3步:宣告網路判斷方法
- (BOOL)connectedToNetwork;
- 第4步:實現網路判斷方法
- (BOOL)connectedToNetwork {
// 建立零地址,0.0.0.0的地址表示查詢本機的網路連線狀態
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// SCNetworkReachabilityCreateWithAddress:根據傳入的IP地址測試連線狀態,當為0.0.0.0時則可以查詢本機的網路連線狀態。
// 使用SCNetworkReachabilityCreateWithAddress:可以根據傳入的網址地址測試連線狀態
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
printf("Error. Could not recover network reachability flags\n");
return NO;
}
// kSCNetworkReachabilityFlagsReachable:能夠連線網路
// kSCNetworkReachabilityFlagsConnectionRequired:能夠連線網路,但是首先得建立連線過程
// kSCNetworkReachabilityFlagsIsWWAN:判斷是否通過蜂窩網覆蓋的連線
BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
return (isReachable && !needsConnection) ? YES : NO;
}
- 第5步:呼叫方法
if (![self connectedToNetwork]) {
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"溫馨提示"
message:@"網路連線失敗,請檢查網路"
delegate:self
cancelButtonTitle:@"確定"
otherButtonTitles:nil, nil];
[alert show];
}else{
// 有網操作;
}