iOS上的实时网络统计

iOS上的实时网络统计,ios,usage-statistics,Ios,Usage Statistics,我知道可以通过iphone的内置设置检查wifi和数据的流量使用情况。但是,有没有像库或函数这样的解决方案来获取设备的实时网络使用情况(上传/下载)?(类似于实时netstat) 可达性是我发现的关于上述问题的东西之一。 此应用程序执行类似的操作: 有人知道调用什么类或者寻找什么方法来访问实时流量吗 我希望我的问题是可以理解的。iOS中没有这样的API,您提到的应用程序(以及所有类似的应用程序)依赖运营商提供的API(或解析运营商网站)。如果你想实现这种应用程序,恐怕你必须为你感兴趣的每一家

我知道可以通过iphone的内置设置检查wifi和数据的流量使用情况。但是,有没有像库或函数这样的解决方案来获取设备的实时网络使用情况(上传/下载)?(类似于实时netstat)

可达性是我发现的关于上述问题的东西之一。

此应用程序执行类似的操作:

有人知道调用什么类或者寻找什么方法来访问实时流量吗


我希望我的问题是可以理解的。

iOS中没有这样的API,您提到的应用程序(以及所有类似的应用程序)依赖运营商提供的API(或解析运营商网站)。如果你想实现这种应用程序,恐怕你必须为你感兴趣的每一家运营商找到合适的应用程序。

没有高级API支持这一点,但由于iOS只是一个相当漂亮的unix,你当然可以使用标准API

在本例中,您将查找getIFADRS,它检索描述设备上各种接口的内存中结构

然后必须解析这些C结构,以获得所需的接口详细信息

getifaddr接口是文档化的(man getifaddr),因此您可以使用它

我将添加一些代码,但首先需要注意几个问题。 苹果并不真的费心维护这些东西,所以网络计数是32位的,所以你必须处理4Gb的滚动。 数据包计数主要在那里,我认为tx数据包计数总是0,但是谁对数据包计数感兴趣呢

通过搜索GetIFADRs,您可能可以在这里找到更好的代码,但这里有一个简短的版本供您开始使用

#include <sys/types.h>
#include <sys/sysctl.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <net/if_var.h>

    struct ifaddrs* addrs;

    int getIFAddrsResult = getifaddrs(&addrs);
    if (getIFAddrsResult == 0)
    {
        struct ifaddrs* addrsPtr = addrs; // need to keep original for freeifaddrs
        while (addrsPtr != NULL)
        {
            NSString *name = [NSString stringWithFormat:@"%s",addrsPtr->ifa_name];
            //NSLog(@"ifa_name %s == %@\n", cursor->ifa_name,name);
            // names of interfaces: en0 is WiFi ,pdp_ip0 is WWAN

            if (addrsPtr->ifa_addr->sa_family == AF_LINK)
            {
                const struct if_data* stats = (const struct if_data *) addrsPtr->ifa_data;

                // We only consider the active data interface, and that will normally be the '0' interface.
                if ([name isEqualToString:@"en0"])
                {
                     // Wifi
                     // look at stats->ifi_obytes & ifi_ibytes

                } else if ([name isEqualToString:@"pdp_ip0"])
                {
                   // mobile broad band
                } else {
                   // could be bluetooth, usb, ad hoc wifi, out of band signalling...
                }
            }

            addrsPtr = addrsPtr->ifa_next;
        }

        freeifaddrs(addrs);
    } else {
        NSLog(@"getifaddrs failed with error : %s", strerror(getIFAddrsResult));
        return nil;
    }
#包括
#包括
#包括
#包括
#包括
结构ifaddrs*地址;
int getIFAddrsResult=getifaddrs(&addrs);
如果(GetIFAddressResult==0)
{
struct ifaddrs*addrsPtr=addrs;//需要保留freeifaddrs的原始版本
while(addrsPtr!=NULL)
{
NSString*名称=[NSString stringWithFormat:@“%s”,addrsPtr->ifa_名称];
//NSLog(@“ifa\U名称%s==%@\n”,光标->ifa\U名称,名称);
//接口名称:en0为WiFi,pdp_ip0为WWAN
if(addrsPtr->ifa\u addr->sa\u family==AF\u LINK)
{
const struct if_data*stats=(const struct if_data*)addrsPtr->ifa_data;
/我们只考虑活动数据接口,通常是“0”接口。
如果([name IsequalString:@“en0”])
{
//无线网络
//查看统计->ifi_对象和ifi_对象
}else if([名称IsequalString:@“pdp_ip0”])
{
//移动宽带
}否则{
//可以是蓝牙,usb,无线网络,带外信号。。。
}
}
addrsPtr=addrsPtr->ifa\u next;
}
freeifaddrs(addrs);
}否则{
NSLog(@“GetIFAddress失败,错误:%s”,strerror(GetIFAddressResult));
返回零;
}

另外,我要去拿我的钻石复活老问题徽章:)

你是在说跟踪应用程序的使用情况还是总体使用情况?