//app.js
App({
globalData: {
userInfo: null,
socketUrl: "wss:.....", //socketUrl
//延迟
timeout: 10000,
socketHeartTimer: null,
//socket连接回调函数
callback: function () {},
//socket连接定时器
socketClientTimer: null,
//当前socket是否连接
isSocketConnect: false
},
//建议在这做全局登录标识 是否已经登录决定是否onShow中是否调用连接
onLaunch: function () {},
//生命周期onShow中调用socket连接
onShow: function () {
//此处可以根据登录状态判断是否调用连接socket
// 连接socket
// 检查用户登录状态,并决定是否开启socket
this.checkLoginUserSocket();
//判断是否登录 连接socket
this.globalData.socketClientTimer = setInterval(() => {
// 定时器---检查用户登录状态,并决定是否开启socket
this.checkLoginUserSocket();
}, 30000)
},
// 检查用户登录状态,并决定是否开启socket
checkLoginUserSocket: function () {
if ("已经登录状态下根据情况判断") {
//登录状态下调用连接socket 且判断是否已经连接socket
if (!this.globalData.isSocketConnect) {
// console.log("-----用户一登录---连接socket")
this.connectSocketFunciton()
}
} else {
// console.log("-----用户未登录--关闭socket")
//未登录状态下清除定时器关闭socket
this.closeSocketFunction()
}
},
// 小程序进入后台
onHide: function () {
// 关闭全局socket状态连接定时器
clearInterval(this.globalData.socketClientTimer)
// 关闭socket
this.closeSocketFunction()
},
//小程序连接socket
connectSocketFunciton: function () {
var that = this
var socketUrl = this.globalData.socketUrl
wx.connectSocket({
url: socketUrl,
success: (res => {
// 标识socket已连接
that.globalData.isSocketConnect = true
// 初始化连接监听
that.initEventHandler()
}),
fail: (fail => {})
})
},
// 绑定监听
initEventHandler: function () {
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")
console.log(res)
//第一次消息如果为init就绑定uid
var data = JSON.parse(res.data)
//这里data可以根据后端返回的数据做一些处理 根据自己的需求做出对应的处理
// 全局socket接收消息的方法回调
that.globalData.callback(res)
})
},
//发送心跳
startHeart: function () {
if (this.globalData.isSocketConnect) {
this.globalData.socketHeartTimer = setInterval(() => {
var msg = JSON.stringify({
'data': 'ping'
})
wx.sendSocketMessage({
data: msg,
success: function (res) {},
fail: function (res) {}
})
}, 10000)
} 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)
}
}
})
//在外面调用的方式
onLoad:function(){
this.onSoekctCallback()
},
//根据需求对data做出自己的处理
onSoekctCallback: function () {
var that = this
app.globalData.callback = function (res) {
var data = JSON.parse(res.data)
}
},