• 用尽洪荒之力解决Apple Store ipv6审核通关---linux服务器支持ipv6


         强势的库克时代到来,苹果开启了强制IPV6审核,大家也知道中国现在的情况,除了教育网实验性的支持IPV6,ISP运营商还不支持,想必大家都陆陆续续的遭受到了苹果无情的拒绝,以前开个加急,审核时间也就一天,快的话2小时就可以过,而现在一次又一次的拒绝,让国内开发者苦不堪言.不过聪明的中国人,不会被这样的问题打倒的,中国有句古话叫道高一尺,魔高一丈.公司的两个APP在经过两轮苹果残忍拒绝后,在7月底还是审核通过了.在此跟大家分享一下审核通关的经验.最近看大家都在聊ipv6审核,有的运气好,没做任何改动就通过了,有的拒绝了10几次还是通不过.我想说,我们不靠运气,需要靠实力.
     
         2016年6月1日起所有应用必须支持IPv6-Only网络,一方面App程序开发需要注意支持IPV6,另一方面为了让苹果快速审核,服务器需要支持IPV6的访问.
         我们先来看下苹果官方对于IPV6的要求及如何测试(苹果官方说明:开发注意事项和如何测试IPV6 Only的支持)
         这里就不普及IPV6基础知识,我们主要看看程序开发需要支持的地方和送审时服务器的配置.
     
    一.第一步:确保你的应用程序中没有违反以下基本原则
     
    1.禁止在协议中使用IP地址。许多通信协议,如会话发起协议(SIP),文件传输协议(FTP)的WebSockets和对等网络协议(P2PP),包括在协议报文的IP地址文字。例如,该FTP参数的命令DATA PORT,并PASSIVE包括IP地址文字交换信息。类似地,IP地址文字可能出现在SIP报头字段,例如的值To,From,Contact,Record-Route,和Via.
     
    2.禁止在配置文件中的使用IP地址,而是使用域名。配置文件通常包含IP地址的文字.
     
    3.不建议使用IP进行网络预检。许多应用程序试图主动检查Internet连接,或者通过IP地址常量来网络可达性的API活跃的Wi-Fi连接。
    如果由于业务需要,使用了Reachability进行网络的状态判断,不用担心,勿须作任何修改,Reachability在IOS9上是支持ipv4和ipv6的.但在IOS8以下不支持ipv6,但这仍满足苹果对于最新系统上支持ipv6的政策要求.
     
    4.不要使用低级别的网络API。有些应用与插座等原始的网络API,如直接合作gethostbyname,gethostbyname2和inet_aton。这些API都容易滥用或他们只支持IPv4,例如,主机名解析为AF_INET地址族,而不是AF_UNSPEC地址族.
     
    5.用小地址族的储存容器。有些应用程序和网络库使用的地址存储容器,如uint32_t,in_addr和sockaddr_in-即都是32位或更小。请参阅使用大小合适的贮存容器.
     
    6.检查源代码对于IPv6 DNS64 / NAT64不兼容性,发现以下的方法,请删除,检查并消除特定的IPv4的API,如:
    inet_addr()
    inet_aton()
    inet_lnaof()
    inet_makeaddr()
    inet_netof()
    inet_network()
    inet_ntoa()
    inet_ntoa_r()
    bindresvport()
    getipv4sourcefilter()
    setipv4sourcefilter()
    getaddrinfo()
    getnameinfo()
     
    7. 应用里面的API请求,一般都会使用AFNetworking进行请求发送,鉴于历史因素,应用的代码基本上都引用了AFHTTPRequestOperation类,所以目前API网络请求均需要通过NSURLConnection发送出去,所以必须确认NSURLConnection是否支持IPV6. 经过测试,NSURLConnection在最新的iOS9系统上是支持IPV6的,IOS9.3在NAT64环境下会将ipv4合成ipv6,因此能够正常访问.
     
    8.本机IP获取支持IPV6,在模拟器和真机上都会出现以FE80开头的IPV6单播地址影响我们判断,所以在这里进行特殊的处理,当第一次遇到不是单播地址的IP地址即为本机IP地址
     
     (NSString *)deviceIPAdress
    {
            while (temp_addr != NULL) {
                NSLog(@"ifa_name===%@",[NSString stringWithUTF8String:temp_addr->ifa_name]);
                // Check if interface is en0 which is the wifi connection on the iPhone
                if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"] || [[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"pdp_ip0"])
                {
                    //IPV4地址,直接转化
                    if (temp_addr->ifa_addr->sa_family == AF_INET){
                        // Get NSString from C String
                       address = [self formatIPV4Address:((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr];
                    }
     
                    //IPV6地址
                    else if (temp_addr->ifa_addr->sa_family == AF_INET6){
                        address = [self formatIPV6Address:((struct sockaddr_in6 *)temp_addr->ifa_addr)->sin6_addr];
                        if (address && ![address isEqualToString:@""] && ![address.uppercaseString hasPrefix:@"FE80"]) break;
                    }
                }
     
                temp_addr = temp_addr->ifa_next;
            }
        }
    }
     
    二.网络和服务器同时支持ipv6
         
    网络部分需要服务器支持IPV6访问,但国内除了教育网外,运营商暂时还不支持,要想让苹果审核团队顺利的访问国内的服务器,就需要一台支持IPV6的服务器进行中转,具体的原理也很简单,找一台国外支持ipv6的服务器作为流量中转即可.
     
    让域名支持ipv6,将AAAA记录解析到支持ipv6的服务器上.有以下几种方式获得支持ipv6的服务器
     
    - 购买国外支持ipv6的vps,比如搬瓦工,Linode,host1plus
    - 通过he.net为Linux添加ipv6支持.
    参考链接 :
     
    通过上面的方式比较麻烦些,需要购买国外服务器,如果你想快速的搭建服务器并支持ipv6,可以使用我的服务器作为中转,将域名AAAA记录解析到 2607:8700:102:d63b::  这个ipv6的地址上,然后邮件" dekinsq@gmail.com " 将转发地址+端口发给我,如果是SSL地址,请将证书文件(*.key,*.pem)一并发给我,我将提供转发服务,只会将来自ipv6的流量(苹果审核流量)转发到真实的服务器,并不会影响国内用户的访问.
     
    注:收到订单后1小时内处理完成,可加微信"sh110876925"进行沟通.添加微信时请注明审核通关.
     
     
    示意图如下:
     
    查看服务器ipv6和ipv4地址:
     
    以下是阿里云域名解析示例:
      
    以下为nginx转发示例:
    测试域名是否能解析并正常访问,打开 http://ipv6-test.com/validate.php  并输入你的域名,即可验证,绿色钩表示通过,可正常访问.
      
     
     
     
         
         
         
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    USACO 之 Section 2.2 (已解决)
    USACO 之 Section 2.1 (已解决)
    《C++ Primer》学习 之 函数指针相关用法
    《C++ Primer》学习 之 const_cast使用
    《C++ Primer》学习 之 返回数组的引用(返回数组的指针,方法与之相同)
    USACO 之 Section 1.5 (已解决)
    USACO 之 Section 1.4 More Search Techniques (已解决)
    [NN] 对于BackPropagation(BP, 误差反向传播)的一些理解
    [CLPR] 定位算法探幽
    [LeetCode系列] 双单链表共同节点搜索问题
  • 原文地址:https://www.cnblogs.com/dekins/p/5771488.html
Copyright © 2020-2023  润新知