使用CocoaAsyncSocket適配IPv6

使用CocoaAsyncSocket適配IPv6幾天前已經(jīng)審核通過了,剛旅行回來,以下補上關鍵代碼护蝶,有問題的朋友,直接留言吧翩迈。

前提:之所有提到使用CocoaAsyncSocke適配IPv6持灰,是因為我的應用本身是社交應用,使用socket和服務器連接负饲。

近些天堤魁,我負責的幾個app都遇到因為IPv6導致服務器連接不上喂链,從而蘋果的審核人員無法登錄應用而把應用拒絕的問題,事實上妥泉,我朋友在WWDC跟蘋果的工作人員溝通椭微,發(fā)現(xiàn)非常非常多的中國應用都遇到這個問題,沒有通過審核盲链。以上是我花了不少時間才搞定的解決方案蝇率,其實最后做出來真的超級簡單。
蘋果審核反饋的信息如下:

Image.png

蘋果在IPv6的環(huán)境下審核刽沾,最終失敗本慕。經(jīng)過驗證,我們發(fā)現(xiàn)確實如此侧漓。
介紹一下间狂,我們的應用網(wǎng)絡模塊的情況。所有的數(shù)據(jù)都是從socket收發(fā)火架,應用初次啟動的時候鉴象,本地是沒有業(yè)務服務器的IP和端口的,所以應用先連到服務器獲取這些業(yè)務服務器的IP和端口何鸡,我們稱這個服務器為服務列表服務器纺弊。socket是直接使用的第三方組件CocoaAsyncSocket。
連接服務列表服務器也是通過socket連接骡男,在連接的時候淆游,先通過一個在代碼里面寫死的一個IPv4的地址進行連接,如果連接不通隔盛,則通過解析一個寫死的URL獲取到地址之后再次進行連接犹菱,連接上之后從服務器獲取真實的業(yè)務服務器的IP和端口,并連接這些業(yè)務服務器吮炕,注意這里返回的業(yè)務服務器IP也是IPv4格式的腊脱。
以上邏輯在IPv4的環(huán)境里面是正常的,但是在IPv6的環(huán)境里面就不行了龙亲,主要是IPv4格式的IP不能在IPv6里面使用陕凹,所以雖然第一次通過預置的IP連接服務列表服務器失敗,會解析URL獲取到IPv6格式的IP鳄炉,但是從服務列表服務器拿到的IP仍然是IPv4格式的杜耙,無法使用。
所以一切的問題都指向一個:IPv4格式的IP無法在IPv6的網(wǎng)絡環(huán)境里面使用拂盯。
解決方案:如果當前是處于IPv6的網(wǎng)絡環(huán)境中佑女,那就對該IPv4的IP進行轉換,拿到一個IPv6格式的IP進行連接。
代碼邏輯:CocoaAsyncSocket里面有一個類方法

+ (NSMutableArray*)lookupHost:(NSString*)hostport:(uint16_t)porterror:(NSError**)errPtr

通過這個傳入一個IPv4的IP或者傳入一個URL可以查到對應的IPv6的IP团驱,前提是在IPv6的網(wǎng)絡環(huán)境下簸呈,如果是在IPv4的網(wǎng)絡環(huán)境下,只會拿到IPv4的IP店茶,當判斷查到的array里面有IPv6的IP的時候就直接用這個進行連接蜕便,否則用IPv4的IP進行連接
關鍵代碼:

//針對ipv6網(wǎng)絡環(huán)境下適配,ipv4環(huán)境直接使用原來的地址
- (NSString*)getProperIPWithAddress:(NSString*)ipAddrport:(UInt32)port
{
    NSError *addresseError = nil;
    NSArray *addresseArray = [GCDAsyncSocket lookupHost:ipAddr
                                                   port:port
                                                  error:&addresseError];
    if (addresseError) {
        NSLog(@"");
    }
    
    NSString *ipv6Addr = @"";
    for (NSData *addrData in addresseArray) {
        if ([GCDAsyncSocket isIPv6Address:addrData]) {
            ipv6Addr = [GCDAsyncSocket hostFromAddress:addrData];
        }
    }
    
    if (ipv6Addr.length == 0) {
        ipv6Addr = ipAddr;
    }
    
    return ipv6Addr;
}

每次連接socket的時候都將連接的ip和port傳進來贩幻,最后會輸出一個合適的ip轿腺,用這個ip和port進行連接就好了。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丛楚,一起剝皮案震驚了整個濱河市族壳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趣些,老刑警劉巖仿荆,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坏平,居然都是意外死亡拢操,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門舶替,熙熙樓的掌柜王于貴愁眉苦臉地迎上來令境,“玉大人,你說我怎么就攤上這事顾瞪√蚴” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵陈醒,是天一觀的道長惕橙。 經(jīng)常有香客問我,道長钉跷,這世上最難降的妖魔是什么弥鹦? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮尘应,結果婚禮上惶凝,老公的妹妹穿的比我還像新娘吼虎。我一直安慰自己犬钢,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布思灰。 她就那樣靜靜地躺著玷犹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洒疚。 梳的紋絲不亂的頭發(fā)上歹颓,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天坯屿,我揣著相機與錄音,去河邊找鬼巍扛。 笑死领跛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的撤奸。 我是一名探鬼主播吠昭,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胧瓜!你這毒婦竟也來了矢棚?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤府喳,失蹤者是張志新(化名)和其女友劉穎蒲肋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钝满,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡兜粘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了弯蚜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妹沙。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖熟吏,靈堂內(nèi)的尸體忽然破棺而出距糖,到底是詐尸還是另有隱情,我是刑警寧澤牵寺,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布悍引,位于F島的核電站,受9級特大地震影響帽氓,放射性物質(zhì)發(fā)生泄漏趣斤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一黎休、第九天 我趴在偏房一處隱蔽的房頂上張望浓领。 院中可真熱鬧,春花似錦势腮、人聲如沸联贩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泪幌。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祸泪,已是汗流浹背吗浩。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留没隘,地道東北人懂扼。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像右蒲,于是被迫代替她去往敵國和親微王。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容