适配IPv6遇到的坑,终极解决方案

2023-11-10

6.1AppStore发布之后的应用要兼容IPv6。

然而我上个星期发布的版本并没有因为没兼容而被拒,这次提交却遇到IPv6兼容问。。。

 话不多说,上代码:

 +(NSString *) getIPWithHostName:(const NSString *)hostName
    {
    struct addrinfo * result;
     struct addrinfo * res;
    char ipv4[128];
    char ipv6[128];
    int error;
    BOOL IS_IPV6 = FALSE;
    bzero(&ipv4, sizeof(ipv4));
    bzero(&ipv4, sizeof(ipv6));

    error = getaddrinfo([hostName UTF8String], NULL, NULL, &result);
    if(error != 0) {
    NSLog(@"error in getaddrinfo:%d", error);
    return nil;
    }
     for(res = result; res!=NULL; res = res->ai_next) {
    char hostname[1025] = "";
    error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, 1025, NULL, 0, 0);
    if(error != 0) {
        NSLog(@"error in getnameifno: %s", gai_strerror(error));
        continue;
    }
    else {
        switch (res->ai_addr->sa_family) {
            case AF_INET:
                memcpy(ipv4, hostname, 128);
                break;
            case AF_INET6:
                memcpy(ipv6, hostname, 128);
                IS_IPV6 = TRUE;
            default:
                break;
        }
        NSLog(@"hostname: %s ", hostname);
    }
    }
    freeaddrinfo(result);
    if(IS_IPV6 == TRUE) return [NSString stringWithUTF8String:ipv6];
    return [NSString stringWithUTF8String:ipv4];
    }

这段代码即判断了是否IPv6环境并解析域名获得了IP地址。

测试

首先得配置IPv6网络环境,至于如何配置,自行百度"如何搭建IPv6的测试环境"


然而配置成功后,用手机连接的WiFi DNS也是正确的,运行程序测试怎么不成功呢,找了好多资料,猜测是DNS解析出了问题。


那就换另一种方法配置IPv6:拔掉网线,用mac连接WiFi(没有WiFi可以用手机流量分享热点),然后在共享中用前一种方法配置IPv6(不知道具体是共享到电脑那个端口,索性全点上)记得选中"创建NAT64 网络"。这时直接通过模拟器测试succeed! 

测试成功了。你以为就没问题了?这里提交依然可能被拒,手机和 Mac 之间是 IPv6 没错,但 Mac 和你的服务器之间还是 IPv4 连接。


如果这项测试通过,可以说明:你的客户端应用在 IPv6 网络下,是(基本)没有问题的,但是无法验证你的服务器能够对 IPv6 网络做出正确的响应。然而,苹果审核的时候,却是要去 DNS 服务器询问你的服务器的 IPv6 地址,然后进行访问。如果查询不到 IPv6 地址,可能会进而询问 IPv4 地址,然后进行转换使用。苹果明确表示服务器不需要支持 IPv6,但是有一点苹果没有指出来,那就是,虽然你的服务器不用支持 IPv6,但是必须正确响应 IPv6 的 DNS 查询。
 

如何验证呢??使用以下命令即可:

$ dig +nocmd +nostats example.com AAAA

如果返回的 status 为 NOERROR, 那基本就没什么问题,但是一定要在多个网络环境下测试都通过才行。如果返回的是其他的响应,尤其是 SERVFAIL 的情况,那就基本杯具了。由于你已经验证了客户端没有问题,现在要做的,就是催着你的运维、后台啥的,赶紧去改 DNS 配置,直到稳定返回 NOERROR 为止。


 


*****************2017/06/01更新 ************************

今天新换了域名,发现解析有问题了 更新一下代码

+ (NSString *)getIPWithHostName:(NSString *)hostName {
    const char * c_ip = [hostName UTF8String];
    char * ipchar = calloc(hostName.length, sizeof(char));
    strcpy(ipchar, c_ip);
    
    struct addrinfo hints, *res, *res0;
    int error, s;
    const char * newChar = "No";
    
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_DEFAULT;
    
    error = getaddrinfo(ipchar, "http", &hints, &res0);
    free(ipchar);
    
    if (error) {
        errx(1, "%s", gai_strerror(error));
        /*NOTREACHED*/
    }
    s = -1;
    
    static struct sockaddr_in6 * addr6;
    static struct sockaddr_in * addr;
    //    NSString * NewStr = NULL;
    char ipbuf[32];
    
    NSString * TempA = NULL;
    
    for (res = res0; res; res = res->ai_next) {
        
        if (res->ai_family == AF_INET6) {
            addr6 =( struct sockaddr_in6*)res->ai_addr;
            newChar = inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, sizeof(ipbuf));
            TempA = [[NSString alloc] initWithCString:(const char*)newChar
                                             encoding:NSASCIIStringEncoding];
            
            //            address = TempA;
            
            //            NSString * TempB = [NSString stringWithUTF8String:"&&ipv6"];
            //
            //            NewStr = [TempA stringByAppendingString: TempB];
            printf("%s\n", newChar);
            
        } else {
            addr =( struct sockaddr_in*)res->ai_addr;
            newChar = inet_ntop(AF_INET, &addr->sin_addr, ipbuf, sizeof(ipbuf));
            TempA = [[NSString alloc] initWithCString:(const char*)newChar
                                             encoding:NSASCIIStringEncoding];
            //            NSString * TempB = [NSString stringWithUTF8String:"&&ipv4"];
            //
            //            NewStr = [TempA stringByAppendingString: TempB];
            printf("%s\n", newChar);
        }
        
        break;
    }
    
    freeaddrinfo(res0);
    
    return TempA;
}

 



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适配IPv6遇到的坑,终极解决方案 的相关文章

  • iOS代码混淆初探

    iOS代码混淆初探 在没有对应用的代码做过特殊处理的情况下 一般应用的代码中的类名和方法都是明文的 在逆向分析中 通过class dump获取MachO可执行文件中的所有类 定义的方法和属性 就能很快的从名字入手猜到这个方法是做什么用的 所
  • Internet Explorer-10 websocket 中的 IPv6 地址给出语法错误

    我从服务器获取 ipv6 地址 然后我为 websocket 创建 url 我的网址看起来 喜欢 ws xxxx xxxx xxxx xxxx xxxx xxxx 十进制端口 其中 x 十六进制的 0 f 这个网址在 chrome 和 fi
  • Docker 身份验证:无法获取匿名令牌

    我的 gitlab 运行程序中出现以下错误 错误 授权失败 无法获取匿名令牌 获取 https auth ipv6 docker com token scope repository 3Alibrary 2Fnode 3Apull serv
  • 更改 WiFi-Direct IP 范围?在 Android WiFi-Direct 中强制使用 IPv6?

    我有两部 Android KitKat 手机 两者都作为组所有者运行 WiFi Direct 组 我们称它们为 GO1 和 GO2 我设法将 GO1 作为旧客户端连接到 GO2 而没有破坏任何 之前设置的 wifi direct 组 问题在
  • 让docker使用IPv4进行端口绑定

    我有 docker 主机 里面有一个容器 docker 主机仅在 IPv6 接口上绑定端口 而不在 IPv4 上绑定端口 这是输出 tcp 0 0 0 0 0 0 22 0 0 0 0 LISTEN tcp 0 0 0 0 0 0 5508
  • hadoop和spark现在支持IPv6吗?

    我想在纯IPv6环境上构建Hadoop和Spark集群 我已经通过 IPv4 构建了它 如何配置在 IPv6 环境下运行它们 hadoop 和 Spark 现在支持 IPv6 吗 它不是 截至今日HADOOP 11890跟踪 IPv6 支持
  • 使用 C# 检查 Windows 7 上是否启用了 IPv6

    我正在尝试使用 C 编写一个程序作为我公司的多功能工具 我们希望在此工具中完成的一件事是确定 IPv6 是否已启用 绑定到我们的 Windows 7 计算机上的局域网连接网络适配器 我并不是在寻找它的地址 只是想知道它是否在该适配器上启用或
  • IPv4 和 IPv6 禁止

    如果我想在我的网站上通过 IP 禁止用户 是否可以通过两者来实现IPv4 and IPv6 某些浏览器显然默认使用 IPv4 地址 而其他浏览器 如果有可能 则使用 IPv6 地址 因此 如果我通过某人当前的 IP 对其进行禁止 他们只需使
  • 如何使用 .fetch 函数使 API 调用在 React-Native 中兼容 IPV6?

    我开发了一个用 React Native 编写的应用程序 适用于 IOS 它在 IPV4 网络中运行良好 然而 最近苹果公司发来一条消息 称我的应用程序在 IPV6 网络中测试时无法运行 他们告诉我 我还必须使其与仅限 IPV6 的网络兼容
  • ipv6 向后兼容 ipv4 吗?

    我有一个使用 ipv4 编写的小 udp 示例程序 如果我将代码更改为 ipv6 我仍然能够与使用具有 ipv4 地址的侦听器的任何人进行通信吗 我正在查看移植示例 http ou800doc caldera com en SDK neta
  • 添加 IPV6_V6ONLY 标志的动机是什么?

    在 IPv6 网络中 IPV6 V6ONLY 标志用于确保套接字仅使用 IPv6 特别是 IPv4 到 IPv6 的映射不会用于该套接字 在许多操作系统上 默认情况下未设置 IPV6 V6ONLY 但在某些操作系统 例如 Windows 7
  • 如何在SQL中计算IPv6 CIDR路由前缀?

    我一直致力于使用在 SQL Server 2012 实例上运行的 T SQL 从 IPv4 和 IPv6 地址范围生成 CIDR 一般来说 我们的应用程序 数据库外部 负责计算 CIDR 但我目前需要在数据库中进行 CIDR 计算 由于 I
  • 使用 PHP 检查 IPv4/IPv6 地址是否已启动

    我有一个 IPv4 地址 前任 172 19 20 21 我曾经这样做过 fs fsockopen ip port errno errstr 3 if fs error SSC is down return Redirect to gt w
  • 从 MAC 转换为 IPv6

    我想了解如何将 MAC 地址转换为 IPv6 地址 例如 00 01 04 76 2A 5C 应该成为 FE80 0201 04FF FE76 2A5C 有人可以详细说明一下转换吗 我们假设本地机器的自动配置没有随机参数 逐步转换 http
  • 匹配有效 IPv6 地址的正则表达式

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我在编写匹配有效 IPv6 地址的正则表达式时遇到问题 包括压缩形式的地址 使用 或从每
  • 使用 IPv6 进行地理定位?

    我正在开发一个 IP 地理定位库 它使用 IPv4 地址的前三个八位字节来确定用户的国家 地区 城市 纬度 经度等 效果非常好 但它不处理 IPv6 地址 我希望它能够处理 有没有办法转换 IPv6 地址以获得 IPv4 地址的前三个八位字
  • 用于将长 IPv6 地址转换为其压缩形式的 Java 库 [重复]

    这个问题在这里已经有答案了 我想知道是否有一个库可以用来将长 IPv6 地址 例如 2002 9876 57AB 0000 0000 0000 0000 0001 的表示形式转换为压缩的 IPv6 形式 以本例 2002 9876 57AB
  • 用于验证 InetSocketAddresses 的正则表达式(ipv4/v6 + 端口地址)

    我在寻找testedipv4 和 ipv6 的正则表达式InetSocket地址 http download oracle com javase 6 docs api java net InetSocketAddress html toSt
  • IPv6中的/64是什么意思[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有ipv 6的vps 例如 2605 6f00 XXX XXXX XXXX 64 我不明白 64的含义 这是否意味着我的 vps 有多个 ipv6
  • 链路范围 IPv6 多播数据包突然无法在 MacBook Pro 上路由?

    这是一个有点晦涩的问题 但我很困惑 我想也许有人对这个问题有更多的线索 我的同事已经在他的 MacBook Pro 上成功运行了一个使用 IPv6 多播的内部应用程序几个月了 但今天 Mac 决定停止路由多播数据包 特别是 该程序打印此错误

随机推荐

  • Nvidia TX2 刷机教程 JetPack-L4T-3.0-linux-x64.run

    前言 本教程特别针对刷机被墙的朋友 如果没有被墙 其实按照官方文档一步一步操作就行 这期间我参考了特别多的网页 也去nvidia官方论坛问过 其实截止到2019年2月16日 jetpack3 3 是可以很轻松的被装上的 主要是3 0被墙 而
  • 1. Python的特性和语法

    千里之行始于足下 大家好 我是茶桁 这里是我们 AI秘籍 的第一节 让我们先从Python来开始好好的打好基础 第一堂课 我们先从最基础的Python特性开始 当然 还有一些基本语法 上来就开始讲特性和语法 说明我们将会遗弃惯用的 环境搭建
  • java 获取linux mac_java工具类,在Windows,Linux系统获取电脑的MAC地址、本地IP、电脑名...

    packagecom cloudssaas util importjava io BufferedReader importjava io IOException importjava io InputStreamReader import
  • abc计算机机房建设标准,ABC级数据中心机房建设要求

    ABC级数据中心机房建设要求 由会员分享 可在线阅读 更多相关 ABC级数据中心机房建设要求 7页珍藏版 请在人人文库网上搜索 1 ABC级数据中心机房建设要求一 根据数据中心机房最新设计规范GB50174 2008电子信息系统机房设计规范
  • 图像处理之高斯混合模型

    一 高斯混合模型 现有的图像中目标的分类常用深度学习模型处理 但是深度学习需要大量模型处理 对于明显提取的目标 常常有几个明显特征 利用这几个明显特征使用少量图片便可以完成图像目标分类工作 这里介绍使用高斯混合模型GMM处理图像 二 步骤
  • Python数据分析学习路径图 #CSDN博文精选# #IT技术# #学习路线# #系统化学习# #python#

    大家好 我是小C 又见面啦 文章过滤器 精选大咖干货 助力学习之路 5天20篇CSDN精选博文带你掌握系统化学习方法 专栏将挑选有关 系统化学习方法 的20篇优质文章 帮助大家掌握更加科学的学习方法 在这里 你将收获 快速掌握系统化学习的理
  • springboot框架在页面和postman访问可以debug进入方法,但是接收方接收到是404的问题

    重要性 在使用注解开发的过程中 如果遇到接口能够debug进去 但是接收方接到的是404 导致这种结果的原因是 restController 和 Conroller 这两个注解的导致的 RestController注解相当于 Respons
  • python 第三方库之openpyxl

    一次偶然的机会知道这个第三方库 然后看官方文档 在此记录下我的学习笔记 1 openpyxl openpyxl 是一个第三方库 可以读写excel 文件 2 安装 pip3 install openpyxl 3 如果你的excel文件中包含
  • 命令行程序选项解析函数—getopt

    转载请注明出处 http blog csdn net zhangyang0402 archive 2010 06 14 5671410 aspx 命令行工具下的参数选项有两种 长选项和短选项 短选项以 开头 后面跟单个字母 长选项以 开头
  • LeetCode 160. 相交链表

    题目链接 https leetcode cn problems intersection of two linked lists 思路如下 如果把这两个链表拼接在一起 那么拼接后的两个总链表长度相同 初始 让 pA 指向 headA pB
  • python 离群值_python:删除离群值操作(每一行为一类数据)

    删除有多行字符串的json文件中的离群值 def processhold eachsubject directory newfile filename cmudatacol hold subject 0 json format eachsu
  • 在Unity 5中如何控制检视面板上的属性是否显示?

    当脚本中有大量属性或字段需要在检视面板中调整时 检视面板会变得杂乱无章 有没有什么办法可以自己来管理这些属性是否显示呢 本文就为大家介绍无需自定义检视面板来管理属性显示的方法 首先介绍HeaderAttributes的用法 让大家对控制检视
  • CUDA编译过程

    流程 将test cu代码进行分离 利用cudafe exe 去分离CPU代码和GPU代码 我们可以在生成的中间文件可以看到test cudafe1 cpp和test cudafe1 gpu cicc exe 将根据编译选项 arch co
  • Flutter自定义折线图并添加点击事件

    本篇文章已授权微信公众号 guolin blog 郭霖 独家发布 前言 最近用Flutter做了一个天气类的app 我也是新手 对flutter理解还不是很深入 但是开发过程中的编程思想给了我很大的启发 Dart语言特性很优秀 单线程模型
  • 真正帮你实现—MapReduce统计WordCount词频,并将统计结果按出现次数降序排列

    项目整体介绍 对类似WordCount案例的词频统计 并将统计结果按出现次数降序排列 网上有很多帖子 均用的相似方案 重写某某方法然后 运行起来可能会报这样那样的错误 这里实现了一种解决方案 分享出来供大家参考 编写两个MapReduce程
  • SyncTools--->备份数据工具类

    只提供了一个接口 Sync
  • CSS中 z-index 的用法

    语法 z index auto 数值 inherit 参数 数值 数值即是盒子在当前的堆叠环境中的堆叠层次 这个盒子也会建立一个新的堆叠环境 auto 生成的盒子的堆叠层次在当前堆叠环境中是0 除非它是根元素 否则它不会建立一个新的堆叠环境
  • php开启xdebug扩展,PHP添加Xdebug扩展的方法

    PHP添加Xdebug扩展的方法 发布于 2014 11 28 12 15 54 143 次阅读 评论 0 来源 网友投递 Xdebug开源PHP程序调试器Xdebug是一个开放源代码的PHP程序调试器 即一个Debug工具 可以用来跟踪
  • RecycleView使用GridLayoutManager 中item显示不居中问题

    项目效果图就不截了 徒手画一个 将就一下 1 问题分析 图中 处是item距离手机边界的距离 我想刚开始使用GridLayoutManager的时候大部分人都会遇到这种距离不相等问题 在不理解原因的情况下 根布局咔咔一顿改也许你慢慢地就能找
  • 适配IPv6遇到的坑,终极解决方案

    6 1AppStore发布之后的应用要兼容IPv6 然而我上个星期发布的版本并没有因为没兼容而被拒 这次提交却遇到IPv6兼容问题 话不多说 上代码 NSString getIPWithHostName const NSString hos