IOS源码开发获取当前的流量信息


通过读取系统网络接口信息,获取当前iphone设备的流量相关信息,统计的是上次开机至今的流量信息. 

倒入库:

SystemConfiguration.framework

加入头文件:

#include <ifaddrs.h>
#include <sys/socket.h>
#include <net/if.h>

流量统计功能

-(NSString *)bytesToAvaiUnit:(int)bytes
{
	if(bytes < 1024)		// B
	{
		return [NSString stringWithFormat:@"%dB", bytes];
	}
	else if(bytes >= 1024 && bytes < 1024 * 1024)	// KB
	{
		return [NSString stringWithFormat:@"%.1fKB", (double)bytes / 1024];
	}
	else if(bytes >= 1024 * 1024 && bytes < 1024 * 1024 * 1024)	// MB
	{
		return [NSString stringWithFormat:@"%.2fMB", (double)bytes / (1024 * 1024)];
	}
	else	// GB
	{
		return [NSString stringWithFormat:@"%.3fGB", (double)bytes / (1024 * 1024 * 1024)];
	}
}


-(void)checkNetworkflow{
    
    struct ifaddrs *ifa_list = 0, *ifa;
    
    if (getifaddrs(&ifa_list) == -1)
        
    {
        
        return;
    }
    
    uint32_t iBytes     = 0;
    
    uint32_t oBytes     = 0;
    
    uint32_t allFlow    = 0;
    
    uint32_t wifiIBytes = 0;
    
    uint32_t wifiOBytes = 0;
    
    uint32_t wifiFlow   = 0;
    
    uint32_t wwanIBytes = 0;
    
    uint32_t wwanOBytes = 0;
    
    uint32_t wwanFlow   = 0;
    
    struct timeval time ;
    
    for (ifa = ifa_list; ifa; ifa = ifa->ifa_next)
        
    {
        
        if (AF_LINK != ifa->ifa_addr->sa_family)
            
            continue;
        
        if (!(ifa->ifa_flags & IFF_UP) && !(ifa->ifa_flags & IFF_RUNNING))
            
            continue;
        
        if (ifa->ifa_data == 0)
            
            continue;
        // Not a loopback device.
        
        // network flow
        
        if (strncmp(ifa->ifa_name, "lo", 2))
            
        {
            
            struct if_data *if_data = (struct if_data *)ifa->ifa_data;
            
            iBytes += if_data->ifi_ibytes;
            
            oBytes += if_data->ifi_obytes;
            
            allFlow = iBytes + oBytes;
            
            time = if_data->ifi_lastchange;
            
           // NSLog(@"1111===%s :iBytes is %d, oBytes is %d", ifa->ifa_name, iBytes, oBytes);
            
        }
        
        //WIFI流量统计功能
        
        if (!strcmp(ifa->ifa_name, "en0"))
            
        {
            struct if_data *if_data = (struct if_data *)ifa->ifa_data;
            
            wifiIBytes += if_data->ifi_ibytes;
            
            wifiOBytes += if_data->ifi_obytes;
            
            wifiFlow    = wifiIBytes + wifiOBytes;
            
        }
        
        //3G和GPRS流量统计
        
        if (!strcmp(ifa->ifa_name, "pdp_ip0"))
            
        {
            
            struct if_data *if_data = (struct if_data *)ifa->ifa_data;
            
            wwanIBytes += if_data->ifi_ibytes;
            
            wwanOBytes += if_data->ifi_obytes;
            
            wwanFlow    = wwanIBytes + wwanOBytes;
            
            //NSLog(@"111122===%s :iBytes is %d, oBytes is %d",  ifa->ifa_name, iBytes, oBytes);
            
        }
        
    }
    
    freeifaddrs(ifa_list);
  
    
    
    NSString *changeTime=[NSString stringWithFormat:@"%s",ctime(&time)];
    
    NSLog(@"changeTime==%@",changeTime);
    NSString *receivedBytes= [self bytesToAvaiUnit:iBytes];
    
    NSLog(@"receivedBytes==%@",receivedBytes);
    NSString *sentBytes       = [self bytesToAvaiUnit:oBytes];
    
    NSLog(@"sentBytes==%@",sentBytes);
    NSString *networkFlow      = [self bytesToAvaiUnit:allFlow];
    
    NSLog(@"networkFlow==%@",networkFlow);

    NSString *wifiReceived   = [self bytesToAvaiUnit:wifiIBytes];
    
    NSLog(@"wifiReceived==%@",wifiReceived);
    NSString *wifiSent       = [self bytesToAvaiUnit: wifiOBytes];
    
    NSLog(@"wifiSent==%@",wifiSent);
    
    NSString *wifiBytes      = [self bytesToAvaiUnit:wifiFlow];
    
    NSLog(@"wifiBytes==%@",wifiBytes);
    NSString *wwanReceived   = [self bytesToAvaiUnit:wwanIBytes];
    
    NSLog(@"wwanReceived==%@",wwanReceived);
    NSString *wwanSent       = [self bytesToAvaiUnit:wwanOBytes];
    
    NSLog(@"wwanSent==%@",wwanSent);
    NSString *wwanBytes      = [self bytesToAvaiUnit:wwanFlow];
    
    NSLog(@"wwanBytes==%@",wwanBytes);
}


 主要方法就是上面的,然后在你想要知道的结果的地方调用就ok了。

 [self checkNetworkflow];

结果:

2013-03-30 23:45:33.565 Reachability[2993:707] changeTime==Sat Mar 30 09:52:09 2013
2013-03-30 23:45:33.567 Reachability[2993:707] receivedBytes==62.73MB
2013-03-30 23:45:33.569 Reachability[2993:707] sentBytes==8.22MB
2013-03-30 23:45:33.571 Reachability[2993:707] networkFlow==70.94MB
2013-03-30 23:45:33.573 Reachability[2993:707] wifiReceived==55.40MB
2013-03-30 23:45:33.575 Reachability[2993:707] wifiSent==5.41MB
2013-03-30 23:45:33.577 Reachability[2993:707] wifiBytes==60.81MB
2013-03-30 23:45:33.579 Reachability[2993:707] wwanReceived==7.33MB
2013-03-30 23:45:33.581 Reachability[2993:707] wwanSent==2.81MB
2013-03-30 23:45:33.583 Reachability[2993:707] wwanBytes==10.14MB

当然你也可以只统计3G/GPRS流量统计 或者 WIFI流量统计。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值