iOS 获取IP地址

news/2024/7/20 20:36:31 标签: ios

创建一个类文件

#import <Foundation/Foundation.h>
@interface IPAddress : NSObject

+ (NSString *)getIPAddress:(BOOL)preferIPv4;
@end
#import "IPAddress.h"
#import <ifaddrs.h>
#import <arpa/inet.h>
#import <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"

@implementation IPAddress


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

@end

在其他文件中使用[IPAddress getIPAddress:YES]


http://www.niftyadmin.cn/n/1549809.html

相关文章

windows下apache及mysql定时自动重启设置

采用at命令添加计划任务 有关使用语法可以到window&#xff0d;》“开始”&#xff0d;》运行“cmd”&#xff0d;》执行命令“at /”&#xff0c;这样界面中就会显示at命令的语法。 如何让服务器定时启动apache与mysql&#xff1a; 1、在c:盘根目录新建一个autostartserve…

iOS UITextField获取或失去焦点方法

实现如下效果&#xff0c;点击“账号”或“密码”&#xff0c;横线颜色由灰色变成蓝色 代码如下&#xff1a; UILabel *mNameTitle [[UILabel alloc] initWithFrame:CGRectMake(20, 200, 50, 40)]; mNameTitle.text "账号"; mNameTitle.textColor [mUserUtil he…

unity游戏开发之entitas框架

组件-实体-系统 &#xff08;ECS \CES&#xff09;游戏编程模型&#xff1a; 组件 一个组件可以使用C中的结构体来进行设计。它没有方法&#xff0c;只是用来存储一些数据&#xff0c;并不在它之上进行动作。一个经典的实现方式是&#xff0c;每一个不同的组件都继承至一个抽…

Swift UIAlertController的用法

自 iOS8 起&#xff0c;苹果就建议告警框使用 UIAlertController 来代替 UIAlertView 和 UIActionSheel。下面总结了一些常见的用法。 1. 简单的应用&#xff08;同时按钮响应Handler使用闭包函数) import UIKitclass ViewController: UIViewController {override func view…

php提示Array to string conversion 解决方案

这是个错误是我们在PHP使用中&#xff0c;把数组当成了字符串使用。有两种情况下会出现这种错误。 场景一 这种场景比较少&#xff0c;大多数都是新手才会犯&#xff0c;也很容易发现解决错误。就是字面意思&#xff0c;将数组当成字符串使用了。 示例&#xff1a; $arr ar…

swift—UIColor十六进制

新建一个文件UIColorhex.swift 2.代码 import Foundation import UIKitextension UIColor{class func colorWithHex(hexStr:String) -> UIColor{return UIColor.colorWithHex(hexStr : hexStr, alpha:1)}class func colorWithHex(hexStr:String, alpha:Float) -> UIColo…

wordpress内存不足问题“Fatal error:out of memory”

方法一&#xff1a; 在 .htaccess 文件中加上 php_value memory_limit 256M 方法二&#xff1a; 在你的 wp-config.php 文件中加上 define (WP_MEMORY_LIMIT, 256M ); 方法三&#xff1a; wp-settings.php&#xff0c;编辑这个文件&#xff0c;修改define(WP_MEMORY_LIM…

iOS-电子签名

有些APP开发中需要用到电子签名,封装成一个View,使用灵活. ZHSignatureView.h里的一些配置参数,可以不传 interface ZHSignatureView : UIView /**已签名的照片,跳转传入*/ property(nonatomic, strong) UIImage *signImage;/**签名笔划颜色&#xff0c;默认blackColor*/ prop…