用盡洪荒之力解決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  並輸入你的域名,便可驗證,綠色鉤表示經過,可正常訪問.
  
 
相關文章
相關標籤/搜索