iOS开发时如何获取当前设备的ip地址以及ip参数

来源:互联网 发布:淘宝我的空间 编辑:程序博客网 时间:2024/06/05 20:07

1.首先必不可少的肯定是引头文件

#include <ifaddrs.h>#include <arpa/inet.h>#include <net/if.h>#define IOS_CELLULAR    @"pdp_ip0"#define IOS_WIFI        @"en0"//#define IOS_VPN       @"utun0"#define IP_ADDR_IPv4    @"ipv4"#define IP_ADDR_IPv6    @"ipv6"

可command+点击进入.h查看方法。

2.获取ip地址和参数的方法

在这里有两个方法:
第一个或获取ip地址的,第二个是获取参数的。可根据需要自取所需

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

注:用的swift写的,但是在OC中也可以,将就着用吧

3.调用方法

调用的时请看清参数和返回类型就好,哪里需要可在哪里调用。

4.结果

下面是我调用出来数据:
“awdl0/ipv6” = “fe80::ec8a:90ff:fea4:6208”;
“en0/ipv4” = “192.168.0.107”;
“en0/ipv6” = “fe80::b6:dbd1:c383:273f”;
“lo0/ipv4” = “127.0.0.1”;
“lo0/ipv6” = “fe80::1”;
“utun0/ipv6” = “fe80::bc3d:bce1:faf2:16ec”;
“utun1/ipv6” = “fe80::ac92:61d7:da25:cc6c”;

0 0
原创粉丝点击