美文网首页iOS高级进阶
iOS 统计流量信息(转)

iOS 统计流量信息(转)

作者: 南城同學 | 来源:发表于2017-06-29 16:45 被阅读453次

    转自:http://www.cnblogs.com/jukaiit/p/5730228.html

    在开发中,有时候需要获取流量统计信息。研究发现:通过函数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、上面两方法统计的结果是字符串格式

    相关文章

      网友评论

        本文标题:iOS 统计流量信息(转)

        本文链接:https://www.haomeiwen.com/subject/vmtvcxtx.html