ios網路判斷的方式

來源:互聯網
上載者:User

ios網路判斷的方式
   對於ios判斷網路連通方式我總結了一下幾種方法:1、Reachability。        Reachability是蘋果推薦的用來判斷當前網路狀態的第三方庫。Reachability使用的主要函數包括: 

+ (Reachability*) reachabilityWithHostName: (NSString*) hostName;+ (Reachability*) reachabilityWithAddress: (const struct sockaddr_in*) hostAddress;+ (Reachability*) reachabilityForInternetConnection;+ (Reachability*) reachabilityForLocalWiFi;

 

 通過以上函數初始化一個Reachability執行個體,然後調用1- (NetworkStatus) currentReachabilityStatus;返回枚舉類型NetworkStatus,即可獲得網路連通方式,其中 
typedef enum {    NotReachable = 0,    ReachableViaWiFi,    ReachableViaWWAN,    ReachableVia2G,    ReachableVia3G,    ReachableVia4G,} NetworkStatus;

 

2、connectedToNetWork(from 網路)        第二種方式來源於網上,且只能判斷網路是否連通而無法確定具體的連通方式,作為Reachablity類的成員函數添加到Reachability類裡的,代碼如下: 
+ (BOOL)connectedToNetWork {    struct sockaddr_in zeroAddress;    bzero(&zeroAddress, sizeof(zeroAddress));    zeroAddress.sin_len = sizeof(zeroAddress);    zeroAddress.sin_family = AF_INET;    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);    SCNetworkReachabilityFlags flags;    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);    CFRelease(defaultRouteReachability);    if (!didRetrieveFlags) {        printf("Error. Count not recover network reachability flags\n");        return NO;    }    BOOL isReachable = flags & kSCNetworkFlagsReachable;    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;    return (isReachable && !needsConnection) ? YES : NO;}

 

3、statusBar+connectedToNetWork(私人API,可能會被AppStore拒掉,慎用)        第二種方式因為是定義為類函數,所以使用起來比較方便,但是會有延時,也就是說如果使用者關掉wifi開關和流量開關然後立馬進行網路判斷,那麼這個函數依舊會返回YES,延時大約有2~3s。所以第三中方式通過將statusBar和connectedToNetWork結合來提高網路連通性判斷的準確性。依舊是作為Reachability的一個類函數,代碼如下: 
+ (BOOL)isNetworkAvailable{    //step1:調用類方法connectedToNetWork判斷網路連通情況    BOOL connected_1=[Reachability connectedToNetWork];         //step2:通過statusBar上的網狀圖標來判斷網路連通情況    BOOL connected_2=YES;    UIApplication *app=[UIApplication sharedApplication];    if(app.statusBarHidden==NO){        NSNumber *networkType=nil;        NSArray *subViewOfStatusBar=[[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];        for(id child in subViewOfStatusBar){            if([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]){                //1-2G;2-3G;5-wifi                networkType=[child valueForKeyPath:@"dataNetworkType"];                break;            }        }        if(networkType == nil){            connected_2=NO;        }    }    return (connected_1 && connected_2);}

 

 說明:斷網情況下,即statusBar上沒有網狀圖標(wifi、2G、3G或4G),那麼statusBar的foregroundView的subview裡是沒有UIStatusBarDataNetworkItemView的,這樣一來,networkType的值就會為一開始賦值的nil,而不會像網上說的為0。        

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.