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.
Es ist wichtig zu verstehen, dass diese Zähler seit dem letzten Start des Geräts bereitgestellt werden .
Also, um effektiv von ihnen Gebrauch zu machen, sollen Sie jede Probe mit der Betriebszeit des Geräts begleiten ( die Sie verwenden können
mach_absolute_time()
- siehe diese für weitere Informationen)Sobald Sie Zählerproben + Verfügbarkeit haben, können Sie bessere Heuristiken hinsichtlich der Datennutzung haben ...
quelle
Um die akzeptierte Antwort zu ergänzen, ist es wichtig zu wissen, dass die von der Schnittstelle angezeigte Datenmenge
0
nach jedem überläuft und neu startet4 GB
, insbesondere wenn Sie diesen Code verwenden, um die Differenz zwischen zwei Messwerten zu berechnen. Dies liegt daran, dassifi_obytes
undifi_ibytes
sinduint_32
und ihr Maximalwert ist4294967295
.Außerdem empfehle ich die Verwendung von
unsigned int
s für die Variablen, die die gesendeten und empfangenen Daten enthalten. Normaleint
s haben den halben Maximalwert einer vorzeichenlosen Ganzzahl. Wenn Sie also hinzufügenifi_obytes
, kann dies zu einem Überlauf führen.quelle
Schnelle Version der akzeptierten Antwort. Ich zerlege den Code auch in kleinere Einheiten.
quelle
Ich habe den obigen Quellcode auf die Swift3-Version korrigiert
quelle
Eine neue Version, die auf früheren Versionen basiert, jedoch für Swift4 und Xcode 9 angepasst ist
quelle
Entschuldigung für die gleiche Antwort noch einmal.
Aber ich fand, dass UInt32 nicht genug ist, also stürzt es ab, wenn es zu groß wird.
Ich habe gerade UInt32 in UInt64 geändert und es funktioniert gut.
quelle