iOS 解决ipv6问题
解决ipv6的方法有很多种,由于现在国内的网络运营商还在使用ipv4的网络环境,所以appstore应用不可能大范围去修改自己的服务器,
而且国内的云服务器几乎没有ipv6地址。
这里附上苹果开发平台提供的解决方案地址:url
苹果审核ipv6的标准是应用在ipv6的网络环境下和最新的ios系统下,应用也能正常连接。 但是ipv6的客户端是不能直接连接ipv4的服务端,
需要通过DNS64或者NAT64的转换地址才能连接,下图是连接的处理过程,

DNS64/NAT64是苹果提供的转换通道,不需要开发者去考虑这个问题,所以苹果应用审核只要求开发者不要在底层写死ipv4的通讯api,要兼容ipv6的
网络环境即可。
以下是我通过getaddrinfo的api将ipv4转换成ipv6的的过程,并且判断当前环境网络环境去开启相应的ip网络协议的实现:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <err.h> #define CopyString(temp) (temp != NULL)? strdup(temp):NULL
const char* getIPV6(const char * mHost) {
if(mHost == NULL)
return NULL;
struct addrinfo* res0;
struct addrinfo hints;
struct addrinfo* res; memset(&hints, , sizeof(hints)); hints.ai_flags = AI_DEFAULT;
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM; int n;
if((n = getaddrinfo(mHost, "http", &hints, &res0)) != )
{
printf("getaddrinfo failed %d", n);
return NULL;
} struct sockaddr_in6* addr6;
struct sockaddr_in * addr;
const char* pszTemp; for(res = res0; res; res = res->ai_next)
{
char buf[];
if(res->ai_family == AF_INET6)
{
addr6 = (struct sockaddr_in6*)res->ai_addr;
pszTemp = inet_ntop(AF_INET6, &addr6->sin6_addr, buf, sizeof(buf));
}
else
{
addr = (struct sockaddr_in*)res->ai_addr;
pszTemp = inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf));
} break;
} freeaddrinfo(res0);
printf("getaddrinfo ok %s\n", pszTemp);
return CopyString(pszTemp);
} #endif
在ios 9.2版本系统后,通过getaddrinfo转换ipv4得到ipv6地址(这里我也被坑过了低版本的系统转换不了ipv6,想测试只能升级系统),获得ipv6地址后,可以判断
地址字符串是否用“:” 来确定使用哪一种socket的通讯方式,判断方法:std::strdchr(const char* value, const char* subStr),如果是NULL,则使用ipv4 socket连接
if(strchr(addr, ':') != NULL)
ivp6处理
else
ivp4处理
这样一来就不会写死通讯协议。
我这里还遇到一个坑,内网的访问下是不可能连接到自己的服务器,后面测试一下公网阿里云的服务器,能够正常连接,这个可能是DNS64在搜索ipv6的过程中,并
没有搜索内网的网络,导致内网连接失败(这里卡了半天, 切记)
转载请注明出处,from 博客园HemJohn
iOS 解决ipv6问题的更多相关文章
- 【转】iOS 解决ipv6问题
解决ipv6的方法有很多种,由于现在国内的网络运营商还在使用ipv4的网络环境,所以appstore应用不可能大范围去修改自己的服务器, 而且国内的云服务器几乎没有ipv6地址. 这里附上苹果开发平台 ...
- 快速零配置迁移 API 适配 iOS 对 IPv6 以及 HTTPS 的要求
本文快速分享一下快速零配置迁移 API 适配 iOS 对 IPv6 以及 HTTPS 的要求的方法,供大家参考. 原文发表于我的技术博客 零配置方案 最新的苹果审核政策对 API 的 IPv6 以及 ...
- iOS 解决LaunchScreen中图片加载黑屏问题
iOS 解决LaunchScreen中图片加载黑屏问题 原文: http://blog.csdn.net/chengkaizone/article/details/50478045 iOS 解决Lau ...
- iOS解决json串中的NSNull类型
iOS解决json串中的NSNull类型 后端返回的数据中总会出现一些NSNull类型,当我们一处理程序就会崩溃,因此想到把返回的数据中的NSNull类型全部转换成@""空字符 ...
- iOS 支持 IPv6
苹果的规定:2016年6月1日提交到App Store必须支持IPv6-only网络. 官方文档:https://developer.apple.com/library/mac/documentati ...
- ios 解决有关火星坐标的问题
CLLocationManager 定位获取CLLocation 是地球坐标,而MKMapView 获取的是天朝火星坐标,这就导致了使用定位的时候,显示用户的蓝点和当前定位信息偏差(因为蓝点是调用了M ...
- iOS 解决键盘挡住输入框的问题
iOS开发中经常会用到输入框UITextField,所以也常会遇到键盘挡住输入框而看不到输入框的内容. 在这里记录一种方法,用UITextField的代理来实现View的上移来解决这个问题. 首先设置 ...
- iOS解决cell重用问题
在写sina 微博界面的过程中使用到了cell,那么就是在cell上添加一些控件,但是由于每条微博的内容都是不同的,所以在显示的过程中,出现了内容重叠的问题,其实就是UITableViewCell重用 ...
- iOS | 解决中文乱码
在iOS开发中,多多少少的朋友在开发的过程中,测试数据的时候可能会碰到后台打印的时候不能正确的打印出正常的汉字,打印出一些影响判断的字符,经常需要查看数组中得元素是否是自己想要的,但是苹果并没有对直接 ...
随机推荐
- poj1273 Drainage Ditches (最大流模板)
http://poj.org/problem?id=1273 Dinic算法 这是一道最大流的经典题 最大流尽量应该用边表,优于邻接矩阵(所以我写了邻接矩阵版的之后又写了个边表) 用了新学的Dinic ...
- 剑指Offer的学习笔记(C#篇)-- 跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 一 . 解题思路. 由题目可知,青蛙一次可以跳一阶或者两阶.假设台阶为 ...
- NFS服务及DHCPD服务
NFS 服务 Linux与Linux之间的文件共享 就是网络文件系统,依靠网络. 所有端口都存放在此,对应的服务跟端口 cat /etc/service 部署NFS 先部署服务器端: 部署之前要先启用 ...
- 解决windows下nginx中文文件名乱码
我的根目录文件夹放在d盘work文件夹下,一般这样配置 nginx\conf\nginx.conf location / { root D:/work; index index_bak.html; a ...
- 在jquery中使用AJAX
在jquery中使用封装好的AJAX会对开发效率起到极大的便利,因此掌握jquery中的一系列AJAX封装函数是做好页面数据交互的必备技能: 1.在之前,我们首先需要详细了解AJAX异步请求接受的五中 ...
- HDU-1281-棋盘游戏(最大匹配,枚举)
链接:https://vjudge.net/problem/HDU-1281 题目: 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互 ...
- Codeforces Round #529 -C- Powers Of Two(二进制拆分)
A positive integer xx is called a power of two if it can be represented as x=2yx=2y, where yy is a n ...
- 命令行下载工具 wget
wget 是一个简单而强大的跨平台命令行下载工具,包括 Windows 也有对应的版本.全称 GNU Wget,属于 GNU 计划的一部分,自由软件.支持 HTTP.HTTPS 和 FTP 协议,可在 ...
- SLF4J user manual 专题
System Out and Err Redirected to SLF4J The sysout-over-slf4j module allows a user to redirect all ca ...
- 【转】ibatis 中使用select top #pagesize# * from tablename
ibatis中使用select top #num# * from tableName出现错误.由于初次用ibatis还不知道在它里边拼写SQL语句的一些规则,导致一些自认为很平常的SQL语句,在它这里 ...