This commit is contained in:
15
utils/notify.js
Normal file
15
utils/notify.js
Normal file
@@ -0,0 +1,15 @@
|
||||
export function showNotification(title, content, extraData = {}) {
|
||||
// App-Plus 平台
|
||||
if (typeof plus !== 'undefined' && plus.push) {
|
||||
plus.push.createMessage(content, extraData, function(result){
|
||||
|
||||
});
|
||||
} else {
|
||||
// H5 或其他平台,可以用 alert / toast 代替
|
||||
uni.showToast({
|
||||
title: content,
|
||||
icon: 'none',
|
||||
duration: 3000
|
||||
})
|
||||
}
|
||||
}
|
115
utils/websocket.js
Normal file
115
utils/websocket.js
Normal file
@@ -0,0 +1,115 @@
|
||||
class WebSocketService {
|
||||
constructor() {
|
||||
this.socketTask = null
|
||||
this.isConnected = false
|
||||
this.heartbeatTimer = null
|
||||
this.reconnectTimer = null
|
||||
this.url = ""
|
||||
this.dispatchHandler = null // 统一分发处理器
|
||||
}
|
||||
|
||||
connect(url) {
|
||||
if (this.isConnected) return
|
||||
this.url = url
|
||||
|
||||
this.socketTask = uni.connectSocket({
|
||||
url: url, // 鉴权
|
||||
success: () => console.log("连接请求已发送")
|
||||
})
|
||||
|
||||
// this.socketTask = uni.connectSocket({ url })
|
||||
console.log('WebSocketService', 'connect called, url:', url)
|
||||
|
||||
// 注意:跨平台统一使用 socketTask 的事件监听
|
||||
if (this.socketTask) {
|
||||
this.socketTask.onOpen(() => {
|
||||
console.log("WebSocket 已连接")
|
||||
this.isConnected = true
|
||||
this.startHeartbeat()
|
||||
})
|
||||
|
||||
this.socketTask.onMessage((res) => {
|
||||
console.log("📩 收到消息:", res.data)
|
||||
let msg
|
||||
try {
|
||||
msg = JSON.parse(res.data)
|
||||
} catch (e) {
|
||||
msg = res.data
|
||||
}
|
||||
|
||||
// 统一分发
|
||||
if (this.dispatchHandler) {
|
||||
this.dispatchHandler(msg)
|
||||
} else {
|
||||
console.warn("未注册 dispatchHandler,消息未处理:", msg)
|
||||
}
|
||||
})
|
||||
|
||||
this.socketTask.onClose(() => {
|
||||
console.log("❌ WebSocket 已关闭")
|
||||
this.isConnected = false
|
||||
this.reconnect()
|
||||
})
|
||||
|
||||
this.socketTask.onError((err) => {
|
||||
console.error("⚠️ WebSocket 错误:", err)
|
||||
this.isConnected = false
|
||||
this.reconnect()
|
||||
})
|
||||
} else {
|
||||
console.error("WebSocketService: socketTask 获取失败,可能平台不支持")
|
||||
}
|
||||
}
|
||||
|
||||
send(data) {
|
||||
if (this.isConnected && this.socketTask) {
|
||||
this.socketTask.send({
|
||||
data: typeof data === "string" ? data : JSON.stringify(data),
|
||||
})
|
||||
console.log('WebSocketService', 'send:', data)
|
||||
}
|
||||
}
|
||||
|
||||
startHeartbeat() {
|
||||
console.log('WebSocketService', 'startHeartbeat')
|
||||
this.clearHeartbeat()
|
||||
this.heartbeatTimer = setInterval(() => {
|
||||
if (this.isConnected) {
|
||||
this.send("ping")
|
||||
console.log('WebSocketService', 'heartbeat ping sent')
|
||||
}
|
||||
}, 30000)
|
||||
}
|
||||
|
||||
clearHeartbeat() {
|
||||
if (this.heartbeatTimer) {
|
||||
clearInterval(this.heartbeatTimer)
|
||||
this.heartbeatTimer = null
|
||||
}
|
||||
}
|
||||
|
||||
reconnect() {
|
||||
if (this.reconnectTimer) return
|
||||
console.log("⏳ 5秒后尝试重连...")
|
||||
this.reconnectTimer = setTimeout(() => {
|
||||
this.connect(this.url)
|
||||
this.reconnectTimer = null
|
||||
}, 5000)
|
||||
}
|
||||
|
||||
close() {
|
||||
this.clearHeartbeat()
|
||||
if (this.socketTask) {
|
||||
this.socketTask.close()
|
||||
this.socketTask = null
|
||||
}
|
||||
this.isConnected = false
|
||||
console.log('WebSocketService', 'close called')
|
||||
}
|
||||
|
||||
setDispatchHandler(handler) {
|
||||
this.dispatchHandler = handler
|
||||
}
|
||||
}
|
||||
|
||||
export default new WebSocketService()
|
Reference in New Issue
Block a user