关于本地通知
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 的方案,自行实现相关业务逻辑。
-
IMKit 在初始化时,内部会调用
setPushNotifyLevelListener
,设置通知级别监听器,监听通知级别变化。MessageNotificationHelper.setPushNotifyLevelListener();
-
IMKit 在初始化时,内部调用
setNotifyListener(notifyListener)
决定本地通知是否需要通知。void setNotifyListener(NotifyListener notifyListener);
interface NotifyListener {
void onPreToNotify(Message message);
} -
设置会话状态同步监听。在会话状态改变时,调用
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); //设置监听器 -
调用
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);
}
}
}); -
在
NotifyListener
触发onPreToNotify
时决定是否需要弹出本地通知。interface NotifyListener {
void onPreToNotify(Message message);
}本地通知判断逻辑:消息配置(1) > 用户应用全局 (2) > 用户指定群组频道(3) > 用户指定群 (4)> 用户会话类型(5)> 超级群默认配置 (6)