關於IPV6稽核被拒的完整分析

火之玉發表於2017-10-01

自從去年6月1號Apple明文規定所有開發者提交新版本都必須支援IPV6-Only的網路,估計很多iOS開發者都遇到由於IPV6網路不支援造成的稽核被拒的情況, 我被坑的不輕啊, 下面就來分析一下IPV6問題如何解決。

首先附一個稽核被拒的原文:

Guideline 2.1 - Performance - App Completeness
We discovered one or more bugs in your app when reviewed on iPad running iOS 10.3.2 on Wi-Fi connected to an IPv6 network.
Specifically, the app launched to a blank page.
Please see attached screenshots for details.

Next Steps
To resolve this issue, please run your app on a device while connected to an IPv6 network (all apps must support IPv6) to identify any issues, 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. For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue.

大意是在iPad上執行iOS 10.3.2 wi - fi連線到IPv6網路, 應用程式啟動是一個空白頁。請在裝置上執行您的應用程式,連線到IPv6網路, 然後修改並重新提交你的應用程式進行審查。

一. 簡單介紹一下IPV6以及如何搭建檢測環境

首先IPV6,是對IPV4地址空間的擴充。目前當我們用iOS裝置連線上Wifi、4G、3G等網路時,裝置被分配的地址均是IPV4地址,但是隨著運營商和企業逐漸部署IPV6 DNS64/NAT64網路之後,裝置被分配的地址會變成IPV6的地址,而這些網路就是所謂的IPV6-Only網路,並且仍然可以通過此網路去獲取IPV4地址提供的內容。簡單來說就是IPV4不夠用了, 要換IPV6, 這從蘋果一向的以使用者體驗為主出發, 其實也是為了讓使用者能用著舒服;
測試是否支援IPV6網上已有更多詳細的方法, 照著搭建就行, 下方附搭建環境的方法:

二. 解決辦法

總的來說有三個方面的問題:

  • 伺服器不支援IPV6
  • 專案中匯入的第三方SDK不支援IPV6
  • 專案中涉及到的網路請求不支援IPV6

除了這些, 還有些其他因素, 比如蘋果正在稽核, 而你們的後臺在部署介面, 這種才是真的坑爹?啊, 不多說, 感覺眼淚止不住往下流了;

1. 伺服器

①檢測伺服器是否支援IPV6
終端輸入以下程式碼:(參照網上方法)

dig +nocmd + nostats 你的域名 AAAA

這是看看你們的伺服器在IPV6下是否有回應。

1893416-131bb3b92d7d4a32.png
簡書的域名檢測

有錯誤的話, 對照下面的表:

1893416-7152fde82d12c515.jpeg

改變DNS的配置,直到穩定返回 NOERROR 為止。

②更改伺服器配置
阿里雲 Ubuntu 支援 IPv6 的完整步驟

2. 第三方SDK

這些問題一般會出現在那些維護的APP裡面, 由於是初次開發APP的人所處的時間相對較遠, 所以專案裡所用的SDK會有一些功能缺失; 下面介紹幾個第三方SDK的問題;
①Reachability

1893416-76546fc1bc25e91c.png

蘋果都發話, 這個當然要改了;
新的sdk包將這個方法幹掉了:reachabilityForLocalWiFi,只要自己的程式碼中幹掉就行了,沒什麼影響。

原因如下介紹:

#pragma mark reachabilityForLocalWiFi

//reachabilityForLocalWiFi has been removed from the sample.  See ReadMe.md for more information.

//+ (instancetype)reachabilityForLocalWiFi;

②JPush極光推送(v2.1.7開始支援)
這個是我們專案裡遇到的問題, SDK版本低了, 不支援IPV6;

1893416-5940679c456a7211.png

從圖中可以看出, 2.1.7版本才開始支援IPV6, 而我們版本是2.1.0; 唉?, 乖乖升級咯;
附:
極光文件地址

③微博SDK(v3.1.4開始支援)

1893416-3f908974fffb7995.png

而且從官方文件上發現, 更新SDK, 實際上是更新Reachability庫;

1893416-92cfa26d86384a7c.png

附:
微博SDK文件地址

④友盟(v5.2.1開始支援)

1893416-2b385885c2209ff4.png

附:
友盟文件地址

⑤微信(v1.5開始支援)

1893416-3b50270e67028496.png

有簡友說微信的sdk包是支援ipv6的,但是微信本身並不支援ipv6,所以說,即便你替換了最新的sdk包,在ipv6網路下還是不能用微信分享,因為你的app應用在ipv6網路環境下調不起微信,也就分享不了了,這個問題微信應該意識到了,估計後邊的版本應該也是支援ipv6, 這個大家可以注意下;
附:
微信文件地址

⑥QQ(未說明)

1893416-d69aa246321c8f1a.png

從變更歷史也看不出從哪個版本開始支援的, 估計是覺得這點玩意兒不值得說吧. 大佬們的世界真是看不懂, 大家就按時間來估計吧;
附:
QQ文件地址

⑦支付寶(未說明)

1893416-1d4772e829f52c57.png

看下載的demo裡面, 版本更新歷史對具體哪個版本更新的未說明, 萬一是最近被蘋果打壓的才更新的, 也不一定, 反正最新版本肯定是有了, 而且還多了些其他功能;
附:
支付寶文件地址

⑧百度地圖(v3.0.0開始支援)

1893416-852713b47cf0755f.png

附:
百度地圖文件地址

⑨環信(v3.1.3開始支援)

1893416-b46fc7dde6313146.png

附:
環信文件地址

⑩科大訊飛語音(v1.133開始支援)

1893416-cc8c71251aec806a.png

附:
科大訊飛語音文件地址

當然還有很多其他的SDK, 這裡就不一一列舉了, 根據專案裡用了哪些, 看下官方文件SDK版本歷史比對一下就行;

3. 網路請求

其實對於ipv6_Only的處理,從兩大方面進行自己稽核:自身網路請求和三方涉及網路請求, 畢竟是由於網路問題;
關於AFNetworking是否支援IPV6, 下面是一網友的說法:

1893416-78f74e02a15bc898.png

而版本支援是在3.0以後;

1893416-a62985236e2ce88d.png

當然, 聽說網友還遇到了其他的問題:(這個我沒遇到, 不過還是在這裡記一下?)
內網的訪問下是不可能連線到自己的伺服器,後面測試一下公網阿里雲的伺服器,能夠正常連線,這個可能是DNS64在搜尋ipv6的過程中,並沒有搜尋內網的網路,導致內網連線失敗;

如果這些還是沒能解決你的問題, 可以看看下面這篇文章:
http://www.jianshu.com/p/a6bab07c4062

最後感謝參考文章作者的分享, 希望攻城獅們早日解決bug, 繼續擼程式碼, O(∩_∩)O哈哈~

本文參考文章:
iOS 被拒6次的ipv6
Ipv6_Only 簡單的理解(已驗證,專案已經上線)

推薦閱讀文章:
iOS應用支援IPV6,就那點事兒

相關文章