iOS-- 获取手机的IP地址

作者: 彬至睢阳 | 来源:发表于2018-04-01 16:30 被阅读0次

    /**

    *  获取手机的IP地址

    *

    *  @return IP

    */

    + (NSString *)getDeviceIPAdress:(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 ] ;

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

        }

        ///

        //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";

    }

    相关文章

      网友评论

        本文标题:iOS-- 获取手机的IP地址

        本文链接:https://www.haomeiwen.com/subject/cwvyfftx.html