简单的使用不一一赘述了,其他的博主都已经介绍很多了,在此我就记录一下自己接入socket.io时的想法和bug。
想法:
1、APP进入后台之后,将所有的event都删除了;然后再唤醒的时候,再把所有的event都添加上。
manager里用字典对将所有的event和emit需要的参数 都保存了。这样才能保证在唤醒之后,能获取所有的event。
2、监听连接状态,在连接成功之后,再执行上述(1)操作。
bug:
1、emit时候,api的入参是array类型的。而后端可能需要的是字典。
只需要将字典用数组包一下就可以了,也即是字典是数组的第一个元素。
2、ack,官方git上是emitWithAck:with:timingOutAfter:callback: 但是API里面并没有此API
3、监听连接状态,用KVO一直不触发监听。
官方有提供监听链接状态的event
4、disconnect不发挥作用。
将socket(SocketIOClient) disconnect即可。
5、socket.io的自动重连,但是过一会儿就会收不到推过来的数据,但是心跳还在。
后端用的是netty-socketo三方库,而iOS端官方的库不知道是写的有问题,还是跟后端的不兼容。
bug出现原因,虽然重连前后的sid是一致的,但是此时对后端来说已经是两个会话了。当后端接收不到断开前回会话的心跳,后端超时,就不会在向此sid的会话推数据,而此时两次会话的sid是一致的,所有就收不到数据了。至于iOS客户端的心跳还在,只是说明会话还在,但是后端不推了。
bug解决,后端设置config.setRandomSession(true).
6、一个接口,后端会同时推多次数据。
bug出现原因,因为client的handlers里面有多个handle(同一event),所以在收到数据的时候,根据handles找到了多个handle。
bug解决,1、在on之前,先执行off。2、修改源码,在handles去重。我是这么做的,如图
7、ack收到乱码。
bug出现原因,因为utf8编码问题。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语音,有点旧。但是git上有个1.0-swift4分支。如果你在swift4环境下,项目bulid没问题,那么可以考虑这个。
②这个是不是方法的方法,因为我项目中有别的三方需要swift5,所以不能用第一种方法。我遇到的问题,是接收到ack回调的时候乱码,别的时候不会出现,所以我麻烦后端的同事在接到ack事件的时候,同时再执行一下on的回调。