指导说明



常见问题排查

发布时间:2018年6月22日 更新时间:2018年6月22日 贡献者:jasonxiao

收到群消息没有昵称

检查用户是否设置昵称

不登录TIM,有没有接口可以拿到列表、消息这些本地数据?

通过接口initStorage可以拿到。

消息没有收到或消息丢失

C2C消息

  1. 确认消息是否发送成功
  2. 确认接收方是否登录成功
  3. 确认发送消息是指定的会话是否与接收方一致

群组消息

  1. 确认消息是否发送成功
  2. 确认接收方是否登录成功
  3. 确认接收方是否是群成员

最后,不管是C2C消息还是群消息,在以上步骤无法确认问题的时候,需要继续确认以下情况:

  1. 确认是否注册了消息监听器
  2. 确认发送方发送消息的时候,是否把elem添加到消息中了(发消息的时候需要检查addElement的返回值)
  3. Android的需要确认是否注册了多个消息监听器,并且在消息监听器中返回了true
  4. 以上步骤都无法确认问题的话,可以让用户提供日志或者自行捞取日志,结合 日志格式说明 来看下客户端有没有收到消息,收到消息的话,走到了哪一个步骤

群@消息

群内 @ 消息与普通消息没有本质区别,仅是在被 @ 的人在收到消息时,需要在UI上做特殊处理,例如QQ的消息列表中会有标红提示。具体实现可以参考以下方案:

  • 1 在发送消息时监听键盘事件,是否输入了 @ 字符,当检测到发送方输入了 @ 字符时,在UI上弹出群成员列表,以供发送方选择需要 @ 的人,假设被选到的用户为 user1
  • 2 选择完需要被 @ 的人后,在消息输入框里添加上 @ 及被选中的人的id, 例如 "@user1"
  • 3 在消息中添加一个 TIMCustomElem , 并在 TIMCustomElem 里添加自己设计的标识该消息为 @ 消息的消息协议。

    一个简单的协议定义可以如下:

      {
          "type":"REMIND",
          "target":"user1"
      }
    

    @消息的构建过程示例代码如下(以android平台为例):

    
      // 发送一条文本消息,并在消息中 @ 群成员 user1
      TIMMessage msg = new TIMMessage();
    
      //构建文本消息元素体
      TIMTextElem txtElem = new TIMTextElem();
      txtElem.setText("@user1 nice to meet u");
      if(msg.addElement(txtElem) != 0){
          Log.e(TAG, "add text elem failed");
          return;
      }
    
      try{
          //填充自定义的消息协议
          JSONObject remindProto = new JSONObject();
          remindProto.put("type", "REMIND");
          remindProto.put("target", "user1");
    
          //根据自己定义的协议构建自定义消息元素
          TIMCustomElem customElem = new TIMCustomElem();
          customElem.setDesc("remind msg");
          customElem.setData(remindProto.toString().getBytes("utf-8");
          if(msg.addElement(customElem) != 0){
              Log.e(TAG, "add custom elem failed");
              return;
          }
      }catch(Exception e){
          Log.e(TAG, "build custom elem failed");
          return;
      }
    

    注: 其中 TIMTextElem 不是必须的,如果确认不需要进行脏字过滤的情况下,可以把 TIMTextElem 中的消息内容填到 TIMCustomElem 中的 desc 属性中。

  • 4 构建好消息后,发送到群里

  • 5 群里的成员接收到消息后,检查消息中的 TIMCustomElem 中的消息协议是否是 @ 消息协议。如果是, 则进行下一步处理,否则跳过
  • 6 判断被 @ 的人是否与当前登录用户一致,如果是,则在UI中进行特殊处理,否则不需要处理

红包消息

红包消息的话,与@消息类似,可以通过 TIMCustomElem 来实现。需要应用在UI上做相应的特殊处理,比如检查到当前消息为红包消息后,消息展示为红包的样式。

另外,红包消息作为重要消息,最好在发送消息的时候将其设置为高优先级消息,以最大程序保证消息在触达频率限制的情况下仍可以送达(目前群内消息默认限制频率为40条/s, 单聊消息默认限制频率为10条/s)。

关于消息优先级相关的内容可以参考 消息优先级

注:红包消息的支付部分功能,需要应用自行集成相应的支付SDK,ImSDK暂不提供这部分功能。

一个简单的红包消息的构建过程如下:

//构建一条新的消息
TIMMessage msg = new TIMMessage();
try{
    //填充自定义的消息协议
    JSONObject redPacket= new JSONObject();
    redPacket.put("type", "RED_PACKET");
    redPacket.put("amount", 2018);
    redPacket.put("msg", "Happy new year!");

    //根据自己定义的协议构建自定义消息元素
    TIMCustomElem customElem = new TIMCustomElem();
    customElem.setDesc("red packet");
    customElem.setData(redPacket.toString().getBytes("utf-8");
    if(msg.addElement(customElem) != 0){
        Log.e(TAG, "add custom elem failed");
        return;
    }
}catch(Exception e){
    Log.e(TAG, "build custom elem failed");
    return;
}

//设置消息优先级为高优先级
msg.setPriority(TIMMessagePriority.High);

收不到离线推送

APNs

  1. 确认是否按照 上传证书到控制台 正确上传证书到腾讯云控制台
  2. 确认在登录成功后,是否成功 上报token到腾讯云
  3. 确认是否正确上报了 切前后台事件
  4. 确认消息是否只有TIMCustomElem,且其中的desc属性是空的
  5. MsgRandom 等去重标记设为一样,导致被去重无法推送
  6. 对于更换证书的情况下新证书得在上传一个小时后生效

Android

参考 离线推送 说明文档进行以下确认:

  1. 确认是否正确上传了推送证书
  2. 确认是否成功上报token
  3. 如果不是第三方离线推送,确认一下QALService进程是否存活,不存活的情况下确实会收不到离线推送,需要依赖系统的自启动权限。
  4. 存在多进程的情况下,是否只在主进程进行了imsdk的初始化,如果不是,需要修改为只在主进程初始化
  5. 如果是第三方离线推送,比如小米、华为等,可以先让客户通过对应的第三方控制台直接推送消息看手机是否可以收到,如果收不到可能存在两种原因:1)用户集成第三方离线推送有问题,请按照文档操作。 2)手机兼容问题,该手机本身不能很好的兼容该离线推送,比如部分华为手机无法接收到华为的离线推送

不管是APNs推送还是Android上的离线推送,在以上步骤都确认OK的话,就可以继续按照以下步骤来进一步确认问题:

  1. 确认接收方ID是否与消息要推送的用户ID一致
  2. 确认用户设置了离线推送监听器(Android)
  3. 确认是否设置了免打扰, iOS参考 设置自己的推送声音, Android参考 设置全局离线推送配置
  4. 确认消息是否是通过 sendOnlineMessage 接口发送的是在线消息, 或者通过restApi推送的时候设置了lifetime为0
  5. 确认消息是否设置了不进行离线推送的标识,iOS参考 每条离线推送属性, Android 参考 设置单条消息的离线推送配置
  6. 可以重现的情况下,优先让用户提供sdkappid及userid,通过 推送后台染色 来确认消息是否已经成功推送到对应的第三方后台服务器
  7. 不可重现的话,可以找对应模块负责人查看后台日志来定位问题

清空消息记录

  1. Android文档
  2. IOS文档

getMessage:接口参数count可以填写CGFLOAT_MAX吗?

最好每次不超过20条。需要获取所有的消息可以通过调用REST API v4/group_open_http_svc/group_msg_get_simple

onNewMessage:回调不走

  1. 确认是否设置消息回调TIMMessageListener
  2. 确认是否关闭了最近联系人漫游
  3. 新消息监听设置尽量放较前的位置最好应用初始化SDK后就设置

获取好友关系链最后一条消息和未读消息,新加好友未读消息一直为0

对于添加好友不需要验证情况下添加的是没有未读消息数返回的,需要验证的情况下有返回

消息已读能否只针对某一条消息

SDK根据会话中最后一条阅读的消息,设置会话中之前的所有消息为已读,针对某条消息已读暂时不行

能不能在发送单聊消息时,模拟系统消息给用户下达通知

单聊不可以

websdk(小程序环境)长轮询的主要作用是? 关闭与开启是否可以操作?

长轮询是用来接收消息的,不能关闭,关闭了就接收不到消息

IM消息存储时长

  1. 默认情况下:单聊/群聊消息都是7天时长,可付费延长。
  2. 图片、文件、语音全部存储七天,无法延长,可以通过接入腾讯云对象存储来自行管理,将资源URL地址放到IM自定义消息中发送即可。
  3. 小视频分两种,一种是IM自带的,也是存储七天,无法延长,另一种是接入点播系统的,点播系统需要另付费,可自行管理。

发送单聊消息时:MsgRandom 随机数在什么范围内不能重复?

MsgRandom 用于消息去重,在七天内对于单个会话中不能重复

IM 发送的音频格式是什么?

发送的音频没有格式限制

IM 控制台上传两个不同app的证书,可否让这两个app同时收到聊天推送消息?

不行。一条消息只能对应一个sdkAppid+证书id组合

从离线通知点击进入app直接getMessage会出现消息遗漏,中间会少几条,之后

离线重新上线的时候会到后台同步消息,所以需要等收到onrefresh回调之后获取的消息才是精准

自定义消息能否过滤敏感词

IM自定义消息不支持敏感词过滤,对此建议用户采用组合消息发送。将需要过滤的消息封装到普通文本消息,不需要过滤的放到自定义消息中。

注意,一条组合消息中只能带一个TIMCustomElem自定义消息元素, 其它消息元素数量无限制。

//组合消息
//下述的单条消息中包括两个文本消息元素和一个表情元素,消息元素顺序是文本+表情+文本。

 {
    "MsgBody": [
        {
            "MsgType": "TIMTextElem", 
            "MsgContent": {
                "Text": "hello"
            }
        }, 
        {
            "MsgType": "TIMFaceElem", 
            "MsgContent": {
                "Index": 1, 
                "Data": "content"
            }
        }, 
        {
            "MsgType": "TIMTextElem", 
            "MsgContent": {
                "Text": "world"
            }
        }
    ]
}

会话列表最近联系人拉取限制

默认拉取最近联系人50条,超过的需要付费

results matching ""

    No results matching ""