robado por perdido internet compartir como buscar bloquear activo activar iphone ios sockets

por - seguimiento/monitoreo de uso de datos de iPhone



compartir internet iphone 7 carrier (6)

Arreglé el código fuente anterior a la versión Swift3

struct DataUsageInfo { var wifiReceived: UInt32 = 0 var wifiSent: UInt32 = 0 var wirelessWanDataReceived: UInt32 = 0 var wirelessWanDataSent: UInt32 = 0 mutating func updateInfoByAdding(_ info: DataUsageInfo) { wifiSent += info.wifiSent wifiReceived += info.wifiReceived wirelessWanDataSent += info.wirelessWanDataSent wirelessWanDataReceived += info.wirelessWanDataReceived } } class DataUsage { private static let wwanInterfacePrefix = "pdp_ip" private static let wifiInterfacePrefix = "en" class func getDataUsage() -> DataUsageInfo { var ifaddr: UnsafeMutablePointer<ifaddrs>? var dataUsageInfo = DataUsageInfo() guard getifaddrs(&ifaddr) == 0 else { return dataUsageInfo } while let addr = ifaddr { guard let info = getDataUsageInfo(from: addr) else { ifaddr = addr.pointee.ifa_next continue } dataUsageInfo.updateInfoByAdding(info) ifaddr = addr.pointee.ifa_next } freeifaddrs(ifaddr) return dataUsageInfo } private class func getDataUsageInfo(from infoPointer: UnsafeMutablePointer<ifaddrs>) -> DataUsageInfo? { let pointer = infoPointer let name: String! = String(cString: pointer.pointee.ifa_name) let addr = pointer.pointee.ifa_addr.pointee guard addr.sa_family == UInt8(AF_LINK) else { return nil } return dataUsageInfo(from: pointer, name: name) } private class func dataUsageInfo(from pointer: UnsafeMutablePointer<ifaddrs>, name: String) -> DataUsageInfo { var networkData: UnsafeMutablePointer<if_data>? var dataUsageInfo = DataUsageInfo() if name.hasPrefix(wifiInterfacePrefix) { networkData = unsafeBitCast(pointer.pointee.ifa_data, to: UnsafeMutablePointer<if_data>.self) if let data = networkData { dataUsageInfo.wifiSent += data.pointee.ifi_obytes dataUsageInfo.wifiReceived += data.pointee.ifi_ibytes } } else if name.hasPrefix(wwanInterfacePrefix) { networkData = unsafeBitCast(pointer.pointee.ifa_data, to: UnsafeMutablePointer<if_data>.self) if let data = networkData { dataUsageInfo.wirelessWanDataSent += data.pointee.ifi_obytes dataUsageInfo.wirelessWanDataReceived += data.pointee.ifi_ibytes } } return dataUsageInfo } }

He buscado sobre este tema pero encontré muy pocos detalles que fueron útiles. Con estos detalles he intentado cocinar algunos códigos 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 (enviados) e ifi_ibytes (recibidos), pero creo que debería obtener el uso de WiFi en ifi_opackets e ifi_ipackets .

También quise agregar que si estoy conectado a una red WiFi, pero no estoy usando internet, aún obtengo un valor agregado a ifi_obytes y ifi_ibytes .

Puede ser que estoy equivocado en la implementación o comprensión. Necesito a alguien que me ayude

Editar: en vez de AF_LINK , probé AF_INET ( AF_INET lugar de sockaddr_dl ). Esto bloquea la aplicación.


Es importante comprender que estos contadores se proporcionan desde el último arranque del dispositivo.

Por lo tanto, para hacer un uso efectivo de ellos, debe acompañar cada muestra con el tiempo de actividad del dispositivo (puede usar mach_absolute_time () - vea this para obtener más información)

Una vez que tiene contadores de muestras + tiempo de actividad, puede tener mejores heurísticas en cuanto al uso de datos ...


Lo que pasa es que pdp_ip0 es una de las interfaces, todas las pdpXXX son interfaces WWAN dedicadas a diferentes funciones, correo de voz, interfaz general de red.

Leí en el foro de Apple que: El sistema operativo no mantiene estadísticas de red proceso por proceso. Como tal, no hay una solución exacta para este problema. Sin embargo, puede obtener estadísticas de red para cada interfaz de red.

En general, en0 es su interfaz Wi-Fi y pdp_ip0 es su interfaz WWAN.

¡No hay una buena forma de obtener información wifi / datos de red celular ya que, en particular, fecha-hora!

la estadística de datos (ifa_data-> ifi_obytes y ifa_data-> ifi_ibytes) se almacena desde el reinicio previo del dispositivo.

No sé por qué, pero ifi_opackets y ifi_ipackets se muestran solo para lo0 (creo que es su interfaz principal).

sí. Luego, el dispositivo se conecta a través de WiFi y no utiliza Internet. Los valores if_iobytes aún se obtienen porque este método proporciona intercambios de bytes de red y no solo Internet.

#include <net/if.h> #include <ifaddrs.h> static NSString *const DataCounterKeyWWANSent = @"WWANSent"; static NSString *const DataCounterKeyWWANReceived = @"WWANReceived"; static NSString *const DataCounterKeyWiFiSent = @"WiFiSent"; static NSString *const DataCounterKeyWiFiReceived = @"WiFiReceived"; NSDictionary *DataCounters() { struct ifaddrs *addrs; const struct ifaddrs *cursor; u_int32_t WiFiSent = 0; u_int32_t WiFiReceived = 0; u_int32_t WWANSent = 0; u_int32_t WWANReceived = 0; if (getifaddrs(&addrs) == 0) { cursor = addrs; while (cursor != NULL) { if (cursor->ifa_addr->sa_family == AF_LINK) { #ifdef DEBUG const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data; if (ifa_data != NULL) { NSLog(@"Interface name %s: sent %tu received %tu",cursor->ifa_name,ifa_data->ifi_obytes,ifa_data->ifi_ibytes); } #endif // name of interfaces: // en0 is WiFi // pdp_ip0 is WWAN NSString *name = @(cursor->ifa_name); if ([name hasPrefix:@"en"]) { const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data; if (ifa_data != NULL) { WiFiSent += ifa_data->ifi_obytes; WiFiReceived += ifa_data->ifi_ibytes; } } if ([name hasPrefix:@"pdp_ip"]) { const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data; if (ifa_data != NULL) { WWANSent += ifa_data->ifi_obytes; WWANReceived += ifa_data->ifi_ibytes; } } } cursor = cursor->ifa_next; } freeifaddrs(addrs); } return @{DataCounterKeyWiFiSent : @(WiFiSent), DataCounterKeyWiFiReceived : @(WiFiReceived), DataCounterKeyWWANSent : @(WWANSent), DataCounterKeyWWANReceived : @(WWANReceived)}; }

¡Mejorado el soporte de copiar / pegar!


Para agregar a la respuesta aceptada, es importante darse cuenta de que la cantidad de datos mostrados por la interfaz se desborda y reinicia a 0 después de cada 4 GB, especialmente si está usando este código para calcular la diferencia entre dos lecturas. Esto se debe a que ifi_obytes y ifi_ibytes son uint_32 y su valor máximo es 4294967295.

Además, recomiendo usar ints sin signo para las variables que contienen los datos enviados y recibidos. Las entradas normales tienen la mitad del valor máximo de un entero sin signo, por lo que al agregar ifi_obytes, puede causar un desbordamiento.

unsigned int sent = 0; sent += networkStatisc->ifi_obytes;


Swift versión de la respuesta aceptada. También rompo el código en unidades más pequeñas.

struct DataUsageInfo { var wifiReceived: UInt32 = 0 var wifiSent: UInt32 = 0 var wirelessWanDataReceived: UInt32 = 0 var wirelessWanDataSent: UInt32 = 0 mutating func updateInfoByAdding(info: DataUsageInfo) { wifiSent += info.wifiSent wifiReceived += info.wifiReceived wirelessWanDataSent += info.wirelessWanDataSent wirelessWanDataReceived += info.wirelessWanDataReceived } } class DataUsage { private static let wwanInterfacePrefix = "pdp_ip" private static let wifiInterfacePrefix = "en" class func getDataUsage() -> DataUsageInfo { var interfaceAddresses: UnsafeMutablePointer<ifaddrs> = nil var dataUsageInfo = DataUsageInfo() guard getifaddrs(&interfaceAddresses) == 0 else { return dataUsageInfo } var pointer = interfaceAddresses while pointer != nil { guard let info = getDataUsageInfo(from: pointer) else { pointer = pointer.memory.ifa_next continue } dataUsageInfo.updateInfoByAdding(info) pointer = pointer.memory.ifa_next } freeifaddrs(interfaceAddresses) return dataUsageInfo } private class func getDataUsageInfo(from infoPointer: UnsafeMutablePointer<ifaddrs>) -> DataUsageInfo? { let pointer = infoPointer let name: String! = String.fromCString(infoPointer.memory.ifa_name) let addr = pointer.memory.ifa_addr.memory guard addr.sa_family == UInt8(AF_LINK) else { return nil } return dataUsageInfo(from: pointer, name: name) } private class func dataUsageInfo(from pointer: UnsafeMutablePointer<ifaddrs>, name: String) -> DataUsageInfo { var networkData: UnsafeMutablePointer<if_data> = nil var dataUsageInfo = DataUsageInfo() if name.hasPrefix(wifiInterfacePrefix) { networkData = unsafeBitCast(pointer.memory.ifa_data, UnsafeMutablePointer<if_data>.self) dataUsageInfo.wifiSent += networkData.memory.ifi_obytes dataUsageInfo.wifiReceived += networkData.memory.ifi_ibytes } else if name.hasPrefix(wwanInterfacePrefix) { networkData = unsafeBitCast(pointer.memory.ifa_data, UnsafeMutablePointer<if_data>.self) dataUsageInfo.wirelessWanDataSent += networkData.memory.ifi_obytes dataUsageInfo.wirelessWanDataReceived += networkData.memory.ifi_ibytes } return dataUsageInfo } }


Una nueva versión basada en versiones anteriores, pero adaptada para Swift4 y Xcode 9

struct DataUsageInfo { var wifiReceived: UInt32 = 0 var wifiSent: UInt32 = 0 var wirelessWanDataReceived: UInt32 = 0 var wirelessWanDataSent: UInt32 = 0 mutating func updateInfoByAdding(info: DataUsageInfo) { wifiSent += info.wifiSent wifiReceived += info.wifiReceived wirelessWanDataSent += info.wirelessWanDataSent wirelessWanDataReceived += info.wirelessWanDataReceived } } class DataUsage { private static let wwanInterfacePrefix = "pdp_ip" private static let wifiInterfacePrefix = "en" class func getDataUsage() -> DataUsageInfo { var interfaceAddresses: UnsafeMutablePointer<ifaddrs>? = nil var dataUsageInfo = DataUsageInfo() guard getifaddrs(&interfaceAddresses) == 0 else { return dataUsageInfo } var pointer = interfaceAddresses while pointer != nil { guard let info = getDataUsageInfo(from: pointer!) else { pointer = pointer!.pointee.ifa_next continue } dataUsageInfo.updateInfoByAdding(info: info) pointer = pointer!.pointee.ifa_next } freeifaddrs(interfaceAddresses) return dataUsageInfo } private class func getDataUsageInfo(from infoPointer: UnsafeMutablePointer<ifaddrs>) -> DataUsageInfo? { let pointer = infoPointer let name: String! = String(cString: infoPointer.pointee.ifa_name) let addr = pointer.pointee.ifa_addr.pointee guard addr.sa_family == UInt8(AF_LINK) else { return nil } return dataUsageInfo(from: pointer, name: name) } private class func dataUsageInfo(from pointer: UnsafeMutablePointer<ifaddrs>, name: String) -> DataUsageInfo { var networkData: UnsafeMutablePointer<if_data>? = nil var dataUsageInfo = DataUsageInfo() if name.hasPrefix(wifiInterfacePrefix) { networkData = unsafeBitCast(pointer.pointee.ifa_data, to: UnsafeMutablePointer<if_data>.self) dataUsageInfo.wifiSent += networkData?.pointee.ifi_obytes ?? 0 dataUsageInfo.wifiReceived += networkData?.pointee.ifi_ibytes ?? 0 } else if name.hasPrefix(wwanInterfacePrefix) { networkData = unsafeBitCast(pointer.pointee.ifa_data, to: UnsafeMutablePointer<if_data>.self) dataUsageInfo.wirelessWanDataSent += networkData?.pointee.ifi_obytes ?? 0 dataUsageInfo.wirelessWanDataReceived += networkData?.pointee.ifi_ibytes ?? 0 } return dataUsageInfo } }