He buscado sobre este tema, pero encontré muy pocos detalles que fueron útiles. Con estos detalles, he intentado cocinar un código de la siguiente manera.
Nota: compare los detalles compartidos en esta publicación con otras publicaciones antes de marcar esto como DUPLICADO, y no solo por el tema.
- (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];
}
Este código recopila información sobre el uso de Internet de un dispositivo iPhone (y no solo mi aplicación).
Ahora, si uso internet a través de WiFi o 3G, obtengo los datos (bytes) solo en ifi_obytes
(enviado) y ifi_ibytes
(recibido) pero creo que debería obtener el uso de WiFi en ifi_opackets
y ifi_ipackets
.
También quería agregar que si estoy conectado a una red WiFi, pero no estoy usando Internet, todavía obtengo valor agregado ifi_obytes
y ifi_ibytes
.
Puede ser que me equivoque en la implementación o comprensión. Necesito a alguien que me ayude.
Editar: en lugar de AF_LINK
lo intenté AF_INET
(en sockaddr_in
lugar de sockaddr_dl
). Esto bloquea la aplicación.