在 UniApp 中实现实时活动功能,通常需要结合 WebSocket 或第三方云服务(如 UniPush)来保持数据的实时同步。以下是两种常见实现方案:
方案一:使用 WebSocket(适合自建后端)
-
后端搭建 WebSocket 服务
使用 Node.js(Socket.io)、Java(Spring WebSocket)等框架搭建服务端,并部署到服务器。
-
UniApp 客户端连接 WebSocket
在页面中初始化 WebSocket,监听服务器推送的活动状态变化:
export default {
data() {
return {
socketTask: null,
activityData: {}
}
},
onLoad() {
this.initWebSocket();
},
methods: {
// 初始化 WebSocket 连接
initWebSocket() {
this.socketTask = uni.connectSocket({
url: 'ws://your-server-ip:port',
success: () => {
console.log('WebSocket 连接成功');
}
});
// 接收服务器消息
this.socketTask.onMessage((res) => {
this.activityData = JSON.parse(res.data);
});
// 监听连接关闭
this.socketTask.onClose(() => {
console.log('WebSocket 已断开');
});
},
// 发送消息到服务器(例如参与活动)
sendAction(data) {
this.socketTask.send({
data: JSON.stringify(data)
});
}
},
onUnload() {
// 页面关闭时断开连接
if (this.socketTask) {
this.socketTask.close();
}
}
}
-
后端推送逻辑示例(Node.js + Socket.io)
const io = require('socket.io')(3000);
io.on('connection', (socket) => {
// 推送活动初始数据
socket.emit('activityUpdate', { status: 'ongoing', participants: 50 });
// 监听客户端动作
socket.on('userAction', (data) => {
// 处理逻辑后广播给所有用户
io.emit('activityUpdate', { status: 'updated', participants: 51 });
});
});
方案二:使用 UniPush(免开发后端,依赖 UniCloud)
-
开通 UniPush 服务
在 UniApp 项目中启用 UniPush,并配置厂商通道(华为、小米等)。
-
客户端监听推送消息
export default {
onLaunch() {
// 监听推送消息
uni.onPushMessage((res) => {
const payload = res.data; // 活动数据
this.updateActivity(payload);
});
},
methods: {
updateActivity(data) {
// 更新活动页面数据
uni.$emit('activityUpdate', data);
}
}
}
-
服务端通过 UniCloud 发送推送
使用 UniCloud 云函数调用 UniPush API:
const uniPush = require('uni-push');
exports.main = async (event) => {
await uniPush.sendMessage({
"push_clientid": "设备标识",
"title": "活动更新",
"content": "有新用户参与活动!",
"payload": { "type": "activity", "participants": 60 }
});
};
注意事项
- 心跳机制:WebSocket 需定期发送心跳包维持连接(例如每 30 秒一次)。
- 重连逻辑:网络异常时自动重连 WebSocket。
- 性能优化:高频数据需节流(如使用
uni.$emit 限频更新界面)。
- 跨平台适配:测试 Android/iOS 及不同厂商推送通道的兼容性。
根据需求选择方案:自建服务用 WebSocket(灵活可控),快速上线用 UniPush(省去后端开发)。