本地通知问题排查

本地通知没有提示问题排查

什么是本地通知

具体可看 通知概念 - 融云即时通讯云|实时音视频

排查点

  • 1. 是否设置了 setOnReceiveMessageListener 监听, 并且 onReceived 方法返回的为 true。

        RongIM.setOnReceiveMessageListener(new RongIMClient.OnReceiveMessageListener() {
                  @Override
                  public boolean onReceived(Message message, 
                      return true;
                  }
              });
    

    如果 onReceived 方法返回值为 true 则是监听做了拦截, 则不会走通知逻辑。

  • 2. 发送的消息是否是自定义消息。

    如果是自定义消息, 则请查看自定义消息的 MessageTag 的注解是否设置了 flag 的值为 MessageTag.ISCOUNTED 或 MessageTag.ISPERSISTED) 。 以下面为例。

      @MessageTag(value = "RC:TxtMsg", flag = MessageTag.ISCOUNTED)
      @DestructionTag
      public class TextMessage extends MessageContent {
          ...
      }
    

    如果没有设置其中之一,则不会走通知逻辑。

  • 3. 是否设置消息拦截器

    设置代码如下:

      /**
       * 设置接收消息时的拦截器
       *
       * @param messageInterceptor 拦截器
       */
      public void setMessageInterceptor(new RongIM.getInstance().MessageInterceptor() {
              @Override
              public boolean intercept(final Message message) {
                     return true;
              }
          });
    

    如果设置了消息拦截器, 并且在 intercept() 方法中返回 true, 表示拦截此消息。 则不会走通知逻辑。

  • 4. 检查接收到的消息的 senderUserId 是否和当前用户的 id 相同。

    如果 id 相同, 则不会走通知逻辑。 自己不可发给自己。

  • 5. 查看当前接收的消息是否是属于聊天室会话类型的

    聊天室的消息目前不支持本地通知。

  • 6. 如果是自定义消息,请检查是否设置了自定义消息的 MessageProvider 。

    如果没有,则不会走通知逻辑。

  • 7. 接收方本地是否有接收方的用户信息。 如果没有设置, 则不会走通知逻辑。

  • 8. 检查应用权限设置

    看是否打开应用信任权限, 通知栏权限或者声音提示权限等。如果没有打开,请打开再试。

  • 9. 接收方没有发送方的用户信息,接收端不弹通知。

    用户信息通过用户信息提供者方式获取。参考链接:https://www.rongcloud.cn/docs/android.html#user_info

/**
 * <p>
 * 设置用户信息的提供者,供 RongIM 调用获取用户名称和头像信息。
 * 设置后,当 sdk 界面展示用户信息时,会回调 {@link io.rong.imkit.RongIM.UserInfoProvider#getUserInfo(String)}
 * 使用者只需要根据对应的 userId 提供对应的用户信息。
 * 如果需要异步从服务器获取用户信息,使用者可以在此方法中发起异步请求,然后返回 null 信息。
 * 在异步请求结果返回后,根据返回的结果调用 {@link #refreshUserInfoCache(UserInfo)} 刷新用户信息。
 * </p>
 *
 * @param userInfoProvider 用户信息提供者 {@link io.rong.imkit.RongIM.UserInfoProvider}。
 * @param isCacheUserInfo  设置是否由 IMKit 来缓存用户信息。<br>
 *                         如果 App 提供的 UserInfoProvider。
 *                         每次都需要通过网络请求用户数据,而不是将用户数据缓存到本地,会影响用户信息的加载速度;<br>
 *                         此时最好将本参数设置为 true,由 IMKit 来缓存用户信息。
 */
public static void setUserInfoProvider(UserInfoProvider userInfoProvider, boolean isCacheUserInfo)

SDK 会在须展示用户信息时回调 getUserInfo,如果接收端之前从未收到过发送端的消息,那么很可能缓存中没有发送端的用户信息,如果此时恰好处在后台,接收到发送端发来的消息就不会弹通知,目前机制如此。

排查时可以先看日志中有没有“onReceiveMessageFromApp. conversationType:”打印出来,如果有打印接着在 RongNotificationManager 类中跟踪 onReceiveMessageFromApp(Message message, int left) 这个方法,确认是否是由于 targetName 为空导致未触发 sendNotification。

其他

如果排除以上情况还无法,请您推出或卸载应用重新安装。 然后获取从应用第一次打开(融云 SDK初始化)到发送消息无法没有展示通知的操作的整个过程的完整 log, 注意不要过滤。 以便于我们工程师分析定位原因。