项目用到要获取设备的IP地址,有2种方法:
1)第一种比较简单,但是只有当你的设备连接到WIFI时才能获取到IP地址,倘若你的设备用的是流量,那就不行。代码如下:
1 #import2 #import 3 4 5 6 // Get IP Address 7 - (NSString *)getIPAddress { 8 NSString *address = @"error"; 9 struct ifaddrs *interfaces = NULL; 10 struct ifaddrs *temp_addr = NULL; 11 int success = 0; 12 // retrieve the current interfaces - returns 0 on success 13 success = getifaddrs(&interfaces); 14 if (success == 0) { 15 // Loop through linked list of interfaces 16 temp_addr = interfaces; 17 while(temp_addr != NULL) { 18 if(temp_addr->ifa_addr->sa_family == AF_INET) { 19 // Check if interface is en0 which is the wifi connection on the iPhone 20 if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) { 21 // Get NSString from C String 22 address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; 23 } 24 } 25 temp_addr = temp_addr->ifa_next; 26 } 27 } 28 // Free memory 29 freeifaddrs(interfaces); 30 return address; 31 32 }
2)第二种方法比较通用,无论是WIFI还是流量都能获取到IP地址,代码如下:
1 #import2 #import 3 #import 4 5 #define IOS_CELLULAR @"pdp_ip0" 6 #define IOS_WIFI @"en0" 7 #define IOS_VPN @"utun0" 8 #define IP_ADDR_IPv4 @"ipv4" 9 #define IP_ADDR_IPv6 @"ipv6" 10 11 12 #pragma mark - 获取设备当前网络IP地址 13 + (NSString *)getIPAddress:(BOOL)preferIPv4 14 { 15 NSArray *searchArray = preferIPv4 ? 16 @[ IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] : 17 @[ IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ; 18 19 NSDictionary *addresses = [self getIPAddresses]; 20 NSLog(@"addresses: %@", addresses); 21 22 __block NSString *address; 23 [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOLBOOL *stop) 24 { 25 address = addresses[key]; 26 //筛选出IP地址格式 27 if([self isValidatIP:address]) *stop = YES; 28 } ]; 29 return address ? address : @"0.0.0.0"; 30 } 31 32 + (BOOL)isValidatIP:(NSString *)ipAddress { 33 if (ipAddress.length == 0) { 34 return NO; 35 } 36 NSString *urlRegEx = @"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." 37 "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." 38 "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." 39 "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; 40 41 NSError *error; 42 NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options:0 error:&error]; 43 44 if (regex != nil) { 45 NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])]; 46 47 if (firstMatch) { 48 NSRange resultRange = [firstMatch rangeAtIndex:0]; 49 NSString *result=[ipAddress substringWithRange:resultRange]; 50 //输出结果 51 NSLog(@"%@",result); 52 return YES; 53 } 54 } 55 return NO; 56 } 57 58 + (NSDictionary *)getIPAddresses 59 { 60 NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8]; 61 62 // retrieve the current interfaces - returns 0 on success 63 struct ifaddrs *interfaces; 64 if(!getifaddrs(&interfaces)) { 65 // Loop through linked list of interfaces 66 struct ifaddrs *interface; 67 for(interface=interfaces; interface; interface=interface->ifa_next) { 68 if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) { 69 continue; // deeply nested code harder to read 70 } 71 const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr; 72 char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ]; 73 if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) { 74 NSString *name = [NSString stringWithUTF8String:interface->ifa_name]; 75 NSString *type; 76 if(addr->sin_family == AF_INET) { 77 if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) { 78 type = IP_ADDR_IPv4; 79 } 80 } else { 81 const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr; 82 if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) { 83 type = IP_ADDR_IPv6; 84 } 85 } 86 if(type) { 87 NSString *key = [NSString stringWithFormat:@"%@/%@", name, type]; 88 addresses[key] = [NSString stringWithUTF8String:addrBuf]; 89 } 90 } 91 } 92 // Free memory 93 freeifaddrs(interfaces); 94 } 95 return [addresses count] ? addresses : nil; 96 }
Reference
[1]
[2]
原文地址: