Tutorial: 常见问题(Web & 小程序)

常见问题(Web & 小程序)

常见问题(Web & 小程序)


文档

1. 请问有在线的 Demo 和 SDK 手册吗?

小程序 Demo 小程序 Demo

Web Demo

SDK 手册

2. 请问在看哪里看小程序 SDK 的变更情况?

变更日志(Web & 小程序)

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-sdk.jsnode_modules/tim-wx-sdk/tim-wx-sdk.js 拷贝到您项目的 src 目录下,并在配置文件中配置(更详细的请参考 编译配置详情)。 示例如下:

weapp: {
  compile: {
    exclude: ['src/tencent-webim/tim-wx-sdk.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. 我想在音视频聊天室实现点赞,送鲜花的功能,请问该怎么办?

可以通过 createCustomMessagesendMessage 接口实现。

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.thenPromise.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