J'ai fait des recherches sur ce sujet mais j'ai trouvé très peu de détails utiles. Avec ces détails, j'ai essayé de préparer un code comme suit.
Note : Veuillez comparer les détails partagés dans ce post avec d'autres posts avant de marquer ceci comme DUPLICAT, et pas seulement par le sujet.
- (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];
}
Ce code collecte des informations sur l'utilisation de l'internet d'un appareil iPhone (et non de mon application seule).
Maintenant, si j'utilise l'internet par WiFi ou par 3G, j'obtiens les données (octets) seulement en ifi_obytes
(envoyé) et ifi_ibytes
(reçu) mais je pense que je devrais obtenir l'utilisation du WiFi en ifi_opackets
y ifi_ipackets
.
Je voulais également ajouter que si je suis connecté à un réseau WiFi, mais que je n'utilise pas l'internet, j'obtiens quand même une valeur ajoutée à la rubrique ifi_obytes
y ifi_ibytes
.
Il se peut que je me trompe dans l'implémentation ou la compréhension. J'ai besoin de quelqu'un pour m'aider.
Edit : Au lieu de AF_LINK
J'ai essayé AF_INET
( sockaddr_in
au lieu de sockaddr_dl
). Cela fait planter l'application.