在開發中要獲取網絡類型是很簡單的,導入Reachability直接獲取狀態就行了,現在我們要做一個類似下載器的那種實時把上傳下載速度顯示出來。
需要用到的頭文件

使用Reachability
要測速度所以必須要有一個定時器,咱們為了不耗用戶的流量,取的是數據的總量,然后減去上一次的檢測的總量,得出的就是速度。網絡現在分為wifi以及wwan兩種類型。
首先頭文件.h建立一個檢測的數據類
@interface MonitorData : NSObject @property (assign, nonatomic) float wwanSend; @property (assign, nonatomic) float wwanReceived; @property (assign, nonatomic) float wifiSend; @property (assign, nonatomic) float wifiReceived; @end
然后建立一個檢測類
@interface MonitorFlow : NSObject //開始檢測 - (void)startMonitor; //停止檢測 - (void)stopMonitor; @end 實現文件.M //成員變量是內部可見的 @interface MonitorFlow () @property (strong,nonatomic) NSTimer *timer; @property (assign, nonatomic) float tempWWANReceived; @property (assign, nonatomic) float tempWWANSend; @property (assign, nonatomic) float tempWifiReceived; @property (assign, nonatomic) float tempWifiSend; @end 直接把代碼附上,里面有注釋 @implementation MonitorFlow - (void)startMonitor { [self currentFlow]; self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(refreshFlow) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; } - (void)stopMonitor{ [self.timer invalidate]; } - (void)refreshFlow{ // 上傳、下載 //不需要連通網絡獲取的是總的數據 Reachability *reachability = [Reachability reachabilityWithHostName:@"Yes-Cui"]; MonitorData *monitor = [self getMonitorDataDetail]; switch (reachability.currentReachabilityStatus) { case ReachableViaWiFi: { float wifiSend = monitor.wifiSend - self.tempWifiSend; float wifiReceived = monitor.wifiReceived - self.tempWifiReceived; NSLog(@"wifi上傳速度:%@",[NSString stringWithFormat:@"%.0f KB/s",wifiSend]); NSLog(@"wifi下載速度:%@",[NSString stringWithFormat:@"%.0f KB/s",wifiReceived]); } break; case ReachableViaWWAN: { float wwanSend = monitor.wwanSend - self.tempWWANReceived; float wwanReceived = monitor.wifiReceived - self.tempWWANSend; NSLog(@"wwan上傳速度:%@",[NSString stringWithFormat:@"%.0f KB/s",wwanSend]); NSLog(@"wwan下載速度:%@",[NSString stringWithFormat:@"%.0f KB/s",wwanReceived]); } break; default: { NSLog(@"無網絡"); } break; } [self currentFlow]; } //賦值當前流量 - (void)currentFlow{ MonitorData *monitor = [self getMonitorDataDetail]; self.tempWifiSend = monitor.wifiSend; self.tempWifiReceived = monitor.wifiReceived; self.tempWWANSend = monitor.wwanSend; self.tempWWANReceived = monitor.wwanReceived; } //上傳、下載總額流量 - (MonitorData *)getMonitorDataDetail { BOOL success; struct ifaddrs *addrs; struct ifaddrs *cursor; struct if_data *networkStatisc; long tempWiFiSend = 0; long tempWiFiReceived = 0; long tempWWANSend = 0; long tempWWANReceived = 0; NSString *dataName; success = getifaddrs(&addrs) == 0; if (success) { cursor = addrs; while (cursor != NULL) { dataName = [NSString stringWithFormat:@"%s",cursor->ifa_name]; if (cursor->ifa_addr->sa_family == AF_LINK) { if ([dataName hasPrefix:@"en"]) { networkStatisc = (struct if_data *) cursor->ifa_data; tempWiFiSend += networkStatisc->ifi_obytes; tempWiFiReceived += networkStatisc->ifi_ibytes; } if ([dataName hasPrefix:@"pdp_ip"]) { networkStatisc = (struct if_data *) cursor->ifa_data; tempWWANSend += networkStatisc->ifi_obytes; tempWWANReceived += networkStatisc->ifi_ibytes; } } cursor = cursor->ifa_next; } freeifaddrs(addrs); } MonitorData *monitorData = [MonitorData new]; monitorData.wifiSend = tempWiFiSend/1024; monitorData.wifiReceived = tempWiFiReceived/1024; monitorData.wwanSend = tempWWANSend/1024; monitorData.wwanReceived = tempWWANReceived/1024; return monitorData; } @end
來源:https://www.jianshu.com/p/42ab08c998ae