Я искал эту тему, но нашел очень мало деталей, которые были полезны. С этими деталями я попытался подготовить код следующим образом.
Примечание. Пожалуйста, сравните детали, общие в этом сообщении, с другими сообщениями, прежде чем отмечать это как DUPLICATE, а не только субъектом.
- (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 (а не только моим приложением).
Теперь, если я пользуюсь Интернетом через Wi-Fi или через 3G, я получаю данные (байты) только в ifi_obytes
(отправлено) и ifi_ibytes
(полученные), но я думаю, что я должен использовать Wi-Fi в ifi_opackets
и ifi_ipackets
.
Также хотелось добавить, что если я подключен к сети WiFi, но не пользуюсь Интернетом, я все равно получаю добавленную стоимость в ifi_obytes
и ifi_ibytes
.
Может быть, я ошибаюсь в реализации или понимании. Нужна помощь, чтобы помочь мне.
Изменить: вместо AF_LINK
я попробовал AF_INET
(sockaddr_in
вместо sockaddr_dl
). Это приведет к сбою приложения.