跳到主要内容

关于本地通知

IMLib 未实现本地通知功能,需要您的 App 自行实现本地通知。

提示
  • 当 App 刚进入后台时, App 处于后台活跃状态,SDK 通过长连接通道接收消息,此时 SDK 收到消息会触发消息接收监听。您可以在收到消息监听通知时弹出本地通知。关于消息监听器的说明,详见接收消息
  • App 进入后台如果被系统杀死,SDK 会在断开连接后通过推送通道推送通知。

由于超级群产品本身的业务特性,App 可能需要配合免打扰级别(详见超级群免打扰功能概述)功能,实现精细化的本地通知控制策略。当前 IMLib SDK 获取免打扰的 API 是异步的,每次都从数据库中获取,可能会造成一定延迟,无法满足部分 App 对本地通知处理的要求。如果您希望实现从内存中获取免打扰级别数据,可以参考融云 IMKit SDK 中的实现方案。

IMKit 提供一个获取免打扰级别核心类 io.rong.imkit.notification/MessageNotificationHelper,该类负责将免打扰级别存储在内存中,避免每次从数据库中获取的开销。

以下简述了 IMKit SDK 的实现方案,相关代码可见 IMKit 开源工程GitHub · Gitee)。我们建议您参考 IMKit 的方案,自行实现相关业务逻辑。

  1. IMKit 在初始化时,内部会调用 setPushNotifyLevelListener,设置通知级别监听器,监听通知级别变化。

    MessageNotificationHelper.setPushNotifyLevelListener();
  2. IMKit 在初始化时,内部调用 setNotifyListener(notifyListener) 决定本地通知是否需要通知。

    void setNotifyListener(NotifyListener notifyListener)

    interface NotifyListener {
    void onPreToNotify(Message message);
    }
  3. 设置会话状态同步监听。在会话状态改变时,调用 MessageNotificationHelper.updateLevelMap 更新会话的免打扰级别,保存在内存中。

    //同步监听器
    IRongCoreListener.ConversationStatusListener listener = new RongIMClient.ConversationStatusListener() {
    @Override
    public void onStatusChanged(ConversationStatus[] conversationStatuses) {
    if (conversationStatuses == null) {
    return;
    }

    for (ConversationStatus status : conversationStatuses) {
    Conversation.ConversationType conversationType = status.getConversationType(); //获取会话类型
    String targetId = status.getTargetId(); //获取会话 Id
    // TODO 从本地获取 conversation
    // 保存会话的免打扰级别到内存中
    MessageNotificationHelper.updateLevelMap(conversation);

    }
    }
    };
    RongCoreClient.getInstance().setConversationStatusListener(listener); //设置监听器
  4. 调用 MessageNotificationHelper.getNotificationQuietHoursLevel(callback) 查询用户应用全局免打扰设置。IMKit 内部会按照用户应用全局 (2) > 用户指定群组频道(3) > 用户指定群 (4)> 用户会话类型(5)> 超级群默认配置 (6) 依次进行查询,是否需要通知,示例代码如下:

    MessageNotificationHelper.getNotificationQuietHoursLevel(
    new RongIMClient.GetNotificationQuietHoursCallback() {
    @Override
    public void onSuccess(String startTime, int spanMinutes) {
    if (callback != null) {
    callback.onSuccess(startTime, spanMinutes);
    }
    }

    @Override
    public void onError(RongIMClient.ErrorCode errorCode) {
    if (callback != null) {
    callback.onError(errorCode);
    }
    }
    });

  5. NotifyListener 触发 onPreToNotify 时决定是否需要弹出本地通知。

    interface NotifyListener {
    void onPreToNotify(Message message);
    }

    本地通知判断逻辑:消息配置(1) > 用户应用全局 (2) > 用户指定群组频道(3) > 用户指定群 (4)> 用户会话类型(5)> 超级群默认配置 (6)