iPhone數據使用跟蹤/監控我已經搜索過這個話題,但是很少發現有幫助的細節。關于這些細節,我嘗試編寫如下代碼。注:請將此帖子中分享的細節與其他帖子進行比較,然后再將其標記為重復,而不僅僅是主題。- (NSArray *)getDataCountersForType:(int)type {
BOOL success;
struct ifaddrs *addrs = nil;
const struct ifaddrs *cursor = nil;
const struct sockaddr_dl *dlAddr = nil;
const struct if_data *networkStatisc = nil;
int dataSent = 0;
int dataReceived = 0;
success = getifaddrs(&addrs) == 0;
if (success) {
cursor = addrs;
while (cursor != NULL) {
if (cursor->ifa_addr->sa_family == AF_LINK) {
dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr;
networkStatisc = (const struct if_data *) cursor->ifa_data;
if (type == WiFi) {
dataSent += networkStatisc->ifi_opackets;
dataReceived += networkStatisc->ifi_ipackets;
}
else if (type == WWAN) {
dataSent += networkStatisc->ifi_obytes;
dataReceived += networkStatisc->ifi_ibytes;
}
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return [NSArray arrayWithObjects:[NSNumber numberWithInt:dataSent], [NSNumber numberWithInt:dataReceived], nil]; }此代碼收集iPhone設備的互聯網使用信息(而不僅僅是我的應用程序)?,F在,如果我通過WiFi或3G使用互聯網,我只能在ifi_obytes(發送)和ifi_ibytes(收到)但我想我應該在ifi_opackets和ifi_ipackets.還想說,如果我連接到WiFi網絡,但不使用互聯網,我仍然可以獲得增值ifi_obytes和ifi_ibytes.也許我在實現或理解上錯了。需要有人幫我。編輯:而不是AF_LINK我試過AF_INET (sockaddr_in而不是sockaddr_dl)。這會使應用程序崩潰。
3 回答
胡子哥哥
TA貢獻1825條經驗 獲得超6個贊
pdp_ip0pdpXXXWWAN
en0Wi-Fipdp_ip0WWAN
ifa_data->ifi_obytesifa_data->ifi_ibytes
ifi_opacketsifi_ipacketslo0
WiFiif_iobytes
#include <net/if.h>#include <ifaddrs.h>static NSString *const DataCounterKeyWWANSent = @"WWANSent";
static NSString *const DataCounterKeyWWANReceived = @"WWANReceived";static NSString *const DataCounterKeyWiFiSent = @"WiFiSent";
static NSString *const DataCounterKeyWiFiReceived = @"WiFiReceived";NSDictionary *DataCounters(){
struct ifaddrs *addrs;
const struct ifaddrs *cursor;
u_int32_t WiFiSent = 0;
u_int32_t WiFiReceived = 0;
u_int32_t WWANSent = 0;
u_int32_t WWANReceived = 0;
if (getifaddrs(&addrs) == 0)
{
cursor = addrs;
while (cursor != NULL)
{
if (cursor->ifa_addr->sa_family == AF_LINK)
{#ifdef DEBUG const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;
if (ifa_data != NULL)
{
NSLog(@"Interface name %s: sent %tu received %tu",cursor->ifa_name,ifa_data->ifi_obytes,ifa_data->ifi_ibytes);
}#endif
// name of interfaces:
// en0 is WiFi
// pdp_ip0 is WWAN
NSString *name = @(cursor->ifa_name);
if ([name hasPrefix:@"en"])
{
const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;
if (ifa_data != NULL)
{
WiFiSent += ifa_data->ifi_obytes;
WiFiReceived += ifa_data->ifi_ibytes;
}
}
if ([name hasPrefix:@"pdp_ip"])
{
const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;
if (ifa_data != NULL)
{
WWANSent += ifa_data->ifi_obytes;
WWANReceived += ifa_data->ifi_ibytes;
}
}
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return @{DataCounterKeyWiFiSent : @(WiFiSent),
DataCounterKeyWiFiReceived : @(WiFiReceived),
DataCounterKeyWWANSent : @(WWANSent),
DataCounterKeyWWANReceived : @(WWANReceived)};}改進的復制/粘貼支持!
喵喔喔
TA貢獻1735條經驗 獲得超5個贊
04 GBifi_obytesifi_ibytesuint_324294967295.
unsigned intintifi_obytes
unsigned int sent = 0;sent += networkStatisc->ifi_obytes;
- 3 回答
- 0 關注
- 807 瀏覽
添加回答
舉報
0/150
提交
取消
