系统通知

除IM会话内消息外,NIM SDK 还提供系统通知用于消息之外的通知分发。目前有两种类型:内置系统通知和自定义系统通知。

内置系统通知概述

内置系统通知主要分为 申请入群、拒绝申请入群、邀请入群、拒绝邀请入群 和 好友添加相关。由 SDK 负责接收和存储,并提供较简单的未读数管理。

内置系统通知由 NIMSystemNotification 表示。

原型

/**
 *  系统通知
 */
@interface NIMSystemNotification : NSObject
/**
 *  通知类型
 */
@property (nonatomic,assign,readonly)       NIMSystemNotificationType type;

/**
 *  时间戳
 */
@property (nonatomic,assign,readonly)       NSTimeInterval timestamp;

/**
 *  操作者
 */
@property (nullable,nonatomic,copy,readonly)         NSString *sourceID;

/**
 *  目标ID,群ID或者是用户ID
 */
@property (nullable,nonatomic,copy,readonly)         NSString *targetID;

/**
 *  附言
 */
@property (nullable,nonatomic,copy,readonly)         NSString *postscript;

/**
 *  是否已读
 *  @discussion 修改这个属性并不会修改db中的数据
 */
@property (nonatomic,assign)                BOOL read;

/**
 *  通知处理状态
 *  @discussion 修改这个属性,后台会自动更新db中对应的数据,SDK调用者可以使用这个值来持久化他们对通知的处理结果,默认为0
 */
@property (nonatomic,assign)                NSInteger handleStatus;


/**
 *  系统通知下发的自定义扩展信息
 */
@property (nullable,nonatomic,readonly)   NSString *notifyExt;

/**
 *  附件
 *  @discussion 额外信息,只有 好友添加。好友添加的 attachment 为 NIMUserAddAttachment
 */
@property (nullable,nonatomic,strong,readonly)       id attachment;

@end

参数列表

参数 类型 说明
type NIMSystemNotificationType 通知类型
timestamp NSTimeInterval 时间戳
sourceID NSString 操作者
targetID NSString 目标ID,群ID或者是用户ID
postscript NSString 附言
read BOOL 是否已读,修改这个属性并不会修改db中的数据
handleStatus NSInteger 通知处理状态
notifyExt NSString 系统通知下发的自定义扩展信息
attachment id 附件,额外信息,目前只有 好友添加,attachment 为 NIMUserAddAttachment

监听系统通知

先添加代理委托:

//NIMSystemNotificationManager.m
//全局监听
- (void)viewDidLoad {
    ...
    [[NIMSDK sharedSDK].systemNotificationManager addDelegate:self];
}

在以下回调里可以监听到系统通知:

@protocol NIMSystemNotificationManagerDelegate <NSObject>
@optional
/**
 *  监听系统通知回调
 *
 *  @param notification 系统通知
 */
-(void)onReceiveSystemNotification:(NIMSystemNotification *)notification;
@end

系统通知过滤器

在从客户端本地获取系统通知等情况下,可以设定过滤规则,过滤出部分类型的系统通知。

原型

@interface NIMSystemNotificationFilter : NSObject
/**
* 类型列表,取值范围为: NIMSystemNotificationType 枚举类型
*/
@property (nonatomic, copy) NSArray<NSNumber*> *notificationTypes
@end

获取系统通知

获取系统通知

@protocol NIMSystemNotificationManager <NSObject>
/**
 *  获取本地存储的系统通知
 *
 *  @param notification 当前最早系统通知,没有则传入nil
 *  @param limit        最大获取数
 *
 *  @return 系统通知列表
 */
- (NSArray *)fetchSystemNotifications:(NIMSystemNotification *)notification                                                        
                                limit:(NSInteger)limit;
@end                                                                                                

参数列表

参数 类型 说明
notification NIMSystemNotification 当前最早系统通知,没有则传入nil
limit NSInteger 最大获取数

获取指定类型系统通知

@protocol NIMSystemNotificationManager <NSObject>
/**
 *  获取本地存储的系统通知
 *
 *  @param notification 当前最早系统通知,没有则传入nil
 *  @param limit        最大获取数
 *  @param filter       过滤器
 *  @return 系统通知列表
 */
- (nullable NSArray<NIMSystemNotification*> *)fetchSystemNotifications:(nullable NIMSystemNotification *)notification 
                                                                 limit:(NSInteger)limit 
                                                                filter:(nullable NIMSystemNotificationFilter *)filter;
@end                                                                                              

NIMSystemNotificationFilter参见系统通知过滤器章节。

系统通知未读数

监听总未读数变更

@protocol NIMSystemNotificationManagerDelegate <NSObject>
/**
 *  监听总未读数变更
 *
 *  @param unreadCount 系统通知总未读数
 */
- (void)onSystemNotificationCountChanged:(NSInteger)unreadCount;
@end

获取未读数

获取本地存储的内置系统未读数

@protocol NIMSystemNotificationManager <NSObject>
/**
 *  未读系统通知数
 *
 *  @return 未读系统通知数
 */
- (NSInteger)allUnreadCount;

/**
 *  未读系统通知数
 *  @param filter  过滤器
 *  @return 未读系统通知数
 */
- (NSInteger)allUnreadCount:(nullable NIMSystemNotificationFilter *)filter

@end

NIMSystemNotificationFilter参见系统通知过滤器章节。

标记为已读

标记所有通知为已读

标记本地存储的内置系统通知为已读

@protocol NIMSystemNotificationManager <NSObject>
/**
 *  标记所有系统通知为已读
 */
- (void)markAllNotificationsAsRead;
@end

标记指定类型通知为已读

@protocol NIMSystemNotificationManager <NSObject>
/**
 *  标记指定类型通知为已读
 *
 *  @param filter 过滤器
 */
- (void)markAllNotificationsAsRead:(nullable NIMSystemNotificationFilter *)filter;
@end

NIMSystemNotificationFilter参见系统通知过滤器章节。

标记单条通知为已读

@protocol NIMSystemNotificationManager <NSObject>
/**
 *  标记单条系统通知为已读
 *
 *  @param notification 系统通知
 */
- (void)markNotificationsAsRead:(NIMSystemNotification *)notification;
@end

参数列表

参数 类型 说明
notification NIMSystemNotification 当前最早系统通知,没有则传入nil

删除系统通知

删除所有系统通知

删除本地存储的内置系统通知

@protocol NIMSystemNotificationManager <NSObject>
/**
 *  删除所有系统通知
 */
- (void)deleteAllNotifications;
@end

删除指定类型系统通知

@protocol NIMSystemNotificationManager <NSObject>
/**
 *  删除指定类型系统通知
 *
 *  @param filter 过滤器
 */
- (void)deleteAllNotifications:(nullable NIMSystemNotificationFilter *)filter;
@end

NIMSystemNotificationFilter参见系统通知过滤器章节。

删除单条系统通知

@protocol NIMSystemNotificationManager <NSObject>
/**
 *  删除单条系统通知
 *
 *  @param notification 系统通知
 */
- (void)deleteNotification:(NIMSystemNotification *)notification;
@end

参数列表

参数 类型 说明
notification NIMSystemNotification 当前最早系统通知,没有则传入nil

更改通知处理状态

当对系统通知事件作出相应的处理后,开发者可以更改该系统通知的处理状态。

当前,处理状态由开发者自定义,解析工作也由开发者负责。

@interface NIMSystemNotification : NSObject
/**
 *  通知处理状态
 *  @discussion 修改这个属性,后台会自动更新db中对应的数据,SDK调用者可以使用这个值来持久化他们对通知的处理结果,默认为0
 */
@property (nonatomic,assign)        NSInteger handleStatus;
@end

自定义系统通知

除内置系统通知外,NIM SDK 也额外提供自定义系统给开发者,方便开发者进行业务逻辑的通知(如实现对方正在输入中···等功能)。这个通知既可以由客户端发起也可以由开发者服务器发起。

注意:自定义通知和自定义消息的不同之处在于,自定义消息归属于 NIM SDK 消息体系内,适用于会话,由 SDK 存储在消息数据库中,与 NIM SDK 其他内建消息类型一同展现给用户。而自定义通知主要用于第三方的一些事件状态通知,SDK 不存储,不计入未读数,也不解析这些通知。SDK 仅仅负责替第三方传递和通知这些事件,起到透传的作用,收到自定义通知后的持久化工作需要由上层开发负责。

自定义系统通知原型

@interface NIMCustomSystemNotification : NSObject
/**
 *  通知 ID
 *  @discussion 只有收到的自定义系统通知才有通知 ID
 */
@property (nonatomic,assign,readonly)       int64_t notificationId;

/**
 *  时间戳
 */
@property (nonatomic,assign,readonly)       NSTimeInterval timestamp;

/**
 *  通知发起者id
 */
@property (nullable,nonatomic,copy,readonly)         NSString *sender;

/**
 *  通知接受者id
 */
@property (nullable,nonatomic,copy,readonly)         NSString *receiver;


/**
 *  通知接受者类型
 */
@property (nonatomic,assign,readonly)       NIMSessionType  receiverType;

/**
 *  透传的消息体内容
 */
@property (nullable,nonatomic,copy,readonly)         NSString    *content;

/**
 *  是否只发送给在线用户
 *  @discussion 默认为YES 如果这个值为NO,通知接受者如果在通知投递时不在线,那么他会在下次登录时收到这个通知
 */
@property (nonatomic,assign)                BOOL sendToOnlineUsersOnly;

/**
 *  推送文案,长度限制500字
 *  @discussion 默认为nil,用户可以设置当前通知的推送文案
 */
@property (nullable,nonatomic,copy)                  NSString *apnsContent;


/**
 *  apns推送Payload
 *  @discussion 可以通过这个字段定义自定义通知的推送Payload,支持字段参考苹果技术文档
 */
@property (nullable,nonatomic,copy)                  NSDictionary *apnsPayload;

/**
 *  自定义系统通知设置
 *  @discussion 可以通过这个字段制定当前通知的各种设置,如是否需要计入推送未读,是否需要带推送前缀等等
 */
@property (nullable,nonatomic,strong)                NIMCustomSystemNotificationSetting *setting;

/**
 *  自定义系统通知初始化方法
 *
 *  @param content 自定义系统通知内容
 *
 *  @return 自定义系统通知实例
 */
- (instancetype)initWithContent:(NSString *)content;
@end

发送自定义系统通知

自定义系统通知的发送仅支持个人和群,不支持聊天室。

@protocol NIMSystemNotificationManager <NSObject>
/**
 *  发送自定义系统通知
 *
 *  @param notification 系统通知
 *  @param session      接收方
 *  @param completion   发送结果回调
 */
- (void)sendCustomNotification:(NIMCustomSystemNotification *)notification
                     toSession:(NIMSession *)session
                    completion:(NIMSystemNotificationHandler)completion
@end                    

参数列表

参数 类型 说明
notification NIMCustomSystemNotification 系统通知
session NIMSession 接收方
completion NIMSystemNotificationHandler 发送结果回调

示例:

NSDictionary *dict = @{
                        NTESNotifyID : @(NTESCustom),
                        NTESCustomContent : content,
                      };
NSData *data = [NSJSONSerialization dataWithJSONObject:dict
                                               options:0
                                                 error:nil];
NSString *json = [[NSString alloc] initWithData:data
                                       encoding:NSUTF8StringEncoding];
// 初始化自定义系统通知内容,并返回实例
NIMCustomSystemNotification *notification = [[NIMCustomSystemNotification alloc] initWithContent:json];
// 设置推送文案
notification.apnsContent = content;
// 设置只发给在线用户,若接收者不在线,则收不到。
notification.sendToOnlineUsersOnly = NO;

NIMCustomSystemNotificationSetting *setting = [[NIMCustomSystemNotificationSetting alloc] init];
// 默认为YES。默认情况下,用户收到的自定义系统通知会在应用图标上累计未读。
setting.shouldBeCounted = NO;
// 消息需要推送
setting.apnsEnabled = YES;
// 推送是否需要带昵称前缀。默认为NO。
setting.apnsWithPrefix = YES;
notification.setting = setting;
[[[NIMSDK sharedSDK] systemNotificationManager] sendCustomNotification:notification
                                                             toSession:session
                                                            completion:nil];

接收自定义系统通知

接收自定义通知

@protocol NIMSystemNotificationManagerDelegate <NSObject>
/**
 *  收到自定义通知回调
 *  @discussion 这个通知是由开发者服务端/客户端发出,由我们的服务器进行透传的通知,SDK不负责这个信息的存储
 *  @param notification 自定义通知
 */
- (void)onReceiveCustomSystemNotification:(NIMCustomSystemNotification *)notification;
@end

参数列表

参数 类型 说明
notification NIMCustomSystemNotification 系统通知