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