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

来源:互联网 发布:美团大数据平台 编辑:程序博客网 时间:2024/05/03 10:07


通过读取系统网络接口信息,获取当前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 20132013-03-30 23:45:33.567 Reachability[2993:707] receivedBytes==62.73MB2013-03-30 23:45:33.569 Reachability[2993:707] sentBytes==8.22MB2013-03-30 23:45:33.571 Reachability[2993:707] networkFlow==70.94MB2013-03-30 23:45:33.573 Reachability[2993:707] wifiReceived==55.40MB2013-03-30 23:45:33.575 Reachability[2993:707] wifiSent==5.41MB2013-03-30 23:45:33.577 Reachability[2993:707] wifiBytes==60.81MB2013-03-30 23:45:33.579 Reachability[2993:707] wwanReceived==7.33MB2013-03-30 23:45:33.581 Reachability[2993:707] wwanSent==2.81MB2013-03-30 23:45:33.583 Reachability[2993:707] wwanBytes==10.14MB

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


原创粉丝点击