天天看點

API網關的iOS SDK已經支援 IPV6

5月初apple明文規定所有開發者在6月1号以後送出新版本需要支援ipv6-only的網絡,有些使用者在這塊就踩到坑了,多次被拒。下面我們就apple在這塊的規定分析一下,我們的app如何才能避免在這個問題上吃apple的閉門羹。

ipv6是對ipv4位址空間的擴充。目前我們用ios裝置連上網絡時,裝置被配置設定的位址均是ipv4位址,但是随着營運商和企業逐漸部署ipv6 dns64/nat64網絡之後,裝置被配置設定的位址會變成ipv6的位址,而這些網絡就是所謂的ipv6-only網絡。重點是,目前ios裝置仍然可以通過此網絡去擷取ipv4位址提供的内容。用戶端向伺服器端請求域名解析,首先通過dns64 server查詢ipv6的位址,如果查詢不到,再向dns server查詢ipv4位址,通過dns64 server合成一個ipv6的位址,最終将一個ipv6的位址傳回給用戶端。如圖所示:

API網關的iOS SDK已經支援 IPV6

在mac os 10.11+的雙網卡的mac機器(以太網口+無線網卡),我們可以通過模拟建構這麼一個local ipv6 dns64/nat64 的網絡環境去測試應用是否支援ipv6-only網絡,大概原理如下:

API網關的iOS SDK已經支援 IPV6

具體的搭建方法請參考:

<a href="https://developer.apple.com/library/mac/documentation/networkinginternetweb/conceptual/networkingoverview/understandingandpreparingfortheipv6transition/understandingandpreparingfortheipv6transition.html#//apple_ref/doc/uid/tp40010220-ch213-sw1">https://developer.apple.com/library/mac/documentation/networkinginternetweb/conceptual/networkingoverview/understandingandpreparingfortheipv6transition/understandingandpreparingfortheipv6transition.html#//apple_ref/doc/uid/tp40010220-ch213-sw1</a>

apple說的支援ipv6-only網絡,其實就是說讓應用在 ipv6 dns64/nat64 網絡環境下仍然能夠正常運作。我們目前的實際網絡環境仍然是ipv4網絡,應用需要能夠同時保證ipv4和ipv6環境下的可用性。

apple官方聲明ios9開始向ipv6支援過渡,在ios9.2+支援通過getaddrinfo方法将ipv4位址合成ipv6位址(the ability to synthesize ipv6 addresses was added to getaddrinfo in ios 9.2 and os x 10.11.2)。蘋果的稽核部門表示,隻需要應用在蘋果最新的系統上保證ipv6的相容性即可。

如果應用一直直接使用ipv4位址通過nsurlconenction或者nsurlsession進行網絡請求(一般需要伺服器允許,且用戶端需要在header中僞裝host);經測試,ipv6網絡環境下,直接使用ipv4位址在ios9及以上的系統仍然能夠正常通路;在ios8.4及以下不能正常通路;這一點蘋果的解釋和建議是這樣的:

note: in ios 9 and os x 10.11 and later, nsurlsession and cfnetwork automatically synthesize ipv6 addresses from ipv4 literals locally on devices operating on dns64/nat64 networks. however, you should still work to rid your code of ip address literals.

對于如何支援ipv6-only,官方給出了如下幾點标準:

1.use high-level networking frameworks; 2.don’t use ip address literals; 3.check source code for ipv6 dns64/nat64 incompatibilities; 4.use system apis to synthesize ipv6 addresses;

官方對 high-level networking frameworks有以下解釋:

using high-level networking apis such as nsurlsession and the cfnetwork frameworks and you connect by name, you should not need to change anything for your app to work with ipv6 addresses

可以明确的是nsurlsession和cfnetwork是支援ipv6的, 經過測試,nsurlconnection在最新的ios9系統上是支援ipv6的。

api網關的sdk使用的是蘋果提供的high-level networking frameworks:nsurlsession進行的網絡通路,并且使用的都是域名方式通路,完全支援ipv6-only的網絡環境,可以放心使用。

如果你的app隻使用了api網關的sdk進行網絡通路,那麼你的app上架申請時不會因為不支援ipv6-only的網絡環境而被拒絕。如果因為ipv6 only問題被拒絕,請查找自己的其他代碼,看看是否有其他的網絡通路代碼。

如果你的app還通路了其他網絡,請在網絡通路時确認以下兩點:

使用high-level networking frameworks(nsurlsession,cfnetwork frameworks)來通路網絡,并且使用域名,不要使用ip。

如果必須使用ip來通路網絡,對ip進行ipv6的處理後使用。