跳到主要内容

关于本地通知

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

提示
  • 当 App 刚进入后台时, App 处于后台活跃状态,SDK 通过长连接通道接收消息,此时 SDK 收到消息会触发消息接收监听。您可以在收到消息监听通知时弹出本地通知。关于消息监听器的说明,详见接收消息
  • App 进入后台,SDK 的长连接最多存活 2 分钟,超时会主动断开。断开后如有消息会通过 APNs 推送通道推送通知。

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

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

IMKit SDK 持有一个全局的 NSDictionary 数据表,用于缓存查询过的会话的免打扰信息,如果内存中查询失败,会执行一次数据库查找并更新全局数据表。包含如下:

  • RCMessageNotificationHelper:消息通知状态辅助查询工具类
  • RCIMNotificationDataContext:会话免打扰数据上下文
  • RCIMThreadLock:读写锁

调用 RCMessageNotificationHelper 下的 checkNotifyAbilityWith 方法,查询该消息是否需要显示本地通知。 showYES 时,表示正常发送当前消息的本地通知;否则不发送本地通知。

/// 验证消息是否可以通知
/// @param message 消息
/// @param completion 回调
+ (void)checkNotifyAbilityWith:(RCMessage *)message
completion:(void (^)(BOOL show))completion;

IMkit 仅在发送本地通知时对会话的免打扰级别进行判断,因此在 RCIM 类的 postLocalNotificationIfNeed 方法中完成。代码示例如下:

- (void)postLocalNotificationIfNeed:(RCMessage *)message {
...
if (message.conversationType == ConversationType_Encrypted) {
[RCMessageNotificationHelper checkNotifyAbilityWith:message completion:^(BOOL show) {
if (show) {
....
}
}];
} else {
[RCMessageNotificationHelper checkNotifyAbilityWith:message completion:^(BOOL show) {
if (show) {
[[RCLocalNotification defaultCenter] postLocalNotificationWithMessage:message
userInfo:dictionary];

}
}];
}
...
}

IMLib 中,您可以在接收消息的回调中(onRCIMReceiveMessage)调用 checkNotifyAbilityWith 方法,查询接收到的消息是否需要显示本地通知。

- (void)onRCIMReceiveMessage:(RCMessage *)message left:(int)left {
[RCDMessageNotificationHelper checkNotifyAbilityWith:message completion:^(BOOL show) {
if (show) {
NSLog(@"[RC] Show");
} else {
NSLog(@"[RC] Hide");
}
}];
}

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