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)該這樣做才行:
- 使用網(wǎng)絡(luò)通訊框架磷斧;
- 避免使用 IPv4 專用的 API贝搁;
- 避免使用硬編碼地址。
來源:點擊鏈接跳轉(zhuǎn)
現(xiàn)在讓我們來逐條展開:
- 使用網(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 月版本忱嘹,或更高的版本嘱腥。
- 避免使用 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 機器的方法。
- 避免使用硬編碼地址艾帐。
蘋果使用的是“硬編碼地址”這樣的術(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ù)器要能夠接收『⒌龋客戶端連接服務(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ò)故障涨缚;重復(fù)提交一次轧粟,結(jié)果還是相同的問題被打回;
(這個問題很多人應(yīng)該都遇見過脓魏,在本地進行IPV6環(huán)境測試兰吟,都OK的,但是送到蘋果審核就連不上網(wǎng)絡(luò))
我的解決方法是:在被拒絕的通知下直接回回復(fù)自己測試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 路由器下正常工作俐末。