可能问题太简单了,在网上没有找到答案,只好我自己写了。

由于苹果审核我们的应用在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网络相关推荐

  1. iOS开发:判断iPhone是否是刘海屏iPhoneX、iPhoneXR、iPhoneXs、iPhoneXs Max等

    保证能判断,呕心沥血,不行切JIJI 方法一 Objective-C // iPhoneX.iPhoneXR.iPhoneXs.iPhoneXs Max等 // 判断刘海屏,返回YES表示是刘海屏 - ...

  2. Android.网络连接状态(联网,2g,3g,wifi等)

    net与wap什么意思 WAP上网所谓WAP(Wireless Application Protocol)即无线应用协议,是一项全球性的网络通信协议.WAP使移动Internet 有了一个通行的标准, ...

  3. 查看网站使用ipv4还是ipv6网络连接

    因为在学校,可以使用ipv6网络,而ipv4网络按流量收费,因此判断一个网站是否能使用ipv6访问成为了一个很重要的问题 方法 打开cmd,输入命令"nslookup 网站名",通 ...

  4. c语言蜂窝编程问题,【iOS开发】判断蜂窝网络类型及系统bug

    判断蜂窝网络类型 最近项目需求要判断当前蜂窝网络类型,查了一些资料,进行一个总结. 首先导入框架 #import 主要使用currentRadioAccessTechnology属性进行判断 CTTe ...

  5. iOS开发 App内自动连接指定Wi-Fi

    目前很多智能设备配置网络的时候都有app内部直连Wi-Fi的功能(iOS11之前需要用户跳到Wi-Fi设置界面去连),iOS11后苹果提供 NEHotspotConfigurationManager ...

  6. 【无限互联】iOS开发视频教程—1.iPhone开发概述——必看

    核心内容: 1. iPhone开发概述 2.iOS体系的发展历史 3.授课方法 4.学习方法 5.如何锻炼解决问题的能力 视频地址:1.iPhone开发概述-必看

  7. IOS 开发中判断NSString是否为空字符

    //当 请求网络 或者获取其他返回数据 首先 要做一次判断 数据是否为空 防止程序崩溃 程序崩溃 好比拿刀扎在程序员的心啊- if(为空) {做提示对话框等操作 } else {正常执行 } - (B ...

  8. 【iOS开发】判断iOS设备是否越狱

    原文链接:点击打开链接 苹果是非常看重产品的安全性的,所以给用户设计了一套复杂的安全机制.这让喜爱自由,崇尚一切开放的程序员们极度不爽,于是越狱就成了苹果和黑客们反复斗法的场所.总体来说,越狱可以让我 ...

  9. iOS开发---如何查看iPhone手机的UUID

    UUID是由字母和数字组成的40个字符串的序号,用来区别每一个唯一的iOS设备 一般来说iPhone手机可以安装通过Apple发布的软件,上的软件都是经过Apple核准过的,但在发布到 AppStor ...

最新文章

  1. 单片机编程简单吗?arduino为什么不适合大学生?
  2. gridview 中使用 if else_前端代码中如何优化if/else
  3. boot返回码规范 spring_springboot项目编码规范
  4. yum 简介及其常用命令
  5. [转载]建立团队沟通协作工作方式
  6. LeetCode | 我的LeetCode之旅(持续更新ing)
  7. 如何准备机器学习工程师面试
  8. SAP License:PO中“最终发票”的应用与理解
  9. 《人月神话》阅读体会(三)
  10. 第一次总结:整体框架
  11. Linux Web基础
  12. asp.net 设置敲回车触发按钮
  13. gsoap开发webservice
  14. Autodesk AutoCAD 2018 for mac
  15. Typec手机有线网卡网线转网口转接口快充方案
  16. margin 外边距合并问题
  17. Java用JFrame、JPanel、Graphics绘图案例讲解
  18. 递归与递归方程T(N)=aT(N/b)+O(N^d)
  19. Mysql数据库基本知识四:视图
  20. Yura and Developers

热门文章

  1. 使用HTTP免费代理IP
  2. 微信小程序商店 | 即速商店_福利类小程序
  3. 专线网络故障排查本地网络故障排查
  4. 分享4个不为人知的高质量APP,每一个都实力爆棚!
  5. 网站关键词的选择和优化设置技巧
  6. pandas库--DataFrame常用操作
  7. 仿蘑菇街,蜜芽宝贝,京东商品详情界面,与NestedScroll滑动
  8. MutationObserver api
  9. 对生命常怀敬畏之心,我眼中的胡爱玲医生
  10. python连接hive步骤(不出错版)