消息服务总类
| 方法 | 方法描述 |
|---|---|
| VHSaaSDK.getInstance().sendMessage | 发送聊天消息 |
| VHSaaSDK.getInstance().sendMessageToTarget | 给指定用户发送消息 |
| VHSaaSDK.getInstance().sendTypeMessage | 发送图片等类型消息 |
消息回调
| 方法 | 方法描述 |
|---|---|
| imReceiveChatMessage | 接收聊天消息 |
| imReceiveOnlineMessage | 接收上下线消息 |
| imReceiveCustomMessage | 接收自定义消息 |
| imReceiveRoomMessage | 接收房间消息 |
| imSDKError | 错误回调 |
| onVHNetworkConnect | 消息服务连接成功 |
| onVHNetworkDisconnect | 监听消息服务异常监听 |
| onVHNetworkConnecting | 消息服务连接正在重新链接 |
aboutToAppear(){
...
this.imBase = new VHIMServer(this);//创建im实例
this.imBase.join(this.webinar_info!);//设置消息回调
...
}
| VHIMMessageModel消息体 | 类型 | 描述 |
|---|---|---|
| msg_id | string | 消息ID |
| channel | string | 频道ID |
| event | string | 消息事件类型 |
| date_time | string | 时间 |
| third_party_user_id | string | 发送者三方用户id |
| connection_online_num | number | 连线人数 |
| user_online_num | number | 在线人数 |
| client | string | 客户 |
| dataJson | string | data数据 |
| avatar | string | 发送者头像 |
| nick_name | string | 发送者昵称 |
| service_type | string | 服务类型 |
| sender_id | string | 发送者id |
| context | string | 发送的自定义消息 |
| pv | number | 直播中观看次数 |
| uv | number | 直播中观看人数 |
| bu | number | 业务单元 |
| key | string | 关键字 |
| data | object | 消息体 |
对应VHIMMessageModel转换为VHContent
| VHContent | 类型 | 描述 |
|---|---|---|
| avatar | string | 头像 |
| nickname | string | 昵称 |
| data | VHMsgData | 消息体 |
| date_time | string | 时间 |
| image_urls | string | 图片资源 |
| role_name | string | 角色 1 主持人,2 观众,3 助理,4 嘉宾 |
| msg_id | string | 消息id |
对应VHIMMessageModel.data消息内容
| VHMsgData消息内容 | 类型 | 描述 |
|---|---|---|
| type | string | 消息类型,text 文本 image 图片 |
| barrage | string | 消息内容 |
| text_content | string | 消息内容 |
| nickname | string | 昵称 |
| avatar | string | 头像 |
| image_urls | string | 聊天图片列表 |
| event_type | string | 站点类型 |
| target_id | string | 目标id,用于私聊 |
this.imBase.sendMessage(this.messageInput, {
onSuccess: () => {
console.log("消息发送成功");
this.messageInput = '';
// 收起软键盘
this.hideSoftInputMethod(this.getUIContext());
// 5. 延迟滚动到最新消息(确保UI已更新)
setTimeout(() => {
this.scrollToBottom();
}, 100);
},
onFailure(errorCode: number, errorMsg: string) {
// 弹出消息信息
ToastUtil.showToast("发送消息失败");
}
});imReceiveRoomMessage 包含:礼物消息、禁言、聊天昵称加密、删除聊天消息等
imReceiveRoomMessage(type: string, message: VHIMMessageModel) {
console.log("接收房间消息:", message);
if (type == VHRoomEventType.GIFT_MSG) { // 礼物消息
EmitterMessage.handleGiftMsg(message);
}else if(type == VHRoomEventType.IM_BANNED_MODE_UPDATE){//禁言感知状态
this.handleBannedModeUpdate( message);
}else if(type == VHRoomEventType.IM_CHAT_NICK_NAME_ENCRYPTION){//聊天昵称加密
this.handleChatNicknameEncryption( message);
} else if(type == VHRoomEventType.CHAT_DELETE){ //删除聊天消息
EmitterMessage.handleChatDelete(message);
}
}imReceiveOnlineMessage
onVHNetworkDisconnect
onVHNetworkDisconnect(code: number, message: string): void {
ToastUtil.showToast("消息服务已断开")
if (this.imConnectTimer != -1) {
return;
}
//启用定时器进行重连。
this.imConnectTimer = setTimeout(() => {
//重连只需要重新调用join方法
this.imBase?.join(this.webinar_info!);
this.imConnectTimer = -1;
}, RECONNECT_TIMEOUT);
}imReceiveChatMessage
imReceiveChatMessage(type: string, message: VHIMMessageModel) {
if (type === VHRoomEventType.IM_TEXT) {
let newMsg = message as VHContent;
if (newMsg.data!.target_id !== undefined && newMsg.data!.target_id.length > 0) {
// 如果是私聊消息,需要产生tab
this.addPrivateChatTab(JSON.stringify(message));
EmitterMessage.handleChatImText(type, message);
} else {
EmitterMessage.handleChatImText(type, message);
}
}
// 点赞消息
if (type === VHRoomEventType.CUSTOM_PRAISE) {
EmitterMessage.handleCustomMessage(type, message);
}
}imReceiveCustomMessage(type: string, message: VHIMMessageModel) {
// 清空聊天消息
if (type === VHRoomEventType.CLEAR_CHAT_MESSAGE) {
EmitterMessage.handleCustomMessage(type, message);
}
}当应用退到后台为了保持消息服务的长链接,需要为应用申请后台长时任务否则系统会挂起消息服务长连接,否则消息影响在线状态。
参考:HarmonyOS 长时任务实现