pragma mark --.h文件
// // PhoneIP.m // Service // // Created by 易元江 on 2017/7/26. // Copyright © 2017年 Apple. All rights reserved. //
import
@interface PhoneIP : NSObject
/* Wifi 获取手机当前网络IP地址 /
- (NSString *)deviceIPAdress; /* 蜂窝 获取手机当前网络IP地址 /
- (NSString *)getIPAddress:(BOOL)preferIPv4;
/* 获取手机当前网络IP地址 /
- (NSString *)deviceIP;
@end
pragma mark --.m文件
// // PhoneIP.m // Service // // Created by 易元江 on 2017/7/26. // Copyright © 2017年 Apple. All rights reserved. //
import "PhoneIP.h"
import
include
import
define IOS_CELLULAR @"pdp_ip0"
define IOS_WIFI @"en0"
define IOS_VPN @"utun0"
define IP_ADDR_IPv4 @"ipv4"
define IP_ADDR_IPv6 @"ipv6"
@implementation PhoneIP
pragma mark - 获取设备当前网络IP地址
-
(NSString )getIPAddress:(BOOL)preferIPv4 { NSArray searchArray = preferIPv4 ? @[ 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 ] : @[ 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 ] ;
NSDictionary *addresses = [self getIPAddresses]; NSLog(@"addresses: %@", addresses);
__block NSString address; [searchArray enumerateObjectsUsingBlock:^(NSString key, NSUInteger idx, BOOL stop) { address = addresses[key]; //筛选出IP地址格式 if([self isValidatIP:address]) stop = YES; } ]; return address ? address : @"0.0.0.0"; }
-
(BOOL)isValidatIP:(NSString )ipAddress { if (ipAddress.length == 0) { return NO; } NSString urlRegEx = @"^([01]?\d\d?|2[0-4]\d|25[0-5])\." "([01]?\d\d?|2[0-4]\d|25[0-5])\." "([01]?\d\d?|2[0-4]\d|25[0-5])\." "([01]?\d\d?|2[0-4]\d|25[0-5])$";
NSError error; NSRegularExpression regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options:0 error:&error];
if (regex != nil) { NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])];
if (firstMatch) { NSRange resultRange = [firstMatch rangeAtIndex:0]; NSString *result=[ipAddress substringWithRange:resultRange]; return result; }
} return NO; }
-
(NSDictionary )getIPAddresses { NSMutableDictionary addresses = [NSMutableDictionary dictionaryWithCapacity:8]; // retrieve the current interfaces - returns 0 on success struct ifaddrs interfaces; if(!getifaddrs(&interfaces)) { // Loop through linked list of interfaces struct ifaddrs interface; for(interface=interfaces; interface; interface=interface->ifa_next) { if(!(interface->ifa_flags & IFF_UP) / || (interface->ifa_flags & IFF_LOOPBACK) / ) { continue; // deeply nested code harder to read } const struct sockaddr_in addr = (const struct sockaddr_in)interface->ifa_addr; char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ]; if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) { NSString name = [NSString stringWithUTF8String:interface->ifa_name]; NSString type; if(addr->sin_family == AF_INET) { if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) { type = IP_ADDR_IPv4; } } else { const struct sockaddr_in6 addr6 = (const struct sockaddr_in6)interface->ifa_addr; if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) { type = IP_ADDR_IPv6; } } if(type) { NSString *key = [NSString stringWithFormat:@"%@/%@", name, type]; addresses[key] = [NSString stringWithUTF8String:addrBuf]; } } } // Free memory freeifaddrs(interfaces); } return [addresses count] ? addresses : nil; }
-
(NSString )deviceIPAdress { //必须在有网的情况下才能获取手机的IP地址 NSString address = @""; struct ifaddrs interfaces = NULL; struct ifaddrs temp_addr = NULL; int success = 0;
success = getifaddrs(&interfaces);
if (success == 0) { // 0 表示获取成功 temp_addr = interfaces; while (temp_addr != NULL) { 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:@"en0"]) { // Get NSString from C String address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; } } temp_addr = temp_addr->ifa_next; } } freeifaddrs(interfaces);
return address; }
-
(NSString *)getNetWorkStates{
UIApplication app = [UIApplication sharedApplication]; NSArray children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews]; NSString *state = [[NSString alloc]init]; int netType = 0; //获取到网络返回码 for (id child in children) { if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) { //获取到状态栏 netType = [[child valueForKeyPath:@"dataNetworkType"]intValue];
switch (netType) { case 0: state = @"无网络"; //无网模式 break; case 1: state = @"2G"; break; case 2: state = @"3G"; break; case 3: state = @"4G"; break; case 5: { state = @"wifi"; break; default: break; } } } //根据状态选择
} return state; }
-
(NSString )deviceIP { NSString netState = [self getNetWorkStates];
if ([netState isEqualToString:@"wifi"]) {
return [self deviceIPAdress];
}else{
return [self getIPAddress:YES];
} }
@end