最近小程序中有使用到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通知处理就完成了,欢迎各位大佬评论