- 建议丰富快捷键设置
问题一:快捷键特立独行 常规的IDE往往是: ctrl+f: 当前文件搜索 ctrl+r: 当前文件替换 ctrl+shift+f: 全局搜索 ctrl+shift+r: 全局替换 而微信的开发者工具为: ctrl+f: 当前文件搜索 ctrl+r: 无效 ctrl+shift+f: 全局搜索 ctrl+shift+r: 当前文件替换 由于经常在各种IDE间切换,微信开发者工具这个与众不同的快捷键经常坑死你不偿命。查看自定义快捷键,发现根本不提供搜索和替换快捷键的自定义设置。 强烈建议丰富可自定义的快捷键,特别是搜索和替换。 问题二:全局搜索窗口神出鬼没 ctrl+shift+f叫出全局搜索窗口,此时发现需要复制一个搜索内容,于是点编辑窗口来复制,全局搜索窗口自动消失了。只能复制完了再按快捷键叫出来,然后粘贴上再搜索。 这个神奇的设定大大增加了按快捷键的次数,实在不方便。就不能持续显示或者嵌入到某个区域内,让用户自行关闭吗?或者提供个设置允许自定义是否自动消失也行啊。
2019-05-23 - websocket出现无法连接
## 问题 小程序开发,创建websocket连接来通信,通信完成便释放掉。再通信再打开。当通信到第22次/34次时,websocket的onOpen将不再触发。 测试用的微信版本为7.0.3和7.0.4,基础库版本为2.6.6。 经测试,该问题有以下特点: 1. 若出现该问题,则100%一定复现。例如A手机在第22次出现了该问题,则下次运行小程序,必然还是22次出问题。且出问题后,本次运行小程序的websocket再也无法恢复正常。 2. 清除小程序的后台进程,再次打开小程序,依然可以正常websocket通信22次。之后问题再次出现。 3. 有的是卡在第22次,有的是卡在第34次。这是在真机调试,没有打开开发者工具调试界面情况下。若使用开发者工具,开着开发者工具的调试界面,则是卡在第20/32次。 4. 与Android系统无关。目前测试出问题的手机Android系统有:Android 5.0,Android 6.0,Android 7.1.2,Android 8.1.0。 5. 与手机无关。写一个网页,使用js的websocket实现同样的逻辑。用小程序出问题的手机的浏览器打开,经测试无连接次数限制。 6. 与手机厂家无关。目前试过小米,魅族,原生谷歌系统,都出现过。 7. 与手机型号无关。有一台出问题的手机为小米Note3,测试另一台同一批次参数完全相同的小米Note3,两台都为同一版本的MIUI与Android,将两台手机的各个设置全部调为一样,一台依然是正常的,不出现该问题;另一台则100%会在第34次通信出现该问题。 8. 试过调整微信的权限,无效;试过清空微信的数据和缓存,无效;重装微信,绝大多数可以解决。有一台是谷歌原生系统7.1.2,重装也无法解决。 9. 小程序与插件都存在该问题。 ## 测试方法 定义一个变量count用于记录websocket成功连接的次数。 调用wx.connectSocket创建socketTask并暂存,在socketTask.onOpen中关闭该socketTask并令count++,在socketTask.onClose中调用wx.connectSocket来创建一个新的socketTask。重复上述步骤。 于是,只要websocket成功创建并触发onOpen,count就会+1。当该websocket成功关闭后,再重复该流程。一旦websocket没有触发onOpen,流程就会卡住。由此,当websocket卡住的时候,就可以知道已经成功建立了多少次websocket连接。 在此过程中是先关闭上次websocket完成后再开始创建下一个websocket,自始至终同一时间只有一个websocket,因此不存在超出5个websocket的问题。另外是在onOpen与onClose中执行的关闭与创建操作,所以也不存在时序问题。
2019-04-24 - websocket延时问题
功能对延时要求非常高,又需要网络通信,所以使用了websocket。 写了一个测试页面,功能很简单:定义一个变量存储要发送的数据。打开websocket连接,然后向服务端发送变量中的数据。服务端收到后会返回。当SocketTask.onMessage监听到服务端数据后,立马向服务端再次发送变量中的数据。 这样,就是发送-接收-发送-接收这样的循环。小程序这边没有任何其他逻辑处理,页面也没有使用定时器。勾选了开发者工具中的“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书”。 然后,使用开发者工具调试,服务端进行了打印,发现从服务端返回数据到再次接收到开发者工具发来的数据,耗时在10ms以内。 然而,使用真机调试,发现这个耗时普遍在120ms以上。服务端进行了抓包和打印,发现每次小程序收到服务端返回,先给出一个tcp的确认,这个耗时很短,一般是20ms左右,但等收到小程序的websocket数据,150ms就过去了。 本来网络延时若在40ms以内,是可以满足要求的。但现在局域网就达到120ms以上,这个太高了,想请教一下为何tcp的确认明明这么快,websocket发送数据却延迟这么高? 具体开发环境为:小程序开发PC和服务端PC在同一个局域网,连接同一个路由器;微信小程序真机调试使用iPhone6S,iPhone6S没有插SIM卡,使用wifi连接同一个路由器。 调试基础库试过2.0.4和2.3.0。 附上测试代码: [代码]Page({[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]socketTask: [代码][代码]null[代码][代码],[代码][代码] [代码][代码]data: [代码][代码]'123'[代码][代码] [代码][代码]},[代码][代码] [代码][代码]onLoad: [代码][代码]function[代码] [代码]() {[代码][代码] [代码][代码]},[代码][代码] [代码][代码]openConnect: [代码][代码]function[代码] [代码]() {[代码][代码] [代码][代码]let that = [代码][代码]this[代码][代码];[代码][代码] [代码][代码]let socketTask = wx.connectSocket({[代码][代码] [代码][代码]url: [代码][代码]'ws://192.168.1.10:10002'[代码][代码],[代码][代码] [代码][代码]success: [代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"建立连接成功"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]},[代码][代码] [代码][代码]fail: [代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"建立连接失败"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]});[代码][代码] [代码][代码]socketTask.onOpen([代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"连接打开"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]});[代码][代码] [代码][代码]socketTask.onClose([代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"连接关闭"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]});[代码][代码] [代码][代码]socketTask.onError([代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"连接错误"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]});[代码][代码] [代码][代码]socketTask.onMessage([代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"服务端返回消息"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]that.sendMsg();[代码][代码] [代码][代码]});[代码][代码] [代码][代码]this[代码][代码].data.socketTask = socketTask;[代码][代码] [代码][代码]},[代码][代码] [代码][代码]closeConnect: [代码][代码]function[代码] [代码]() {[代码][代码] [代码][代码]let socketTask = [代码][代码]this[代码][代码].data.socketTask;[代码][代码] [代码][代码]if[代码] [代码](socketTask) {[代码][代码] [代码][代码]socketTask.close({[代码][代码] [代码][代码]success: [代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"关闭接口成功"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]},[代码][代码] [代码][代码]fail: [代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"关闭接口失败"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]});[代码][代码] [代码][代码]}[代码][代码] [代码][代码]},[代码][代码] [代码][代码]sendMsg: [代码][代码]function[代码] [代码]() {[代码][代码] [代码][代码]let value = [代码][代码]this[代码][代码].data.data;[代码][代码] [代码][代码]console.log([代码][代码]"尝试发送消息:"[代码] [代码]+ value);[代码][代码] [代码][代码]let socketTask = [代码][代码]this[代码][代码].data.socketTask;[代码][代码] [代码][代码]if[代码] [代码]([代码][代码]this[代码][代码].data.socketTask) {[代码][代码] [代码][代码]socketTask.send({[代码][代码] [代码][代码]data: value,[代码][代码] [代码][代码]success: [代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"发送消息成功"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]},[代码][代码] [代码][代码]fail: [代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"发送消息失败"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]});[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码]})[代码]
2018-10-12