Tôi đã tìm kiếm chủ đề này nhưng tìm thấy rất ít chi tiết hữu ích. Với những chi tiết này, tôi đã cố gắng nấu một số mã như sau.
Lưu ý: Vui lòng so sánh các chi tiết được chia sẻ trong bài đăng này với các bài đăng khác trước khi đánh dấu đây là DUPLICATE và không chỉ theo chủ đề.
- (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];
}
Mã này thu thập thông tin về việc sử dụng internet của thiết bị iPhone (chứ không phải riêng ứng dụng của tôi).
Bây giờ, nếu tôi sử dụng internet thông qua WiFi hoặc qua 3G, tôi chỉ nhận được dữ liệu (byte) trong ifi_obytes
(đã gửi) và ifi_ibytes
(đã nhận) nhưng tôi nghĩ rằng tôi nên sử dụng WiFi trong ifi_opackets
vàifi_ipackets
.
Cũng muốn thêm rằng nếu tôi kết nối với mạng WiFi, nhưng không sử dụng internet, tôi vẫn nhận được giá trị gia tăng ifi_obytes
vàifi_ibytes
.
Có thể tôi sai trong việc thực hiện hoặc hiểu. Cần ai đó giúp tôi ra.
Chỉnh sửa: Thay vì AF_LINK
tôi đã thử AF_INET
( sockaddr_in
thay vì sockaddr_dl
). Điều này làm hỏng ứng dụng.