en2
界面。
Add:
[[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en2"]
到第一个解决方案iPhone/iPad/OSX:如何以编程方式获取我的 IP 地址? https://stackoverflow.com/questions/7072989/iphone-ipad-osx-how-to-get-my-ip-address-programmatically还可以通过有线连接获取设备的 IP 地址。
更新:只是扩展@Raptor https://stackoverflow.com/users/188331/raptor上面链接的解决方案;这将返回有线和无线 IP 地址(如果两者或其中一个存在)。然后只需检查返回字典的值的长度即可了解您正在使用的内容。
#import <ifaddrs.h>
#import <arpa/inet.h>
+ (NSDictionary *)getBothIPAddresses {
const NSString *WIFI_IF = @"en0";
NSArray *KNOWN_WIRED_IFS = @[@"en1",@"en2",@"en3",@"en4"];
NSArray *KNOWN_CELL_IFS = @[@"pdp_ip0",@"pdp_ip1",@"pdp_ip2",@"pdp_ip3"];
const NSString *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;
// retrieve 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) {
temp_addr = temp_addr->ifa_next;
continue;
}
if(temp_addr->ifa_addr->sa_family == AF_INET) {
// Check if interface is en0 which is the wifi connection on the iPhone
if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:WIFI_IF]) {
// Get NSString from C String
[addresses setObject:[NSString stringWithUTF8String: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:[NSString stringWithUTF8String:temp_addr->ifa_name]]) {
[addresses setObject:[NSString stringWithUTF8String: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:[NSString stringWithUTF8String:temp_addr->ifa_name]]) {
[addresses setObject:[NSString stringWithUTF8String: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
接口,另一种可能性;似乎取决于适配器的类型。让我觉得根据所使用的硬件,我可能还缺少更多接口,所以如果有人发现更多接口,请发表评论。
UPDATE:
en4
以及;不一定像我最初想象的那样依赖于适配器,因为具有所有相同硬件的 Mini 在某一时刻决定从一个接口切换到这个新接口。另外,我开始认为将 ifa_name 与格式为的任何字符串进行比较可能更容易en[2..n]
,只要它在AF_INET
家庭(例如,en1
不是并且不会返回我们正在寻找的地址);在没有更多证据的情况下为 Prod 实现类似的东西可能还为时过早,所以现在我使用“已知”有线接口列表进行管理。
更新:
考虑蜂窝网络AF_INET
接口也提到过iOS 网络接口名称到底是什么意思?什么是 pdp_ip ? ap是什么? https://stackoverflow.com/questions/14334076/what-exactly-means-ios-networking-interface-name-whats-pdp-ip-whats-ap
更新:
以太网 IP 地址已开始出现在en1
最近在某些新iPad上出现了界面,因此当它是该成员时也应该考虑AF_INET
家庭。没有明显的规律或原因,不同的 iPad 型号和 iOS 版本都会发生这种情况。