Ich habe über dieses Thema gesucht, aber nur sehr wenige Details gefunden, die hilfreich waren. Mit diesen Details habe ich versucht, Code wie folgt zu kochen.
Hinweis: Bitte vergleichen Sie die in diesem Beitrag geteilten Details mit anderen Beiträgen, bevor Sie dies als DUPLIKAT markieren, und nicht nur nach Betreff.
- (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];
}
Dieser Code sammelt Informationen über die Internetnutzung eines iPhone-Geräts (und nicht nur über meine Anwendung).
Wenn ich das Internet über WLAN oder über 3G benutze, erhalte ich die Daten (Bytes) nur in ifi_obytes
(gesendet) und ifi_ibytes
(empfangen), aber ich denke, ich sollte die WLAN-Nutzung in ifi_opackets
und erhalten ifi_ipackets
.
Ich wollte auch hinzufügen, dass ich, wenn ich mit einem WiFi-Netzwerk verbunden bin, aber kein Internet benutze, immer noch einen Mehrwert für ifi_obytes
und bekomme ifi_ibytes
.
Möglicherweise irre ich mich in der Implementierung oder im Verständnis. Brauchen Sie jemanden, der mir hilft?
Edit: Statt AF_LINK
ich versucht habe AF_INET
( sockaddr_in
statt sockaddr_dl
). Dies stürzt die Anwendung ab.