关于IPv6
求解決方法
被拒原因
We discovered one or more bugs in your app when reviewed on iPhone running iOS 10.1.1 on Wi-Fi connected to an IPv6 network.
Specifically, we received a network error message when we used the demo account to log in.
Next Steps
Please run your app on a device while connected to an IPv6 network (all apps must support IPv6) to identify the issue(s), then revise and resubmit your app for review.
If we misunderstood the intended behavior of your app, please reply to this message in Resolution Center to provide information on how these features were intended to work.
For new apps, uninstall all previous versions of your app from a device, then install and follow the steps to reproduce the issue(s). For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue(s).
Resources
For information about supporting IPv6 Networks, please refer to Supporting IPv6 DNS64/NAT64 Networks and About Networking
網上好多關于ipv6的資料,說半天ipv6是什么,怎么建立測試環境,,,可是沒有看到具體的操作和解決的方案,這里,為大家提供一種方案,希望給大家帶來幫助吧。
總的來說有三個方面需要進行檢查和修改:
1、項目里面涉及和網絡有關的網絡請求是否支持ipv6。
2、項目里面涉及和網絡有關的sdk是否支持ipv6。
3、項目的服務器是否支持ipv6。
?
IPv6的簡介
IPv4 和 IPv6的區別就是 IP 地址前者是 .(dot)分割,后者是以 :(冒號)分割的(更多詳細信息自行搜索)。
PS:在使用 IPv6 的熱點時候,記得手機開飛行模式哦,保證手機只在 Wi-Fi 下上網,以免手機在連接不到網絡時候,會默認跳轉到使用 蜂窩移動網絡(即2G、3G、4G流量) 上網。
IPV6,是對IPV4地址空間的擴充。目前當我們用iOS設備連接上Wifi、4G、3G等網絡時,設備被分配的地址均是IPV4地址,但是隨著運營商和企業逐漸部署IPV6 DNS64/NAT64網絡之后,設備被分配的地址會變成IPV6的地址,而這些網絡就是所謂的IPV6-Only網絡,并且仍然可以通過此網絡去獲取IPV4地址提供的內容。客戶端向服務器端請求域名解析,首先通過DNS64 Server查詢IPv6的地址,如果查詢不到,再向DNS Server查詢IPv4地址,通過DNS64 Server合成一個IPV6的地址,最終將一個IPV6的地址返回給客戶端。如圖所示:
網上對于蘋果官網上ipv6的文章翻譯很多,附上鏈接,這篇介紹的不錯:iOS應用支持IPV6,就那點事兒
本地 Mac 搭建 IPv6 測試環境
附上鏈接:本地如何搭建IPv6環境測試你的APP
(上邊這些幾乎沒什么用,網上一搜有很多。。。)
如何判斷自己的項目里面是否是ipv6、ipv4呢,我們用的方法,就是自己項目里面涉及和網絡有關的進行一一排查。
(文章最后會提到ipv6解決的方案除了上述兩點還有一個關于服務器的原因。)
我們的app本身支持ipv6是因為我們使用的網絡請求是asihttpRequest請求,而asihttpRequest是基于CFNetwork的,蘋果有說明CFNetwork庫是支持IPV6的。而除了自身的網絡請求外,我們項目中涉及網絡的就是三方庫了,所以歸根到底我們做的只是第三方庫的替換,即:哪些三方庫和網絡有關,那么挨個查看最新的sdk文檔解釋是否描述支持ipv6,如果支持,那就替換。如果沒說支持,那就不換。
(當然,還可以用cocoadpods替換三方庫,關于cocoadpods的學習可以參考本人這篇文章Cocoapods安裝)
這種方案需要驗證,估計需要幾天的時間才能知道上線是否被拒。如果僥幸上線了,我會第一時間在本文里面續寫一下。如果被拒,我也會第一時間排查原因,進行本文的更新。謝謝大家的支持。
已經上線了,該方案可行。
?
那么我們替換了哪些三方庫呢,下邊一一列舉。(文章下部會有各個三方庫的鏈接)
1、Reachability
按照蘋果開發者中心提示,這個必須換。
新的sdk包將這個方法干掉了:reachabilityForLocalWiFi,只要自己的代碼中干掉就行了,沒什么影響。
原因如下介紹:
#pragma mark reachabilityForLocalWiFi//reachabilityForLocalWiFi has been removed from the sample. See ReadMe.md for more information.//+ (instancetype)reachabilityForLocalWiFi;2、新浪微博
根據官網提示,這個新的sdk支持了ipv6,所以進行替換。
替換后:
根據比較,新舊sdk只有上述變化,替換后command+B編譯無錯誤提示。應該沒事。
3、連連支付
按照連連支付官方文檔
最新的sdk包是支持ipv6的,但是舊包也是支持的。項目中用的是2.4.0,官網上最新包是2.4.7,最后我們做了替換。
替換后報錯了:
原因是在新的sdk包里將報錯的這兩個方法合成了一個。
在新的方法里面添加了一個判斷支付類型的參數。
根據項目中報錯的兩個地方,第一個是快捷支付,第二個是認證支付。按照之前的進行了修改。command+B編譯無錯誤提示。應該沒事。
但是實際上還是遇到了崩潰的bug。然后我們換回了2.4.0版本,應為連連支付官網上說之前的版本也支持ipv6,我們之前的版本沒有問題,所以換了回來,看看上線能成功不。
4、友盟
按照友盟官方sdk文檔描述,需要更換新的sdk包。
按照需要,勾選了如下:
OMG,搞錯了,項目里面的友盟是友盟分析,上邊那個是友盟分享。。。
但是根據官方文檔,好像我們的不用替換,因為涉及到什么IDFA,我們項目好像不涉及這個。
5、微信
按照微信最新sdk包1.7版本里面的README.txt,最新的sdk包支持ipv6
而我們項目中的微信是1.5版本的。應該進行替換。command+B編譯無錯誤提示。應該沒事。
比較可笑的是微信的sdk包是支持ipv6的,但是微信本身并不支持ipv6,所以說,即便你替換了最新的sdk包,在ipv6網絡下還是不能用微信分享,因為你的app應用在ipv6網絡環境下調不起微信,也就分享不了了,這個問題微信應該意識到了,估計后邊的版本應該也是支持ipv6的吧。
6、QQ
官方文檔好像也沒有說ipv6的事啊
7、支付寶sdk支持了ipv6!!!
可是下載的時候總是打不開.zip的壓縮包。。。叫別人幫忙下載了一份
command+B編譯無錯誤提示。應該沒事。
8、百度地圖
根據比較,新的sdk包沒有了bundle文件。需要將舊包的bundle文件拷貝進來。
各個sdk下載地址:
reachability
新浪微博
連連支付
友盟統計分析
微信
支付寶
百度地圖
總之,對于ipv6_Only的處理就是這樣辦的,從兩大方面進行自己審核:自身網絡請求和三方涉及網絡請求。
關于AFNetworking是否支持ipv-6,有網友如是說:
可見,AFNetworking是支持ipv-6的。但是,關于支持ipv6的afn版本有如下說明:
另外有網友遇到這樣一個問題:這里還遇到一個坑,內網的訪問下是不可能連接到自己的服務器,后面測試一下公網阿里云的服務器,能夠正常連接,這個可能是DNS64在搜索ipv6的過程中,并沒有搜索內網的網絡,導致內網連接失敗(這里卡了半天, 切記)(這個問題筆者并沒有遇到,也沒有親測,大家注意一下這個問題,如果遇到了,知道是怎么回事。)
最后,有的網友上線被拒了,可能是因為app的服務器端沒有支持ipv6,就此問題,我咨詢了我們的技術經理,技術經理說“后臺(即服務器)是要做ipv6的支持工作的”。但是具體是誰管,具體怎么操作的我就不得而知了,這里大家注意一下吧:不僅僅是客戶端這邊支持ipv6,上線之前最好問一下后臺端是不是做了相應的ipv6的支持。
這里關于自己的服務器是否支持ipv6,有網友提供了一個方法,大家可以試一下。(謝謝杭州-托兒索被拒6次的ipv6,爭得托兒索的同意,進行轉發)
前兩條說的就是我們的方案:項目里面涉及和網絡有關的進行一一排查。
第三條是在自己電腦上判斷是否服務器支持ipv6的。親測,在終端得到下圖:
按照托兒索的說法,上圖的位置那里顯示NOERROR說明服務器沒有問題,也是支持ipv6的。如果有錯的話,可以按照下邊提供的表格進行對照。
再看托兒所的結論,我們會得到下邊的結論,涉及支持ipv6的其實是包括三個方面的:
1、項目里面涉及和網絡有關的網絡請求是否支持ipv6。
2、項目里面涉及和網絡有關的sdk是否支持ipv6。
3、項目的服務器是否支持ipv6。
最后,說一下關于托兒索的命令行:終端? dig +nocmd + nostats 你的域名 AAAA,我在網上查了一下發現有這么個命令行:
為了方便復制:digwww.isc.orgAAAA +short?
得到的結果直接就是一個ipv6格式的,不知道不支持ipv6服務器的是不是打印出來的是不是ip地址(有待驗證)。如果誰驗證了,希望告知我一聲。在此謝謝了。所以也可以用這個命令行側面驗證服務器是否支持ipv6。
?
參考文章:
http://www.jianshu.com/p/97b205933c15
轉載于:https://www.cnblogs.com/WiliamF/p/6264702.html
總結