iOS 获取设备IP地址

//首先导入头文件信息#include#include#include#define IOS_CELLULAR    @"pdp_ip0"

#define IOS_WIFI        @"en0"

//#define IOS_VPN      @"utun0"

#define IP_ADDR_IPv4    @"ipv4"

#define IP_ADDR_IPv6    @"ipv6"

二.方法实现

//获取设备当前网络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];

if(address) *stop = YES;

} ];

return address ? address : @"0.0.0.0";

}

//获取所有相关IP信息

- (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;

}

三.方法调用

四.调用结果

"bridge100/ipv4" = "192.168.2.1";

"bridge100/ipv6" = "fe80::e:c6ff:fe6c:db64";

"en0/ipv4" = "169.254.112.147";

"en0/ipv6" = "fe80::a299:9bff:fe1c:c6ed";

"en5/ipv4" = "192.168.1.110";

"en5/ipv6" = "fe80::20e:c6ff:fec6:c857";

"lo0/ipv4" = "127.0.0.1";

"lo0/ipv6" = "fe80::1";

TIPs:

获取外网IP

很多人说这个方法只能获取到内网IP,无法获取公网IP,确实,这边补充下获取公网IP方式。

//方法一:

NSError *error;

NSURL *ipURL = [NSURL URLWithString:@"http://ifconfig.me/ip"];

NSString *ip = [NSString stringWithContentsOfURL:ipURL encoding:NSUTF8StringEncoding error:&error];

//方法二:个人推荐用这个请求,速度比较快

/*

http://ipof.in/json

http://ipof.in/xml

http://ipof.in/txt

If you want HTTPS you can use the same URLs with https prefix. The advantage being that even if you are on a Wifi you will get the public address.

*/

NSError *error;

NSURL *ipURL = [NSURL URLWithString:@"http://ipof.in/txt"];

NSString *ip = [NSString stringWithContentsOfURL:ipURL encoding:NSUTF8StringEncoding error:&error];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在c++或者Object-C文件下,添加头文件: #import #import 并添加以下代码: //获取i...
    彗星来的那一夜阅读 479评论 0 0
  • 研究IPv6 socket编程原因: Supporting IPv6 in iOS 9 WWDC2015苹果宣布在...
    li大鹏阅读 7,369评论 7 15
  • 知道怎么做和去做之间差了一个大西洋。 学好英语的最简单有效的方式就是“用”,然而,很简单的道理,却做不起来,尤其不...
    四横阅读 169评论 0 0
  • 非常享受和孩子在一起的假期时光,今天和孩子在一起痛快的玩了一天,可是晚上要面对好习惯群里的孩子,我才发现,今天我什...
    甜菜的眼泪阅读 229评论 0 1
  • 笔墨里的时光12/30 读书:无 仲处长(据说是南京关区的)-开班仪式 今天早上不到八点到了会议厅,找了一个...
    柠檬草LF阅读 972评论 0 2