#include<ifaddrs.h>
#include<arpa/inet.h>
#include<net/if.h>
#import "PCUtil.h"
#import "NSObject+Additions.h"
+(NSString *)getIPAddress
{
NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];
NSString *type;
struct ifaddrs *interface;
NSString *name=@"";
// retrieve the current interfaces - returns 0 on success
struct ifaddrs *interfaces;
if(!getifaddrs(&interfaces)) {
// Loop through linked list of interfaces
for(interface=interfaces; interface; interface=interface->ifa_next) {
if(!(interface->ifa_flags & IFF_UP)) {
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)) {
name = [NSString stringWithUTF8String:interface->ifa_name];
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);
}
if (type) {
NSString* keys = @"en0/ipv4";
NSString* addressName = [addresses objectForKey:keys];
NSString* _FourGkey = @"pdp_ip0/ipv4";
NSString* _FourGAddressName = [addresses objectForKey:_FourGkey];
if (![PNCUtil strNilOrEmpty:addressName]) {//wifi网络
return addressName;
}else if (![PNCUtil strNilOrEmpty:_FourGAddressName]){//4g、3g网络
//获取公网ip地址(暂时不用)
/*NSURL *ipURL = [NSURL URLWithString:@"http://ip.taobao.com/service/getIpInfo.php?ip=myip"];
NSData *data = [NSData dataWithContentsOfURL:ipURL];
NSDictionary *dic = [data JSONValue];
NSString *ip=[dic objectForKey:@"data"][@"ip"];*/
return _FourGAddressName;
}else{
return @"";
}
}else{
return @"";
}
}