在開發(fā)中要獲取網(wǎng)絡(luò)類型是很簡單的猿诸,導入Reachability直接獲取狀態(tài)就行了,現(xiàn)在我們要做一個類似下載器的那種實時把上傳下載速度顯示出來。
需要用到的頭文件
要測速度所以必須要有一個定時器窜觉,咱們?yōu)榱瞬缓挠脩舻牧髁抠鞔欤〉氖菙?shù)據(jù)的總量逗余,然后減去上一次的檢測的總量,得出的就是速度画拾。網(wǎng)絡(luò)現(xiàn)在分為wifi以及wwan兩種類型菜职。
首先頭文件.h建立一個檢測的數(shù)據(jù)類
@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
實現(xiàn)文件.M
//成員變量是內(nèi)部可見的
@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{
// 上傳嫡意、下載
//不需要連通網(wǎng)絡(luò)獲取的是總的數(shù)據(jù)
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(@"無網(wǎng)絡(luò)");
}
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
粘貼的格式錯亂了自己排序一下耸序,哈哈希望對大家有幫助坎怪。
網(wǎng)盤是有代碼搅窿,要的拿走:
https://pan.baidu.com/s/1c1Xq5Ao
如需轉(zhuǎn)載標明出處
各位看官覺得有用的話就請Yes-Cui喝瓶水吧疾棵,打賞一個