iPad: Comment get l'adresse IP programmée WIRED (pas via sans fil)

Je sais comment get l'adresse IP, via l'interface en0, vu ici: iPhone / iPad / OSX: Comment get mon adresse IP par programme?

Mais maintenant j'implémente une connection filaire au LAN en utilisant l'adaptateur de camera Lightning vers USB 3 afin de me connecter à Internet sans Wifi en 9.3, donc la solution ci-dessus ne peut pas résoudre l'adresse IP sans la connection sans fil. L'iPad est très bien sur Internet, il est maintenant important que l'application puisse résoudre l'adresse IP de l'appareil.

Comment puis-je get l'adresse IP de l'iPad via une connection Lightning-> USB-> Ethernet? Par opposition à sans fil.
Merci d'avance!

interface en2 .

Ajouter:

 [[NSSsortingng ssortingngWithUTF8Ssortingng:temp_addr->ifa_name] isEqualToSsortingng:@"en2"] 

à la première solution dans iPhone / iPad / OSX: Comment get mon adresse IP par programme? pour get également l'adresse IP de l'appareil via une connection filaire.

MISE À JOUR: Expansion juste sur la solution de @Raptor liée ci-dessus; cela returnnera à la fois l'adresse IP filaire et sans fil, si les deux ou l'un ou l'autre est présent. Ensuite, vérifiez les longueurs des valeurs du dictionary de return pour voir avec quoi vous travaillez.

 #import <ifaddrs.h> #import <arpa/inet.h> + (NSDictionary *)getBothIPAddresses { const NSSsortingng *WIFI_IF = @"en0"; NSArray *KNOWN_WIRED_IFS = @[@"en2",@"en3",@"en4"]; NSArray *KNOWN_CELL_IFS = @[@"pdp_ip0",@"pdp_ip1",@"pdp_ip2",@"pdp_ip3"]; const NSSsortingng *UNKNOWN_IP_ADDRESS = @""; NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithDictionary:@{@"wireless":UNKNOWN_IP_ADDRESS, @"wired":UNKNOWN_IP_ADDRESS, @"cell":UNKNOWN_IP_ADDRESS}]; struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL; int success = 0; // resortingeve the current interfaces - returns 0 on success success = getifaddrs(&interfaces); if (success == 0) { // Loop through linked list of interfaces temp_addr = interfaces; while(temp_addr != NULL) { if (temp_addr->ifa_addr == NULL) { continue; } if(temp_addr->ifa_addr->sa_family == AF_INET) { // Check if interface is en0 which is the wifi connection on the iPhone if([[NSSsortingng ssortingngWithUTF8Ssortingng:temp_addr->ifa_name] isEqualToSsortingng:WIFI_IF]) { // Get NSSsortingng from C Ssortingng [addresses setObject:[NSSsortingng ssortingngWithUTF8Ssortingng:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)] forKey:@"wireless"]; } // Check if interface is a wired connection if([KNOWN_WIRED_IFS containsObject:[NSSsortingng ssortingngWithUTF8Ssortingng:temp_addr->ifa_name]]) { [addresses setObject:[NSSsortingng ssortingngWithUTF8Ssortingng:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)] forKey:@"wired"]; } // Check if interface is a cellular connection if([KNOWN_CELL_IFS containsObject:[NSSsortingng ssortingngWithUTF8Ssortingng:temp_addr->ifa_name]]) { [addresses setObject:[NSSsortingng ssortingngWithUTF8Ssortingng:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)] forKey:@"cell"]; } } temp_addr = temp_addr->ifa_next; } } // Free memory freeifaddrs(interfaces); return addresses; } 

UPDATE: en3 interface, une autre possibilité; semble dépendre du type d'adaptateur. Je pense qu'il pourrait y avoir plus d'interfaces qui me manquent encore basé sur le matériel utilisé, donc s'il vous plaît commentez si quelqu'un découvre plus.

MISE À JOUR: en4 aussi bien; ne dépend pas nécessairement de l'adaptateur comme je le pensais à l'origine, car un Mini avec tout le même matériel à un moment donné a décidé de passer d'une interface à cette nouvelle. Aussi, je commence à penser qu'il peut être plus facile de simplement comparer le nom ifa_name à n'importe quelle string avec un format de en[2..n] , tant que c'est dans la famille AF_INET (par exemple, en1 est NOT et doesn ' t returnner une adresse que nous cherchons); il est probablement prématuré d'implémenter quelque chose comme ça pour Prod sans plus de preuve, donc pour l'instant je gère avec une list d'interfaces filaires «connues».

MISE À JOUR: Considère AF_INET interfaces cellulaires AF_INET , mentionné dans Qu'est-ce que signifie exactement le nom de l'interface réseau iOS? qu'est-ce que pdp_ip? c'est quoi?

Mis à jour pour Swift 3

  import arpa import ifaddrs class func getBothIPAddresses() -> [AnyHashable: Any] { let WIFI_IF: Ssortingng = "en0" let KNOWN_WIRED_IFS: [Any] = ["en2", "en3", "en4"] let KNOWN_CELL_IFS: [Any] = ["pdp_ip0", "pdp_ip1", "pdp_ip2", "pdp_ip3"] let UNKNOWN_IP_ADDRESS: Ssortingng = "" var addresses: [AnyHashable: Any] = ["wireless": UNKNOWN_IP_ADDRESS, "wired": UNKNOWN_IP_ADDRESS, "cell": UNKNOWN_IP_ADDRESS] var interfaces: ifaddrs? = nil var temp_addr: ifaddrs? = nil var success: Int = 0 // resortingeve the current interfaces - returns 0 on success success = getifaddrs(interfaces) if success == 0 { // Loop through linked list of interfaces temp_addr = interfaces while temp_addr != nil { if temp_addr?.ifa_addr == nil { continue } if temp_addr?.ifa_addr?.sa_family == AF_INET { // Check if interface is en0 which is the wifi connection on the iPhone if (Ssortingng(utf8Ssortingng: temp_addr?.ifa_name) == WIFI_IF) { // Get NSSsortingng from C Ssortingng addresses["wireless"] = Ssortingng(utf8Ssortingng: inet_ntoa((temp_addr?.ifa_addr as? sockaddr_in)?.sin_addr)) } // Check if interface is a wired connection if KNOWN_WIRED_IFS.contains(Ssortingng(utf8Ssortingng: temp_addr?.ifa_name)) { addresses["wired"] = Ssortingng(utf8Ssortingng: inet_ntoa((temp_addr?.ifa_addr as? sockaddr_in)?.sin_addr)) } // Check if interface is a cellular connection if KNOWN_CELL_IFS.contains(Ssortingng(utf8Ssortingng: temp_addr?.ifa_name)) { addresses["cell"] = Ssortingng(utf8Ssortingng: inet_ntoa((temp_addr?.ifa_addr as? sockaddr_in)?.sin_addr)) } } temp_addr = temp_addr?.ifa_next } } // Free memory freeifaddrs(interfaces) return addresses }