开发中涉及到的方方面面

iOS 获取设备IP地址

2017-08-10  本文已影响0人  孟浩没有然丶

//首先导入头文件信息#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];

上一篇下一篇

猜你喜欢

热点阅读