测试手机:iphone se2
手机软件版本:14.4 小程序调试基础库:2.15.0 (其实高版本低版本都试了个遍)
问题描述:Android 真机和微信开发者工具上 webSocket + stomp 可以成功收发数据,但是 IOS 真机不行,连上了1分钟左右自动断连。返回错误 code:1006. reason:"" 。(这个问题是之后出的,刚写完的时候是 Android / IOS 都可以的)
问题解决:
wx.onSocketMessage(function (res) {
// ios 缺少 0x00 导致解析失败
if (res && res.data) {
let value = res.data;
let code = value.charCodeAt(value.length - 1);
if (code !== 0x00) {
value += String.fromCharCode(0x00);
res.data = value;
}
}
ws.onmessage(res)
})
以下是排查的过程:(省略了许多,忘见谅,后续有时间会写个 demo)
代码我就不贴了,websocket + stomp 代码网上的基本一样。
我简述一下相关逻辑:就是使用微信的 WebSocket API 与服务器的 URL 连上的同时调用 Stomp 的 onopen( ) 方法,然后将微信接收到的服务器信息通过
Stomp 的 onmessage( ) 方法传给 Stomp ,Stomp 发送消息也是通过微信 API 的 wx.sendSocketMessage () 方法发送给服务器。Stomp 只是与服务器约定的一种文本格式,里面按照规则对文本进行了处理。
这是 iphone 真机调试的日志截图:
微信的 WebSocket API 是没有问题的,成功的接收到了服务器的信息,161648094400 - 161648088300 = 61000 毫秒 ,服务器与客户端一分钟没有交互导致 WebSocket 自动断连。
这是小程序开发工具的日志截图:
我小程序开发工具日志与苹果真机调试日志对比发现,苹果真机 WebSocket 收到的服务器信息都少了末尾的截图第 1、3 的 0 这个字符,frames (也就是 2 ) 这一行日志,解析出一个长度为 2 的数组,数组最后一个值就是字符编码为0的值,而苹果真机的没有。
下面是一部分 Stomp 源码:
这个 Byte 的 NULL 就是对应收到服务器消息末尾的字符编码为0的值。
下面是 onmessage() 的部分源码:
下面是 unmarshall() 方法
所以解决这个苹果真机断连的办法就是在微信 API 的 onSocketMessage 方法里传给 Stomp 前将 0x00 这个字符补上,以下是我的解决办法:
wx.onSocketMessage(function (res) {
// ios 缺少 0x00 导致解析失败
if (res && res.data) {
let value = res.data;
let code = value.charCodeAt(value.length - 1);
if (code !== 0x00) {
value += String.fromCharCode(0x00);
res.data = value;
}
}
ws.onmessage(res)
})
如有错误,期望不惜赐教。