ios 设备所在网络IP地址获取

来源:互联网 发布:学sql和access哪个好 编辑:程序博客网 时间:2024/06/09 19:56

一、获取设备的IP地址

1、方法一

#pragma mark - 获取设备当前网络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];         //筛选出IP地址格式         if([self isValidatIP:address]) *stop = YES;     } ];    return address ? address : @"0.0.0.0";}- (BOOL)isValidatIP:(NSString *)ipAddress {    if (ipAddress.length == 0) {        return NO;    }    NSString *urlRegEx = @"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";    NSError *error;    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options:0 error:&error];    if (regex != nil) {        NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])];        if (firstMatch) {            NSRange resultRange = [firstMatch rangeAtIndex:0];            NSString *result=[ipAddress substringWithRange:resultRange];            //输出结果            NSLog(@"%@",result);            return YES;        }    }    return NO;}- (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;}

2、方法二

- (NSString *)deviceIPAdress{    NSString *address = @"IP Error";    struct ifaddrs *interfaces = NULL;    struct ifaddrs *temp_addr = NULL;    int success = 0;    success = getifaddrs(&interfaces);    if (success == 0) {        temp_addr = interfaces;        while (temp_addr != NULL) {            if (temp_addr->ifa_addr->sa_family == AF_INET) {                if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {                    address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];                }            }            temp_addr = temp_addr->ifa_next;        }    }    freeifaddrs(interfaces);    return address;}

二、获取Wifi名字

1、头文件引用

#import <SystemConfiguration/CaptiveNetwork.h>

2、函数实现

+(NSString *) currentWifiSSID {#if TARGET_OS_SIMULATOR    return @"(simulator)";#else    NSArray *ifs = (__bridge id)CNCopySupportedInterfaces();    id info = nil;    for (NSString *ifnam in ifs) {        info = (__bridge id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);        if (info && [info count]) {            break;        }    }    NSDictionary *dctySSID = (NSDictionary *)info;    NSString *ssid = [dctySSID objectForKey:@"SSID"] ;    return ssid;#endif}
0 0
原创粉丝点击