これをサポートするための高レベル 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私は私のダイヤモンド復活の古い質問バッジに行きます:)