簡單的使用不一一贅述了廷没,其他的博主都已經(jīng)介紹很多了,在此我就記錄一下自己接入socket.io時(shí)的想法和bug吆鹤。
想法:
1丛肮、APP進(jìn)入后臺(tái)之后,將所有的event都刪除了涡驮;然后再喚醒的時(shí)候暗甥,再把所有的event都添加上。
manager里用字典對(duì)將所有的event和emit需要的參數(shù) 都保存了捉捅。這樣才能保證在喚醒之后撤防,能獲取所有的event。
2锯梁、監(jiān)聽連接狀態(tài)即碗,在連接成功之后,再執(zhí)行上述(1)操作陌凳。
bug:
1剥懒、emit時(shí)候,api的入?yún)⑹莂rray類型的合敦。而后端可能需要的是字典初橘。
只需要將字典用數(shù)組包一下就可以了,也即是字典是數(shù)組的第一個(gè)元素充岛。
2保檐、ack,官方git上是emitWithAck:with:timingOutAfter:callback:? ?但是API里面并沒有此API
3崔梗、監(jiān)聽連接狀態(tài)夜只,用KVO一直不觸發(fā)監(jiān)聽。
官方有提供監(jiān)聽鏈接狀態(tài)的event
4蒜魄、disconnect不發(fā)揮作用扔亥。
將socket(SocketIOClient)? disconnect即可场躯。
5、socket.io的自動(dòng)重連旅挤,但是過一會(huì)兒就會(huì)收不到推過來的數(shù)據(jù)踢关,但是心跳還在。
后端用的是netty-socketo三方庫粘茄,而iOS端官方的庫不知道是寫的有問題签舞,還是跟后端的不兼容。
bug出現(xiàn)原因柒瓣,雖然重連前后的sid是一致的儒搭,但是此時(shí)對(duì)后端來說已經(jīng)是兩個(gè)會(huì)話了。當(dāng)后端接收不到斷開前回會(huì)話的心跳嘹朗,后端超時(shí)师妙,就不會(huì)在向此sid的會(huì)話推數(shù)據(jù),而此時(shí)兩次會(huì)話的sid是一致的屹培,所有就收不到數(shù)據(jù)了默穴。至于iOS客戶端的心跳還在,只是說明會(huì)話還在褪秀,但是后端不推了蓄诽。
bug解決,后端設(shè)置config.setRandomSession(true).
6媒吗、一個(gè)接口仑氛,后端會(huì)同時(shí)推多次數(shù)據(jù)。
bug出現(xiàn)原因闸英,因?yàn)閏lient的handlers里面有多個(gè)handle(同一event)锯岖,所以在收到數(shù)據(jù)的時(shí)候,根據(jù)handles找到了多個(gè)handle甫何。
bug解決出吹,1、在on之前辙喂,先執(zhí)行off捶牢。2、修改源碼巍耗,在handles去重秋麸。我是這么做的,如圖
7、ack收到亂碼亲族。
bug出現(xiàn)原因次乓,因?yàn)閡tf8編碼問題吓歇。iOS13棄用了doubleEncodUtf8,socket.io在2.0版本(此版本不是pod search到的版本)票腰,也棄用了。而后端女气、安卓等都是1.0杏慰。所以有些不兼容,不知道是該開心炼鞠,還是該不開心缘滥。
bug解決,
①下載 V 9.x版本(10.0.0以上(包含)的是socket.io2.0谒主,以下的socket.io1.0)朝扼。注意:pods上的V9.x版本是swift3語音,有點(diǎn)舊霎肯。但是git上有個(gè)1.0-swift4分支擎颖。如果你在swift4環(huán)境下,項(xiàng)目bulid沒問題观游,那么可以考慮這個(gè)搂捧。
②這個(gè)是不是方法的方法,因?yàn)槲翼?xiàng)目中有別的三方需要swift5懂缕,所以不能用第一種方法允跑。我遇到的問題,是接收到ack回調(diào)的時(shí)候亂碼搪柑,別的時(shí)候不會(huì)出現(xiàn)聋丝,所以我麻煩后端的同事在接到ack事件的時(shí)候,同時(shí)再執(zhí)行一下on的回調(diào)工碾。