最近小程序中有使用到socket,来建立长连接,实现消息通知。总结一下实现思路。
首先,在app.js中初始化socket,并处理消息,添加心跳检测。
App({ globalData: { supplierId: null, socketUrl: null, // socketUrl timeout: 
10000, // 延迟 socketHeartTimer: null, callback: function () {}, // socket连接回调函数 
socketClientTimer: null, // socket连接定时器 isSocketConnect: false, // 当前socket是否连接 
}, onShow() { // 检查用户登录状态,并决定是否开启socket this.checkLoginUserSocket(); //判断是否登录 
连接socket this.globalData.socketClientTimer = setInterval(() => { // 
定时器---检查用户登录状态,并决定是否开启socket this.checkLoginUserSocket(); }, 30000) }, // 
小程序进入后台 onHide() { // 关闭全局socket状态连接定时器 
clearInterval(this.globalData.socketClientTimer) // 关闭socket 
this.closeSocketFunction() }, // 检查用户登录状态,并决定是否开启socket checkLoginUserSocket() 
{ this.globalData.supplierId = wx.getStorageSync('supplierId') || null; if 
(this.globalData.supplierId) { //登录状态下调用连接socket 且判断是否已经连接socket if 
(!this.globalData.isSocketConnect) { // console.log("-----用户一登录---连接socket") 
this.connectSocketFunciton() } } else { // console.log("-----用户未登录--关闭socket") 
//未登录状态下清除定时器关闭socket this.closeSocketFunction() } }, //小程序连接socket 
connectSocketFunciton() { var that = this var socketUrl = 
`wss://192。168.1.33/wss/websocket/${that.globalData.supplierId}` 
wx.connectSocket({ url: socketUrl, success: (res => { // 标识socket已连接 
that.globalData.isSocketConnect = true // 初始化连接监听 that.initEventHandler() }), 
fail: (fail => {}) }) }, // 绑定监听 initEventHandler() { var that = this // 
socket连接开启 wx.onSocketOpen((result) => { // 开启心跳 that.startHeart() }) // 
socket连接关闭 wx.onSocketClose((res) => { if (that.globalData.isSocketConnect) { 
that.connectSocketFunciton() } }) // 接收socket消息 wx.onSocketMessage((res) => { 
console.log("onSocketMessage", res) //第一次消息如果为init就绑定uid // var data = 
JSON.parse(res.data) //这里data可以根据后端返回的数据做一些处理 根据自己的需求做出对应的处理 // 
全局socket接收消息的方法回调 that.globalData.callback(res) }) }, //发送心跳 startHeart() { if 
(this.globalData.isSocketConnect) { this.globalData.socketHeartTimer = 
setInterval(() => { wx.sendSocketMessage({ data: 'heartBath', success: function 
(res) {}, fail: function (res) {} }) }, 45 * 1000) } else { 
clearTimeout(this.globalData.socketHeartTimer) } }, //此页面关闭socket和定时器的函数 
closeSocketFunction: function () { if (this.globalData.isSocketConnect) { // 
标识socket已断开 this.globalData.isSocketConnect = false // 关闭socket连接 
wx.closeSocket() // 关闭socket心跳定时器 
clearInterval(this.globalData.socketHeartTimer) } }, }) 
然后再接收到消息时添加回调方法:
// 接收socket消息 wx.onSocketMessage((res) => { console.log("onSocketMessage", 
res) //第一次消息如果为init就绑定uid // var data = JSON.parse(res.data) 
//这里data可以根据后端返回的数据做一些处理 根据自己的需求做出对应的处理 // 全局socket接收消息的方法回调 
that.globalData.callback(res) }) 
然后再需要进行通知处理的页面添加如下代码:
onShow() { this.onSoekctCallback(); }, // 收到消息处理 onSoekctCallback: function () 
{ app.globalData.callback = (res) => { console.log("获取到消息了", res.data); if 
(res.data === 'success' || res.data === 'heartBath') return let { supplierId } 
= this.data; this.onRequireNoticeList(supplierId); } }, 
最后,小程序的socket通知处理就完成了,欢迎各位大佬评论