消息相关问题

最近更新时间:2019-08-02 19:02:49

消息没有收到或消息丢失如何处理?

  • 单聊消息
    • 确认消息是否发送成功。
    • 确认接收方是否登录成功。
    • 确认发送消息的指定会话是否与接收方一致。
  • 群组消息
    • 确认消息是否发送成功。
    • 确认接收方是否登录成功。
    • 确认接收方是否是群成员。

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

  1. 确认是否注册了消息监听器。
  2. 确认发送方发送消息的时候,是否把elem添加到消息中了(发消息的时候需要检查addElement的返回值)。
  3. Android 的需要确认是否注册了多个消息监听器,并且在消息监听器中返回了true

收不到离线推送怎么处理?

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

    • 确认是否正确上传证书到腾讯云控制台。
    • 确认在登录成功后,是否成功上传 token 到腾讯云。
    • 确认在上报 token 时,是否上报了正确的证书 ID。
    • 确认是否正确上报了切前后台事件。
    • 确认消息是否只有 TIMCustomElem,且其中的 desc属性是空的。
    • MsgRandom 等去重标记设为一样,导致被去重无法推送。
    • 如果是群消息,是否设置了消息不提醒选项。
  • Android
    参考 离线推送 说明文档进行以下确认:

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

不管是 APNs 推送还是 Android 上的离线推送,在以上步骤无法确认问题时,需要继续确认以下情况:

  1. 确认接收方 ID 是否与消息要推送的用户 ID 一致。
  2. 确认是否设置了离线推送监听器(Android)。
  3. 确认是否设置了免打扰,iOS 参考 设置自己的推送声音,Android 参考 设置全局离线推送配置
  4. 确认消息是否是通过 sendOnlineMessage 接口发送的在线消息,或者通过 REST API 推送的时候设置了 MsgLifeTime0
  5. 确认消息是否设置了不进行离线推送的标识,iOS 参考 每条离线推送属性,Android 参考 设置单条消息的离线推送配置
  6. 若还是无法定位,可提供相关信息给技术人员进行排查。

群 @ 消息怎么处理?

群内 @ 消息与普通消息没有本质区别,仅是在被 @ 的人收到消息时,需要在 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 属性中。

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

红包消息怎么处理?

红包消息与 @ 消息类似,可以通过 TIMCustomElem 来实现。需要应用在 UI 上做相应的特殊处理,例如检查到当前消息为红包消息后,消息展示为红包的样式。
另外,红包消息作为重要消息,最好在发送消息的时候将其设置为高优先级消息,以最大程度保证消息在触达频率限制的情况下仍可以送达(目前群内消息默认限制频率40条/s, 单聊消息默认限制频率为5条/s)。

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

注意:

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

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

// 构建一条新的消息
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);

即时通信 IM 消息存储时长是多久?

  • 单聊/群聊消息默认保存7天,您可在 即时通信 IM 控制台 的应用配置中调整消息漫游时长,延长消息保存期限,延长消息漫游时长属于增值服务,具体计费说明请参考 价格说明
  • 图片、文件、语音仅保存7天,暂不支持延长,您可以通过接入腾讯云对象存储或保存在您本地的服务器自行管理,将资源 URL 地址放到即时通信 IM 自定义消息中发送即可。