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)
}
});