請(qǐng)著重看第三條。。。
- 使用網(wǎng)絡(luò)通訊框架;
- 避免使用 IPv4 專用的 API;
- 避免使用硬編碼地址。
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 月版本,或更高的版本。
2> 避免使用 IPv4 專用的 API;
如果你親自編程 socket 層的話,記得不能使用 IPv4 專用 API。比如說,你不能使用如下這些 API (光是使用這些函數(shù)本身,是否會(huì)成為蘋果方面拒絕通過應(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)境下是否運(yùn)轉(zhuǎn)正常,你需要構(gòu)建 IPv6 only 的網(wǎng)絡(luò)環(huán)境。方法有很多種。我們使用的是通過 Mac 機(jī)器的方法。
3> 避免使用硬編碼地址。
蘋果使用的是“硬編碼地址”這樣的術(shù)語。不過這大體上只是對(duì)大眾友好的簡化說法。正確的學(xué)名其實(shí)應(yīng)該叫 IP literal。比方說形如 “11.22.33.44” 這種啦。
另一方面,我們通常所說的 “hostname”,比方說“server1.mygame.com”這種,學(xué)名叫 FQDN (fully qualified domain name)。
你問,通過“硬編碼地址”,也就是我們所說的 IP literal 連入服務(wù)器的話會(huì)有什么樣的后果呢?一些 IPv6 網(wǎng)絡(luò)下的客戶端會(huì)連不上 IPv4 網(wǎng)絡(luò)下的服務(wù)器(雖說 iOS 9.2 以后這個(gè)問題會(huì)部分解決,但是沒法保證在所有 IPv6 網(wǎng)絡(luò)下都沒問題)。
反之亦然—客戶端在 IPv4 下,服務(wù)器 IPv6。
至于連不上的原因嗎,要從 NAT64 / DNS64 的聯(lián)動(dòng)關(guān)系說起。因?yàn)閮?nèi)容有點(diǎn)長,這里就不贅述了。
那么應(yīng)該腫么辦呢?乖乖地聽從蘋果大人所“指示”(?)的。通過 FQDN 而不是 IPv4 literal 的連入的情況下,服務(wù)器要能夠接收??蛻舳诉B接服務(wù)器時(shí)則要使用 FQDN。
舉例說明上面的內(nèi)容:
- 192.168.1.1 ==> 蘋果會(huì)屏蔽你
- server.mygame.com ==> Ok
- 11:22:33:44:55:66:77:88 ==> 蘋果會(huì)屏蔽你
希望對(duì)你有些許幫助0.0
謝謝支持!