1. 程式人生 > >獲取當前網路狀態

獲取當前網路狀態

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{
        // 有網操作;        
}