iOS 如何获取手机外网IP地址(附内网IP地址)

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

查找了一些方法,最初以为拿到的就是手机对外的公网地址,其实只是本地IP地址。下面把获取手机内外网IP地址的方法总结下:

一、获取手机本地静态IP地址:(局域网)

方法1:

首先导入头文件:

//IP地址需求库
#import <sys/socket.h>
#import <sys/sockio.h>
#import <sys/ioctl.h>
#import <net/if.h>
#import <arpa/inet.h>

具体方法:

//获取设备IP地址
-(NSString *)getDeviceIPAddresses
{
    int sockfd = socket(AF_INET,SOCK_DGRAM, 0);
    // if (sockfd <</span> 0) return nil; //这句报错,由于转载的,不太懂,注释掉无影响,懂的大神欢迎指导
    NSMutableArray *ips = [NSMutableArray array];

    int BUFFERSIZE =4096;
    
    struct ifconf ifc;
    
    char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
    
    struct ifreq *ifr, ifrcopy;
    
    ifc.ifc_len = BUFFERSIZE;
    
    ifc.ifc_buf = buffer;
    
    if (ioctl(sockfd,SIOCGIFCONF, &ifc) >= 0){
        
        for (ptr = buffer; ptr < buffer + ifc.ifc_len; ){
            
            ifr = (struct ifreq *)ptr;
            
            int len =sizeof(struct sockaddr);
            
            if (ifr->ifr_addr.sa_len > len) {
                len = ifr->ifr_addr.sa_len;
            }
            
            ptr += sizeof(ifr->ifr_name) + len;
            
            if (ifr->ifr_addr.sa_family !=AF_INET) continue;
            
            if ((cptr = (char *)strchr(ifr->ifr_name,':')) != NULL) *cptr =0;
            
            if (strncmp(lastname, ifr->ifr_name,IFNAMSIZ) == 0)continue;
            
            memcpy(lastname, ifr->ifr_name,IFNAMSIZ);
            
            ifrcopy = *ifr;
            
            ioctl(sockfd,SIOCGIFFLAGS, &ifrcopy);
            
            if ((ifrcopy.ifr_flags &IFF_UP) == 0)continue;

            NSString *ip = [NSString stringWithFormat:@"%s",inet_ntoa(((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr)];
            [ips addObject:ip];
        }
    }
    close(sockfd);

    NSString *deviceIP =@"";
    
    for (int i=0; i < ips.count; i++){
        if (ips.count >0){
            deviceIP = [NSString stringWithFormat:@"%@",ips.lastObject];
        }
    }
    
    return deviceIP;
}

参考:http://blog.sina.com.cn/s/blog_b0b335e20102y3im.html

 

方法2:

导入两个头文件,此法只能获取到WiFi环境下的本地IP,比较简洁

#import <ifaddrs.h>
#import <arpa/inet.h>
+ (NSString *)deviceIPAdress {
    NSString *address = @"手机移动网络";
    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);
    
    //    NSLog(@"手机的IP是:%@", address);
    
    return address;
}

 

二、获取手机外网IP(公网IP)

网上找了很久获取外网IP的方法,很多访问网址已经不能用了,能用的主要有2个,但是获取到的IP地址不同,下面详细介绍。

方法1:此前采用的淘宝接口现在更改了不能用了,更新一下:

https://www.taobao.com/help/getip.php

https://www.fbisb.com/ip.php

这两个都可以,速度也比较快,但是与百度搜索IP的结果不一样,自取。

 

方法2:此方法访问的搜狐的获取ip接口,返回的IP与百度淘宝不一样。

-(NSString *)getWANIPAddress
{
    NSError *error;
    NSURL *ipURL = [NSURL URLWithString:@"http://pv.sohu.com/cityjson?ie=utf-8"];
    
    NSMutableString *ip = [NSMutableString stringWithContentsOfURL:ipURL encoding:NSUTF8StringEncoding error:&error];
    //判断返回字符串是否为所需数据
    if ([ip hasPrefix:@"var returnCitySN = "]) {
        //对字符串进行处理,然后进行json解析
        //删除字符串多余字符串
        NSRange range = NSMakeRange(0, 19);
        [ip deleteCharactersInRange:range];
        NSString * nowIp =[ip substringToIndex:ip.length-1];
        //将字符串转换成二进制进行Json解析
        NSData * data = [nowIp dataUsingEncoding:NSUTF8StringEncoding];
        NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"%@",dict);
        return dict[@"cip"] ? dict[@"cip"] : @"";
    }
    return @"";
}

 

访问接口取到的数据:

参考:http://blog.csdn.net/henry_moneybag/article/details/51463375
 

还有一个接口可直接获取到IP,但返回比较慢,可能返回失败,不推荐。特点是结果与百度搜索ip的结果一致。

    NSError *error;
    NSURL *ipURL = [NSURL URLWithString:@"http://ifconfig.me/ip"];
    NSString *ip = [NSString stringWithContentsOfURL:ipURL encoding:NSUTF8StringEncoding error:&error];

 

获取当前路由器的外网IP(WAN IP 可以利用一些在线服务来查询当前设备的外网IP,如[whatismyip.com](https://www.whatismyip.com/)、[ipinfo.io](https://ipinfo.io/) 或 [icanhazip.com](https://icanhazip.com/)。另外,需要强调的是,这些方法获取的都是你连接到互联网时所使用的公共IP地址,而不是你局域网内部的私有IP地址。请注意,路由器的外网IP地址是由你的互联网服务提供商(ISP)分配的,并且可能会在不同时间发生变化。 阅读详情

相关推荐

别再傻傻分不清了!5分钟搞懂你家WiFi的‘内网IP’和‘外网IP’(查询方法)

本文详细解析了家庭WiFi中的‘内网IP’和‘外网IP’区别,帮助用户快速理解网络地址体系。通过生活场景类比和NAT技术解释,揭示内外网IP的核心差异,并提供实用的查询方法和应用场景,如远程访问和游戏联机优化,助你安全高效管理家庭网络。

weixin_30323631的博客 565

获取本机外网 IP 的方法

我们可以使用 requests 库发送 HTTP 请求,获取 JSON 格式的响应,然后解析其中的 IP 地址。的函数,该函数发送 HTTP GET 请求到 http://www.ip138.com/,并获取响应的 HTML 内容。然后,我们使用正则表达式模式匹配 HTML 内容中的 IP 地址,并返回该地址。的函数,该函数发送 HTTP GET 请求到 http://ipinfo.io/json,并获取响应的 JSON 数据。在 Python 中,可以使用多种方法获取本机的外网 IP 地址

pytorchCode的博客 3627

笔记本双网卡实战:手机USB共享+内网WiFi同时使用(路由表配置详解)

本文详细介绍了笔记本双网卡配置方法,通过手机USB共享网络与内网WiFi同时连接,实现内外网无缝访问。重点解析了路由表配置技巧,包括默认路由优化、内网专用路由添加及网络优先级调整,帮助用户高效管理网络流量,提升远程办公体验。

weixin_29201313的博客 542

iOS开发中获取本机IP地址的方法

你可以在Xcode的"Signing & Capabilities"选项卡中的"App Sandbox"部分中启用"Outgoing Connections (Client)"权限。在Xcode中,选择你的项目,然后在"General"选项卡的"Frameworks, Libraries, and Embedded Content"部分点击"+"按钮,搜索"NetworkExtension"并将其添加到项目中。然后,我们遍历该接口的地址列表,找到一个符合IPv4地址格式的地址,并将其作为本机IP地址返回。

ByteJolt的博客 1298

iOS -- 获取当前设备的IP地址

获取iOS设备地址

叫我龙哥的CSDN 2856

iOS 获取网络ip

#import "IpAddress.h" #import #import #import #define IOS_CELLULAR @"pdp_ip0" #define IOS_WIFI @"en0" #define IOS_VPN @"utun0" #define IP_ADDR_IPv

征战无悔人生 1574

从Windows到手机:一步步教你查询IP地址

IP地址是互联网中用于唯一标识设备的数字标签,它帮助区分不同的设备并实现网络通信。在设置网络、进行远程协助或排查网络问题时,我们可能需要知道自己的IP地址。然而,许多人并不清楚如何查询本机的IP地址。本文将介绍IP地址的基础知识以及在不同设备上查询本机IP地址的方法。

qq_45079095的博客 2036

手机外网IP查询与运营商信息获取实战工具包

公网IP地址是互联网中唯一标识设备的逻辑地址,用于实现跨网络的数据路由与通信。在移动网络中,手机通过运营商分配的公网IP与外部服务交互,该IP通常由蜂窝基站网关经NAT(网络地址转换)技术映射而出。IPv4环境下,因地址资源紧张,多数用户共享同一公网IP,形成“多对一”关系,影响个体精准定位。而运营商信息则通过MCC(移动国家码)与MNC(移动网络码)编码体系确定,嵌入SIM卡及无线信令中,反映用户归属运营商及地理区域。二者结合,构成终端网络身份的关键维度,广泛应用于定位、风控与个性化服务中。

weixin_42103128的博客 1114

【内外网】要让电脑WiFi 连内网、USB 连手机外网并同时可用

解决使用内网开发代码,有时候又要用到外网需要反复切换的麻烦问题,效果是可以电脑可以同时使用内外网内网启动项目开发也能拉取Git代码

一根狗尾巴草的博客 2050

ios 内网wifi 外网4g 连接

头疼问题: 近期有个项目涉及APP连接硬件,APP和硬件处于同一局域网,那么问题来了,APP在连接硬件的同时也要能上网,比如在地图上显示当前手机的位置,那么就需要外网来定位,如果此时APP既能连接硬件—WIFI模式,又能连接蜂窝移动—3G/4G模式,问题就迎刃而解了; 解决方案: 1,国内搜索,基本没有,过; 2,翻墙国外搜索,一个台湾论坛发现方法,经测试可以; 具体步骤

zuojinmin的博客 2587

网络知识:服务器中的内网外网介绍

网络知识:服务器中的内网外网介绍

weixin_51725318的博客 1785

iOS判断连接的是内网还是外网

ios判断自己连接的网络是内网还是外网//判断连接的服务器相对于本机为内网还是外网

陨落星辰-光 的博客 2498

外网访问家庭局域网方案,解决运营商100.x.x.x内网IP问题

相信不少网友和我一样,为了实现远程控制、NAS访问、组建私有云、摄像头监控之类的需求,把光猫改成了桥接模式,并用自己的路由器拨号、进行端口了映射。本人之前一直用着没啥问题,不过,最近突然出现了无法访问的情况,原本还以为是光猫出了什么问题,但检查之后吓了一跳。 (自家的IP突然变成了100.X.X.X的形式) 光猫的设置倒是没有任何异常,依旧处于桥接模式,但拨号路由器原本获取外网IP,却变成

qq_39815184的博客 5532

群晖NAS音乐库外网访问终极方案:用cpolar搞定内网穿透+手机端秒播(永久域名配置)

本文详细介绍了如何利用cpolar实现群晖NAS音乐库的外网访问,无需公网IP即可在手机端实现秒播。通过内网穿透技术,用户可随时随地享受无损音质音乐,支持播放列表同步和多设备进度共享。文章包含安装配置指南、手机端优化技巧及永久域名设置,是音乐爱好者的实用解决方案。

weixin_42524945的博客 447

手把手教你内网穿透(Windows环境)

内网穿透原理知识 一、传统NAT穿透 传统的NAT技术是通过将专用的网络地址(如企业内部网Internet)转换为公用地址(如互联网Internet),从而对外隐藏了内部管理的IP地址。这样,通过在内部使用非注册的IP地址,并将它们转换为一小部分外部注册的IP地址,从而减少了IP地址注册的费用以及节省了目前越来越缺乏的地址空间。同时,这也隐藏了内部网络结构,从而降低了内部网络受到攻击的风险。 二、UDP内网穿透 UDP 内网穿透的实质是利用路由器上的NAT 系统。NAT 是一种将私有(保留)地址转化

Yuan_Cci的博客 3万+

一分钟快速了解内网穿透软件有哪些

可以通过设置路由器虚拟服务器开放一些端口供外网访问,但由于运营商的原因,这些IP有时候并不是直接的IP,更多的时候这些IP都是动态的,简单说就是今天给你的IP是15.63.87.251,明天随时都有可能变为变得IP,并且是不能访问80个443端口的,那么有没有一种办法可以实现在没有公网IP的情况下,又不用设置路由器就可以让外网直接访问内网里的应用呢需求分析 需求分析 让家里可以使用XShell...

u010905359的博客 7076
上一篇: iOS 手机网络类型和运营商怎么获取
下一篇: iOS 如何获取手机型号、系统版本、电池电量
天行哥哥
博客等级 码龄10年 13粉丝 40原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值