1. 现象
支付宝小程序集成xmqtt.js后,安卓可以正常连接服务器,接收发送消息,IOS连接服务器正常,但是无法接收稍长的字符串。
支付宝小程序的真机调试报错AMQJS0007E Socket error:未能完成操作。(OSStatus错误-9807。)
2. 原因分析
推测是因为安卓和IOS对于消息处理机制不同,IOS对于较长的消息,会加入换行符号,即**\r\n**,有的消息内容甚至会加入多个**\r\n**。当我单个处理这个\r\n时,有时仍然会出问题,所以需要批量替换掉这个**\r\n**
中间,我采取了更换解析方法,base64转uni8Array的方法,发现安卓的又不好使了,真悲催。最终解决方案如下
3. 解决措施
批量替换换行符
data = data.replace(/[\r\n]/g,"");
对应的my.onSocketMessage方法接收消息修改如下
my.onSocketMessage((res) => { if (typeof res.data === 'string') { // let str = res.data.replace(/[\r\n]/g,""); // let array = base64.toByteArray(str) let buffer = Buffer.from(base64.toByteArray(res.data.replace(/[\r\n]/g,""))) proxy.push(buffer) } else { var reader = new FileReader() reader.addEventListener('load', function () { let data = reader.result if (data instanceof ArrayBuffer) data = Buffer.from(data) else data = Buffer.from(data, 'utf8') proxy.push(data) }) reader.readAsArrayBuffer(res.data) } });