蘋果應(yīng)用商店拒絕不支援 IPv6 的應(yīng)用的解決方法

新聞鏈接:
http://www.internetsociety.org/deploy360/blog/2015/06/apple-will-require-ipv6-support-for-all-ios-9-apps/

cocoachina上的討論鏈接:
http://www.cocoachina.com/bbs/read.php?tid=458416

原文如下:
蘋果應(yīng)用商店拒絕不支援 IPv6 的應(yīng)用的解決方法

written by: imays
translated by: coolspeed (weibo.com/coolspeed)

大家新年快樂!

話說這蘋果是從新年第一天起就開始了恐怖活動啊……雖然是去年已經(jīng)預(yù)告了的恐怖活動……—那就是“你們的應(yīng)用必須支援 IPv6,不然的話就拒絕通過審核,嘿嘿”

直奔主題。如果不想被拒,你應(yīng)該這樣做才行:

  1. 使用網(wǎng)絡(luò)通訊框架;
  2. 避免使用 IPv4 專用的 API;
  3. 避免使用硬編碼地址。

來源:點擊鏈接跳轉(zhuǎn)

現(xiàn)在讓我們來逐條展開:


  1. 使用網(wǎng)絡(luò)通訊框架;

也就是是說推薦你使用 iOS SDK 自帶的,構(gòu)建于 socket 上層的網(wǎng)絡(luò)通訊框架,或是第三方的網(wǎng)絡(luò)通訊框架。這樣,使用網(wǎng)絡(luò)通訊框架的話,上面的第 2 條大體上是不用操心的。如果你使用的是第三方的網(wǎng)絡(luò)通訊框架的話,一定記得詢問該框架的開發(fā)商:“你們支援 IPv6 嗎?”

作為網(wǎng)絡(luò)通訊框架其中之一的 ProudNet? 是支持 IPv6 的喲。自 2015 年 12 月的更新版本開始支持。ProudNet 的使用者如果要想支援 IPv6 的話,應(yīng)該使用 2015 年 12 月版本,或更高的版本。


  1. 避免使用 IPv4 專用的 API;

如果你親自編程 socket 層的話,記得不能使用 IPv4 專用 API。比如說,你不能使用如下這些 API (光是使用這些函數(shù)本身,是否會成為蘋果方面拒絕通過應(yīng)用審核的事由,目前還不清楚。反正 ProudNet 目前是全然不使用這些函數(shù)的)。

inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()

如果要測試在 IPv6 的環(huán)境下是否運轉(zhuǎn)正常,你需要構(gòu)建 IPv6 only 的網(wǎng)絡(luò)環(huán)境。方法有很多種。我們使用的是通過 Mac 機器的方法。


  1. 避免使用硬編碼地址。

蘋果使用的是“硬編碼地址”這樣的術(shù)語。不過這大體上只是對大眾友好的簡化說法。正確的學名其實應(yīng)該叫 IP literal。比方說形如 “11.22.33.44” 這種啦。

另一方面,我們通常所說的 “hostname”,比方說“server1.mygame.com”這種,學名叫 FQDN (fully qualified domain name)。

你問,通過“硬編碼地址”,也就是我們所說的 IP literal 連入服務(wù)器的話會有什么樣的后果呢?一些 IPv6 網(wǎng)絡(luò)下的客戶端會連不上 IPv4 網(wǎng)絡(luò)下的服務(wù)器(雖說 iOS 9.2 以后這個問題會部分解決,但是沒法保證在所有 IPv6 網(wǎng)絡(luò)下都沒問題)。

反之亦然—客戶端在 IPv4 下,服務(wù)器 IPv6。

至于連不上的原因嗎,要從 NAT64 / DNS64 的聯(lián)動關(guān)系說起。因為內(nèi)容有點長,這里就不贅述了。

那么應(yīng)該腫么辦呢?乖乖地聽從蘋果大人所“指示”(?)的。通過 FQDN 而不是 IPv4 literal 的連入的情況下,服務(wù)器要能夠接收??蛻舳诉B接服務(wù)器時則要使用 FQDN。

舉例說明上面的內(nèi)容:

  • 11.22.33.44 ==> 蘋果會屏蔽你
  • server.mygame.com ==> Ok
  • 11:22:33:44:55:66:77:88 ==> 蘋果會屏蔽你

運維人員則要對每臺服務(wù)器設(shè)置 DNS 使每臺機器均有 FQDN 是吧?客戶端方面則要在連入服務(wù)器時使用 FQDN 而不是 IP literal 是吧。

如果現(xiàn)階段對每臺機器賦予 FQDN 比較困難的話,ProudNet 提供如下的的應(yīng)急方案。

連入基于 ProudNet 的服務(wù)器時使用 IP literal,并額外輸入另一臺 IPv4 下的服務(wù)器 X 的FQDN,就行啦。服務(wù)器 X 并不會真的連入,只是作為 DNS 檢索對象,所以請放心。有了這個,就可以光用 IPv4 literal 也能連入服務(wù)器啦,雖然不能保證 100% 管用 [1]。

CNetClient* nc = CNetClient::Create();
p.m_serverIP = "11.22.33.44";
p.m_publicDomainName1 = "www.nettention.com";
p.m_publicDomainName2 = "www.baidu.com";
nc->Connect(p);

(C#也是可以的,這里不再贅述)

為什么光用 IPv4 literal 也能連上呢?因為實現(xiàn)了 NAT64 的“地址組合算法”。這個說來也比較長,這里也是略過 ^^

不管怎么說,使用上述 API 始終只是緩兵之計,應(yīng)急措施。要徹底解決的話還是要聽從蘋果大人“指示”(?)的那樣子,“”。


番外:等到 IPv6 大量普及了以后,路由器是不是就可以消失了?

如果 IPv6 大量普及了的話,路由器“在理論上”確實可以扔進歷史的回收站了。路由器本身就是用來解決互聯(lián)網(wǎng)地址總數(shù)不夠用這個問題的其中一種方法而已。

但是。作為對每個 IP 地址明碼標價,作為商品出售的網(wǎng)絡(luò)提供商來說,即使是 IPv6,奸商們也不大可能會輕輕松松送你 IP 地址的。那么設(shè)置路由器的這種事兒也就不可避免啦。對路由器這塊比較強大的 ProudNet 也會繼續(xù)有存在的必要性的。


那祝編程愉快~


2016.7.19
轉(zhuǎn)載上面的文章時,IPV6的新規(guī)還沒有正式執(zhí)行,并且到目前為止,已經(jīng)提交了多次審核,并且都沒有發(fā)生過問題;
不過最近一次提審被蘋果拒了,提示在登錄時網(wǎng)絡(luò)故障;重復提交一次,結(jié)果還是相同的問題被打回;
(這個問題很多人應(yīng)該都遇見過,在本地進行IPV6環(huán)境測試,都OK的,但是送到蘋果審核就連不上網(wǎng)絡(luò))
我的解決方法是:在被拒絕的通知下直接回回復自己測試ok的,并附上視頻片段;
結(jié)果第二天還真的通過了。這說明,蘋果那邊還是會盡量協(xié)助開發(fā)者的。

另外,在網(wǎng)上收集了一些相關(guān)的討論:

阿里云技術(shù)論壇:
https://bbs.aliyun.com/read/284699.html?spm=5176.bbsr284699.0.0.yehNue

來自cocoachina上的討論:
http://www.cocoachina.com/bbs/read.php?tid-1684570-page-1.html

[1]: 在包括 Mac 機器在內(nèi)的部分客戶端 IPv6 路由器下正常工作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容