常见问题(Web & 小程序)
文档
1. 请问有在线的 Demo 和 SDK 手册吗?
小程序 Demo
2. 请问在看哪里看小程序 SDK 的变更情况?
3. WebIM v1.7.x 的文档下线了吗?
WebIM v1.7.x 的文档已从官网下线,在 github 存有备份。
框架集成
1. 用 Angular 开发项目,使用了 zone.js,集成 WebIM v2.x 为什么无法登陆?提示 'IMPromise.reject 必须指定code(错误码)和message(错误信息)!!!'
Angular 框架的 zone.js 修改原型链导致集成 SDK 出错。此问题已修复,请使用 v2.1.4 或更高版本。
2. 用 Taro 开发项目,集成 WebIM v2.x,为什么一直收不到 TIM.EVENT.SDK_READY 事件?
WebIM v2.x 不需要被 Taro 编译。如果您通过 npm i
的方式集成了 WebIM,请手动将文件 node_modules/tim-js-sdk/tim-js.js
或 node_modules/tim-wx-sdk/tim-wx.js
拷贝到您项目的 src 目录下,并在配置文件中配置(更详细的请参考 编译配置详情)。
示例如下:
weapp: {
compile: {
exclude: ['src/tencent-webim/tim-wx.js']
}
}
事件监听
1. 为什么调用 off 接口取消监听事件后,仍然能监听到 SDK 派发的事件?
对于同一个事件,如 TIM.EVENT.MESSAGE_RECEIVED,调用 on 接口监听事件和调用 off 接口取消监听事件,handler 参数应当指向同一个 function,避免以下写法:
// 注意!以下代码有 bug,无法取消监听 TIM.EVENT.MESSAGE_RECEIVED,因为 bind() 方法每次会返回一个新的函数
tim.on(TIM.EVENT.MESSAGE_RECEIVED, this.onMessageReceived.bind(this));
tim.off(TIM.EVENT.MESSAGE_RECEIVED, this.onMessageReceived.bind(this));
// 建议写法
tim.on(TIM.EVENT.MESSAGE_RECEIVED, onMessageReceived, this);
tim.off(TIM.EVENT.MESSAGE_RECEIVED, onMessageReceived);
bind() 方法的详细说明请参考 Function.prototype.bind()
2. 调用 logout 接口,SDK 会自动取消监听接入侧通过调用 on 接口已监听的事件吗?
不会。取消监听事件,需接入侧主动调用 off 接口。
登录
1. 登录时遇到 Err_TLS_Third_Sig_Check_Session_Key_Too_Long 的提示?
密钥问题导致生成的 UserSig 鉴权失败。请参考官网文档 生成 UserSig。
2. 登录时遇到 TypeError: wx.$app.ready is not a function?
请通过监听事件 TIM.EVENT.SDK_READY 代替直接使用 ready 函数,后者已经废弃。
3. 登录成功后不能发送消息,提示接口调用时机不合理?
请监听事件 TIM.EVENT.SDK_READY,待 SDK ready 后再调用发送消息等需要鉴权的接口。
收发消息
1. 小程序从哪个版本开始支持发语音消息? 从哪个版本支持发视频消息?
v2.1.1 支持发语音消息,v2.2.0 支持发语音、视频消息。
2. WebIM v1.7.x,偶尔遇到无法播放语音消息?
建议接入使用 WebIM v2.2.0 或更高版本,兼容 Native IM v3.x 发送的语音、文件消息。v1.7.x 存在较多问题。如果短时间内无法升级,请修改下 WebIM v1.7.x 代码:IM 后台返回的消息结构,当 Download_Flag 值为 0 时,客户端通过 uuid 获取 url;当 Download_Flag 值为 2 时,客户端可直接使用 url。
// WebIM v1.7.x 代码
Msg.Elem.Sound = function (uuid, second, size, senderId, receiverId, downFlag, chatType, url) {
this.uuid = uuid; //文件id
this.second = second; //时长,单位:秒
this.size = size; //大小,单位:字节
this.senderId = senderId; //发送者
this.receiverId = receiverId; //接收方id
this.downFlag = downFlag; //下载标志位
this.busiId = chatType == SESSION_TYPE.C2C ? 2 : 1; //busi_id ( 1:群 2:C2C)
if (downFlag == 0) {
this.downUrl = getSoundDownUrl(uuid, senderId, second); //下载地址
} else if (downFlag == 2 && url != null) {
this.downUrl = url;
}
}
3. WebIM v2.x 怎样拉取历史消息?没有 getC2CHistoryMsgs 接口了吗?
WebIM v2.x 没有 getC2CHistoryMsgs 接口,getMessageList 接口可用于"拉取历史消息"。
4. 我想在音视频聊天室实现点赞,送鲜花的功能,请问该怎么办?
可以通过 createCustomMessage 和 sendMessage 接口实现。
5. 已经用了最新版本的 WebIM,终端发送的视频消息,在 iOS 浏览器上无法播放?
请升级 Tuikit 至 4.5.111 或 更高版本。
6. 我的项目用的是 React,发图片消息总是失败?
请升级 SDK 版本至 2.0.11 或更高版本。
7. WebIM v2.x 和 WebIM v1.7.x 消息是互通的吗?
互通。如果条件允许,建议接入使用最新的 WebIM,获得更好的体验和维护。
8. WebIM v2.x 如何兼容 REST API 或 旧版 IM 发送的组合消息?
请升级 SDK 版本至 2.1.3 或更高版本。组合消息的内容存储在 Message 实例的 _elements 属性,接入侧需自主解析,解析请参考 消息格式。 非组合消息,请使用推荐做法:使用 Message 实例的 type 和 payload 属性。
9. 为什么 WebIM v2.x 调用 sendMessage 发消息成功后,未收到 TIM.EVENT.MESSAGE_RECEIVED 事件?
sendMessage 接口返回 Promise
,接入侧请通过 Promise.then
或 Promise.catch
处理发送消息成功或失败后的业务逻辑。
此时 SDK 不会派发 TIM.EVENT.MESSAGE_RECEIVED 事件,避免消息重复。
10. 通过 getMessageList 拉取到的消息列表和通过监听 TIM.EVENT.MESSAGE_RECEIVED 事件收到的消息合并后,发现有时会消息乱序,为什么?
接入侧维护会话的消息列表时,请注意保证消息入列的顺序正确,若消息列表从旧到新排列,则通过 getMessageList 拉取到的历史消息应该从头部入列,通过监听 TIM.EVENT.MESSAGE_RECEIVED 事件收到的实时消息应该从尾部入列。
群组
1. 调用 createGroup 接口创建音视频聊天室后,收不到消息?
调用 createGroup 接口创建音视频聊天室后,需调用 joinGroup 接口加入群组(必须带上类型 TIM.TYPES.GRP_AVCHATROOM),才能进行消息收发流程。
let promise = tim.joinGroup({ groupID: 'group1', type: TIM.TYPES.GRP_AVCHATROOM });
promise.then(function(imResponse) {
switch (imResponse.data.status) {
case TIM.TYPES.JOIN_STATUS_WAIT_APPROVAL: // 等待管理员同意
break;
case TIM.TYPES.JOIN_STATUS_SUCCESS: // 加群成功
console.log(imResponse.data.group); // 加入的群组资料
break;
case TIM.TYPES.JOIN_STATUS_ALREADY_IN_GROUP: // 已经在群中
break;
default:
break;
}
}).catch(function(imError){
console.warn('joinGroup error:', imError); // 申请加群失败的相关信息
});
2. 音视频聊天室怎么没有未读消息计数?为什么拉取不到历史消息?
已定的产品策略:音视频聊天室不支持未读消息计数,也不支持查看入群前历史消息,详细请参考 群组系统。
3. 可以同时加入两个或多个音视频聊天室吗?
目前不可以。同一用户同时只能加入一个音视频聊天室。【例如】用户已在音视频聊天室 A 中,再加入音视频聊天室 B,SDK 会先退出音视频聊天室 A,然后加入音视频聊天室 B。 详细请参考 joinGroup。
4. 获取群列表时,可以同时拿到每个群的群成员数量等信息吗?目前看只能获取到群类型、群名称、群头像等?
可以,请升级 SDK 版本至 2.1.2 或更高版本。详细请参考 getGroupList。