前幾日剛做了一個(gè)基于XMPP聊天的app提交到商店,直接被拒。提示不能在iPV6環(huán)境連接網(wǎng)絡(luò)。
其實(shí)XMPP使用了第三方的socket庫:CocoaAsyncSocket,里面包含了GCDAsyncSocket.h和GCDAsyncSocket.m文件。GCDAsyncSocket中已經(jīng)對(duì)ipv4和ipv6同時(shí)做了支持,但是為何在ipv6情況下會(huì)connect失敗呢。
查看代碼執(zhí)行過程可以發(fā)現(xiàn),在方法
- (BOOL)connectWithAddress4:(NSData *)address4 address6:(NSData *)address6 error:(NSError **)errPtr;
中BOOL useIPv6變量被置為NO,從而導(dǎo)致代碼不執(zhí)行ipv6的創(chuàng)建操作,而是執(zhí)行ipv4的創(chuàng)建,從而導(dǎo)致連接始終失敗。
接下來我們進(jìn)行修改:
在 GCDAsyncSocket.m 找到下面兩個(gè)方法
- (BOOL)connectWithAddress4:(NSData *)address4 address6:(NSData *)address6 error:(NSError **)errPtr
{
LogTrace();
NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue");
LogVerbose(@"IPv4: %@:%hu", [[self class] hostFromAddress:address4], [[self class] portFromAddress:address4]);
LogVerbose(@"IPv6: %@:%hu", [[self class] hostFromAddress:address6], [[self class] portFromAddress:address6]);
// 增加的代碼--->
if(address6) {
[self setIPv6Enabled:YES];
}
// <---增加的代碼
...
}
- (void)setIPv6Enabled:(BOOL)flag
{
// Note: YES means kIPv6Disabled is OFF
dispatch_block_t block = ^{
if (flag) {
//修改的代碼-->
// config &= ~kIPv6Disabled;// 修改前的代碼
config |= kPreferIPv6; //修改后代碼
//<---修改的代碼
}
else
config |= kIPv6Disabled;
};
if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey))
block();
else
dispatch_async(socketQueue, block);
}
這樣就可以適配iPV6 了
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。