获取当前iphone设备的流量

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

1.

导入库:SystemConfiguration.framework

2.

加入头文件:

#include <ifaddrs.h>

#include <sys/socket.h>

#include <net/if.h>

3.

代码实现:

-(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);


    }

     //<span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; ">WIFI流量统计功能</span>

     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;

    }

    //<span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; ">3G和GPRS流量统计</span>

    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);
}

然后在你想要知道的结果的地方调用:

  [self checkNetworkflow];

控制台输出结果如下:

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

 

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

 3G/GPRS流量统计

-(int) 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;
 
        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);
 
	return iBytes + oBytes;
}

返回的结果为byte

WIFI流量统计功能

- (long long int)getInterfaceBytes
{
    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;
 
        /* Not a loopback device. */
        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);
 
    return iBytes+oBytes;
}

 转自:http://blog.csdn.net/jinglijun/article/details/8741554

原文地址:https://www.cnblogs.com/jiangshiyong/p/3054770.html