没有高水平的API来支持这一点,但由于iOS的仅仅是一个相当漂亮unix,你当然可以去标准的API。
在这种情况下,你要寻找getifaddrs,它检索描述设备上的各种接口的存储器结构中。
你就必须分析这些C结构,以得到你想要的接口细节。
getifaddr界面是记录(man getifaddr),所以你可以使用这个。
我会添加一些代码,但首先要注意几点。 苹果公司并不打算维持这个东西,所以网络计数是32位,所以你必须处理4Gb翻转。 数据包大部分都在那里,我认为tx数据包总是0,但是无论如何谁对数据包计数感兴趣。
你也许可以通过搜索getifaddrs在这里找到更好的代码,但这里是一个短版,让你开始。
#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;
}
P.S.我要为我的钻石复活旧问题徽章:)
您是在谈论跟踪应用程序的使用情况还是整体情况? – sangony