(一).Reachability添加源文件及FrameworkApple 的官方例子 Reachability 中介紹了獲取、檢測設(shè)備當(dāng)前網(wǎng)絡(luò)狀態(tài)的方法。在你的程序中,需要把該工程中的Reachability.h 和 Reachability.m 拷貝到你的工程中,同時需要把 SystemConfiguration.framework 添加到工程中,
如下圖:
// 監(jiān)聽網(wǎng)絡(luò)狀態(tài)改變的通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];// 創(chuàng)建Reachabilityself.conn = [Reachability reachabilityForInternetConnection];// 開始監(jiān)控網(wǎng)絡(luò)(一旦網(wǎng)絡(luò)狀態(tài)發(fā)生改變, 就會發(fā)出通知kReachabilityChangedNotification)[self.conn startNotifier];// 處理網(wǎng)絡(luò)狀態(tài)改變- (void)networkStateChange{ // 1.檢測wifi狀態(tài) Reachability *wifi = [Reachability reachabilityForLocalWiFi]; // 2.檢測手機是否能上網(wǎng)絡(luò)(WIFI/3G/2.5G) Reachability *conn = [Reachability reachabilityForInternetConnection]; // 3.判斷網(wǎng)絡(luò)狀態(tài) if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi NSLog(@"有wifi"); } else if ([conn currentReachabilityStatus] != NotReachable) { // 沒有使用wifi, 使用手機自帶網(wǎng)絡(luò)進(jìn)行上網(wǎng) NSLog(@"使用手機自帶網(wǎng)絡(luò)進(jìn)行上網(wǎng)"); } else { // 沒有網(wǎng)絡(luò) NSLog(@"沒有網(wǎng)絡(luò)"); }}(二).AFN// 1.獲得網(wǎng)絡(luò)監(jiān)控的管理者AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];// 2.設(shè)置網(wǎng)絡(luò)狀態(tài)改變后的處理[mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { // 當(dāng)網(wǎng)絡(luò)狀態(tài)改變了, 就會調(diào)用這個block switch (status) { case AFNetworkReachabilityStatusUnknown: // 未知網(wǎng)絡(luò) NSLog(@"未知網(wǎng)絡(luò)"); break; case AFNetworkReachabilityStatusNotReachable: // 沒有網(wǎng)絡(luò)(斷網(wǎng)) NSLog(@"沒有網(wǎng)絡(luò)(斷網(wǎng))"); break; case AFNetworkReachabilityStatusReachableViaWWAN: // 手機自帶網(wǎng)絡(luò) NSLog(@"手機自帶網(wǎng)絡(luò)"); break; case AFNetworkReachabilityStatusReachableViaWiFi: // WIFI NSLog(@"WIFI"); break; }}];// 3.開始監(jiān)控[mgr startMonitoring];(三)從狀態(tài)欄中獲取網(wǎng)絡(luò)類型,代碼如下:- (NSString *)getNetWorkStates{ UIapplication *app = [UIApplication sharedApplication]; NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews]; NSString *state = [[NSString alloc]init]; int netType = 0; //獲取到網(wǎng)絡(luò)返回碼 for (id child in children) { if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) { //獲取到狀態(tài)欄 netType = [[child valueForKeyPath:@"dataNetworkType"]intValue]; switch (netType) { case 0: state = @"無網(wǎng)絡(luò)"; //無網(wǎng)模式 break; case 1: state = @"2G"; break; case 2: state = @"3G"; break; case 3: state = @"4G"; break; case 5: { state = @"wifi"; break; default: break; } } } //根據(jù)狀態(tài)選擇 } return state;} 基本原理是從UIApplication類型中通過valueForKey獲取內(nèi)部屬性 statusBar。然后篩選一個內(nèi)部類型(UIStatusBarDataNetworkItemView),最后返回他的 dataNetworkType屬性,根據(jù)狀態(tài)欄獲取網(wǎng)絡(luò)狀態(tài),可以區(qū)分2G、3G、4G、WIFI,系統(tǒng)的方法,比較快捷,不好的是萬一連接的WIFI 沒有聯(lián)網(wǎng)的話,識別不到。
|
新聞熱點
疑難解答
圖片精選