没有高级 API 来支持这一点,但由于 iOS 只是一个相当漂亮的 unix,您当然可以使用标准 API。
在这种情况下,您将寻找 getifaddrs,它检索描述设备上各种接口的内存结构。
然后,您必须解析这些 C 结构,以获取所需的接口详细信息。
getifaddr 接口已记录在案 (man getifaddr),因此您可以使用它。
我将添加一些代码,但首先要注意几点。Apple 并不真正费心维护这些东西,所以网络数量是 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;
}
PS我要去拿我的钻石复活旧问题徽章:)