IOS开发之判断iPhone连接的网络(WiFi,2G,3G,LTE,4G)是IPV4还是IPV6网络
可能问题太简单了,在网上没有找到答案,只好我自己写了。
由于苹果审核我们的应用在ipv6环境下,无法连接到服务器。所以把原来的用IP作为请求网址改成了域名来发请求。虽然审核过了,但是在国内还有域名解析的问题,使用域名有可能没有解析到ip地址,有可能解析的ip地址不正确(可能域名转发引起的,域名转发已经被国家禁止)。
所以我想如果手机当前连接的ipv4的网络,还用原来的ip请求。如果手机连接的是ipv6网络,则使用域名连接。
下面我对不同的设备分别使用ipv4(wifi,4G)和ipv6(wifi)网络进行测试:
IPV4 | IPV6 | |
IPAD(WIFI) |
en0/ipv4 = 192.168.2.90, lo0/ipv6 = fe80::1, awdl0/ipv6 = fe80::5cbf:1aff:fe4e:ef38, en0/ipv6 = fe80::ae:8811:f45b:198a, lo0/ipv4 = 127.0.0.1 |
en0/ipv4 = 169.254.229.160, lo0/ipv6 = fe80::1, awdl0/ipv6 = fe80::5cbf:1aff:fe4e:ef38, en0/ipv6 = 2001:2::aab1:6005:dcd1:6ffd:63e4, lo0/ipv4 = 127.0.0.1 |
IPHONE6(WIFI) |
en0/ipv4 = 192.168.8.110, lo0/ipv6 = fe80::1, awdl0/ipv6 = fe80::b84d:41ff:fe6e:2925, en0/ipv6 = fe80::435:13b1:816c:9db9, lo0/ipv4 = 127.0.0.1 |
en0/ipv4 = 169.254.87.24, lo0/ipv6 = fe80::1, awdl0/ipv6 = fe80::b84d:41ff:fe6e:2925, en0/ipv6 = 2001:2::aab1:b19e:527a:45d3:9f, lo0/ipv4 = 127.0.0.1 |
IPHONE6S(WIFI) |
en0/ipv4 = 192.168.2.94, lo0/ipv6 = fe80::1, awdl0/ipv6 = fe80::a0ff:ddff:fec0:a676, en0/ipv6 = fe80::444:d26c:1b78:8f89, lo0/ipv4 = 127.0.0.1, utun0/ipv6 = fe80::3213:2aa4:9fed:9339 |
|
IPHONE6PLUS (4G) |
lo0/ipv6 = fe80::1, pdp_ip0/ipv4 = 10.241.179.135, lo0/ipv4 = 127.0.0.1, utun0/ipv6 = fe80::e7dd:8eef:da5e:f8f7 |
|
IPHONE4(WIFI) |
lo0/ipv4 = 127.0.0.1, en0/ipv4 = 192.168.2.138, lo0/ipv6 = fe80::1, en0/ipv6 = fe80::1420:27e5:d334:e8de |
lo0/ipv4 = 127.0.0.1, en0/ipv4 = 169.254.120.241, lo0/ipv6 = fe80::1, en0/ipv6 = 2001:2::aab1:509d:9f42:38e0:a945 |
经过分析发现:
1.lo0/ipv6 = fe80::1,这个是固定的
2.lo0/ipv4 = 127.0.0.1 这个也是固定的
3.ipv6下 en0/ipv4 = 169.254.120.241,是固定的
4.ipv4下:awdl0/ipv6,en0/ipv6,utun0/ipv6对应的值都是fe80 开头
结论:在ipv6下,awdl0/ipv6,en0/ipv6,utun0/ipv6对应的值肯定有一个不是以fe80 开头
还有好多情况没有考虑eg:VPN
下面开始写代码来判断:
导入头文件和宏定义
#define IOS_CELLULAR @"pdp_ip0"
#define IOS_WIFI @"en0"
#define IOS_VPN @"utun0"
#define IP_ADDR_IPv4 @"ipv4"
#define IP_ADDR_IPv6 @"ipv6"
#import <ifaddrs.h>
#import <arpa/inet.h>
#import <net/if.h>
添加两个方法
+ (BOOL)isIpv6{NSArray *searchArray =@[ 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 BOOL isIpv6 = NO;[searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop){NSLog(@"---%@---%@---",key, addresses[key] );if ([key rangeOfString:@"ipv6"].length > 0 && ![[NSString stringWithFormat:@"%@",addresses[key]] hasPrefix:@"(null)"] ) {if ( ![addresses[key] hasPrefix:@"fe80"]) {isIpv6 = YES;}}} ];return isIpv6;
}+ (NSDictionary *)getIPAddresses
{NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];// retrieve the current interfaces - returns 0 on successstruct ifaddrs *interfaces;if(!getifaddrs(&interfaces)) {// Loop through linked list of interfacesstruct 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;NSLog(@"ipv4 %@",name);}} 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;NSLog(@"ipv6 %@",name);}}if(type) {NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];addresses[key] = [NSString stringWithUTF8String:addrBuf];}}}// Free memoryfreeifaddrs(interfaces);}return [addresses count] ? addresses : nil;
}
调用
- (void)viewDidLoad {[super viewDidLoad];//1:是ipv6//0:不是ipv6NSLog(@"###-###%d",[ViewController isIpv6]); ;if ([ViewController isIpv6] == YES) {UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"是ipv6" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];[alertView show];}else{UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"不是ipv6" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];[alertView show];}}
代码已上传
http://download.csdn.net/detail/qq_15509071/9743137
IOS开发之判断iPhone连接的网络(WiFi,2G,3G,LTE,4G)是IPV4还是IPV6网络相关推荐
- iOS开发:判断iPhone是否是刘海屏iPhoneX、iPhoneXR、iPhoneXs、iPhoneXs Max等
保证能判断,呕心沥血,不行切JIJI 方法一 Objective-C // iPhoneX.iPhoneXR.iPhoneXs.iPhoneXs Max等 // 判断刘海屏,返回YES表示是刘海屏 - ...
- Android.网络连接状态(联网,2g,3g,wifi等)
net与wap什么意思 WAP上网所谓WAP(Wireless Application Protocol)即无线应用协议,是一项全球性的网络通信协议.WAP使移动Internet 有了一个通行的标准, ...
- 查看网站使用ipv4还是ipv6网络连接
因为在学校,可以使用ipv6网络,而ipv4网络按流量收费,因此判断一个网站是否能使用ipv6访问成为了一个很重要的问题 方法 打开cmd,输入命令"nslookup 网站名",通 ...
- c语言蜂窝编程问题,【iOS开发】判断蜂窝网络类型及系统bug
判断蜂窝网络类型 最近项目需求要判断当前蜂窝网络类型,查了一些资料,进行一个总结. 首先导入框架 #import 主要使用currentRadioAccessTechnology属性进行判断 CTTe ...
- iOS开发 App内自动连接指定Wi-Fi
目前很多智能设备配置网络的时候都有app内部直连Wi-Fi的功能(iOS11之前需要用户跳到Wi-Fi设置界面去连),iOS11后苹果提供 NEHotspotConfigurationManager ...
- 【无限互联】iOS开发视频教程—1.iPhone开发概述——必看
核心内容: 1. iPhone开发概述 2.iOS体系的发展历史 3.授课方法 4.学习方法 5.如何锻炼解决问题的能力 视频地址:1.iPhone开发概述-必看
- IOS 开发中判断NSString是否为空字符
//当 请求网络 或者获取其他返回数据 首先 要做一次判断 数据是否为空 防止程序崩溃 程序崩溃 好比拿刀扎在程序员的心啊- if(为空) {做提示对话框等操作 } else {正常执行 } - (B ...
- 【iOS开发】判断iOS设备是否越狱
原文链接:点击打开链接 苹果是非常看重产品的安全性的,所以给用户设计了一套复杂的安全机制.这让喜爱自由,崇尚一切开放的程序员们极度不爽,于是越狱就成了苹果和黑客们反复斗法的场所.总体来说,越狱可以让我 ...
- iOS开发---如何查看iPhone手机的UUID
UUID是由字母和数字组成的40个字符串的序号,用来区别每一个唯一的iOS设备 一般来说iPhone手机可以安装通过Apple发布的软件,上的软件都是经过Apple核准过的,但在发布到 AppStor ...
最新文章
- 单片机编程简单吗?arduino为什么不适合大学生?
- gridview 中使用 if else_前端代码中如何优化if/else
- boot返回码规范 spring_springboot项目编码规范
- yum 简介及其常用命令
- [转载]建立团队沟通协作工作方式
- LeetCode | 我的LeetCode之旅(持续更新ing)
- 如何准备机器学习工程师面试
- SAP License:PO中“最终发票”的应用与理解
- 《人月神话》阅读体会(三)
- 第一次总结:整体框架
- Linux Web基础
- asp.net 设置敲回车触发按钮
- gsoap开发webservice
- Autodesk AutoCAD 2018 for mac
- Typec手机有线网卡网线转网口转接口快充方案
- margin 外边距合并问题
- Java用JFrame、JPanel、Graphics绘图案例讲解
- 递归与递归方程T(N)=aT(N/b)+O(N^d)
- Mysql数据库基本知识四:视图
- Yura and Developers