博客> iOS 获取手机当前IP
iOS 获取手机当前IP
2018-07-20 05:52 评论:0 阅读:912 易_君
ios oc 手机IP IP信息

pragma mark --.h文件

// // PhoneIP.m // Service // // Created by 易元江 on 2017/7/26. // Copyright © 2017年 Apple. All rights reserved. //

import

@interface PhoneIP : NSObject

/* Wifi 获取手机当前网络IP地址 /

  • (NSString *)deviceIPAdress; /* 蜂窝 获取手机当前网络IP地址 /
  • (NSString *)getIPAddress:(BOOL)preferIPv4;

/* 获取手机当前网络IP地址 /

  • (NSString *)deviceIP;

@end

pragma mark --.m文件

// // PhoneIP.m // Service // // Created by 易元江 on 2017/7/26. // Copyright © 2017年 Apple. All rights reserved. //

import "PhoneIP.h"

import

include

import

define IOS_CELLULAR @"pdp_ip0"

define IOS_WIFI @"en0"

define IOS_VPN @"utun0"

define IP_ADDR_IPv4 @"ipv4"

define IP_ADDR_IPv6 @"ipv6"

@implementation PhoneIP

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];
        return result;
    }

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

  • (NSString )deviceIPAdress { //必须在有网的情况下才能获取手机的IP地址 NSString address = @""; struct ifaddrs interfaces = NULL; struct ifaddrs temp_addr = NULL; int success = 0;

    success = getifaddrs(&interfaces);

    if (success == 0) { // 0 表示获取成功 temp_addr = interfaces; while (temp_addr != NULL) { if( temp_addr->ifa_addr->sa_family == AF_INET) { // Check if interface is en0 which is the wifi connection on the iPhone if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) { // Get NSString from C String address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; } } temp_addr = temp_addr->ifa_next; } } freeifaddrs(interfaces);

    return address; }

  • (NSString *)getNetWorkStates{

    UIApplication app = [UIApplication sharedApplication]; NSArray children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews]; NSString *state = [[NSString alloc]init]; int netType = 0; //获取到网络返回码 for (id child in children) { if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) { //获取到状态栏 netType = [[child valueForKeyPath:@"dataNetworkType"]intValue];

        switch (netType) {
            case 0:
                state = @"无网络";
                //无网模式
                break;
            case 1:
                state =  @"2G";
                break;
            case 2:
                state =  @"3G";
                break;
            case 3:
                state =   @"4G";
                break;
            case 5:
            {
                state =  @"wifi";
                break;
            default:
                break;
            }
        }
    }
    //根据状态选择

    } return state; }

  • (NSString )deviceIP { NSString netState = [self getNetWorkStates];

    if ([netState isEqualToString:@"wifi"]) {

    return [self deviceIPAdress];

    }else{

    return [self getIPAddress:YES];

    } }

@end

收藏
0
sina weixin mail 回到顶部