你的位置:首页 > 操作系统

[操作系统]iOS 流量统计


  在开发中,有时候需要获取流量统计信息。研究发现:通过函数getifaddrs来得到系统网络接口的信息,网络接口的信息,包含在if_data字段中, 有很多信息, 但我现在只关心ifi_ibytes, ifi_obytes, 应该就是接收到的字节数和发送的字节数, 加起来就是流量了。还发现,接口的名字, 有en, pdp_ip, lo等几种形式,en应该是wifi, pdp_ip大概是3g或者gprs, lo是环回接口, 通过名字区分可以分别统计。

  

1、导入必要头文件

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

 

2、获取3G或者GPRS的流量

//获取3G或者GPRS的流量+ (NSString *)getGprs3GFlowIOBytes{    struct ifaddrs *ifa_list = 0, *ifa;  if (getifaddrs(&ifa_list) == -1)  {    return 0;  }    uint32_t iBytes = 0;  uint32_t oBytes = 0;    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;        //3G或者GPRS    if (!strcmp(ifa->ifa_name, "pdp_ip0"))    {      struct if_data *if_data = (struct if_data *)ifa->ifa_data;            iBytes += if_data->ifi_ibytes;      oBytes += if_data->ifi_obytes;      NSLog(@"%s :iBytes is %d, oBytes is %d",         ifa->ifa_name, iBytes, oBytes);    }  }      freeifaddrs(ifa_list);    uint32_t bytes = 0;    bytes = iBytes + oBytes;    //将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)];  }}

 

3、获取Wifi流量

//获取Wifi流量+ (NSString *)getGprsWifiFlowIOBytes{  struct ifaddrs *ifa_list = 0, *ifa;  if (getifaddrs(&ifa_list) == -1) {    return 0;  }  uint32_t iBytes = 0;  uint32_t oBytes = 0;  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;        //Wifi    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;      NSLog(@"%s :iBytes is %d, oBytes is %d", ifa->ifa_name, iBytes, oBytes);    }  }    freeifaddrs(ifa_list);    uint32_t bytes = 0;    bytes = iBytes+oBytes;    NSLog(@"%d",bytes);    //将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)];  }}

 

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

   2、上面两方法统计的结果是字符串格式