圈组离线推送
更新时间: 2024/03/14 17:08:35
圈组支持接收方在个人使用的多个维度(设备、圈组服务器、频道分组和频道)配置离线消息推送。NIM SDK 的NIMQChatApnsManager
协议提供了配置圈组 APNs 离线推送的方法。同时 SDK 也提供了NIMQChatOption
类,用于为圈组配置 APNs 推送证书名和云信 PushKit 推送证书名。
功能介绍
圈组根据消息优先级和推送范围的大小确定消息是否离线推送,具体推送机制见下图。
上图中,推送消息被分为高中低优先级三种类型:
- 高优先级消息:@指定人(有具体目标、有@意愿)。对于被@的用户而言,该消息为高优消息。
- 中优先级消息:@所有人、@指定身份组(没有具体目标、有@意愿)。
- 低优先级消息:普通消息(没有具体目标、没有@意愿)。
消息优先级基于消息接收者判断。如某消息@A用户,那么对于A用户来说该消息为高优消息,而对于除A外的其他圈组服务器成员而言,该消息为低优消息(普通消息)。
SDK 的NIMPushNotificationProfile
枚举定义了圈组消息推送类型(见下表)。
枚举值 |
说明 |
---|---|
NIMPushNotificationProfileNotSet |
未指定需接收的推送消息类型 |
NIMPushNotificationProfileEnableAll |
接收全部类型的推送消息 |
NIMPushNotificationProfileOnlyHighAndMediumLevel |
只接收高、中优先级的推送消息 |
NIMPushNotificationProfileOnlyHighLevel |
只接收高优先级的推送消息 |
NIMPushNotificationProfileDisableAll |
全部推送消息都不收 |
NIMPushNotificationProfilePlatformDefault |
使用平台默认配置,即接收全部类型的推送消息 |
需要接收的推送消息类型可在个人使用的不同维度进行配置,包括设备维度、服务器维度、频道分组维度和频道维度。
-
如果多个维度同时配置了推送消息类型,最终生效的推送消息类型取决于维度的优先级。
不同维度的优先级为频道>频道分组>服务器>设备。最终实际生效的推送消息类型,为 最高优维度 的配置。
-
圈组的推送消息类型默认为接收全部类型的推送消息。
- 服务器成员数大于或等于 2000 人阈值时,即使接收方将推送消息类型设置为“接收全部类型的消息推送”,也无法收到低优先级消息的离线推送。
- 如果接收方离线而且消息不走离线推送,接收方可通过查询历史消息的方式获取离线消息。
前提条件
- 已了解消息被推送前的流转过程,具体参见图解圈组消息流转。
- 已完成配置 APNs 推送的准备工作,具体参见实现 APNs 离线推送的步骤 1 至步骤 4。
实现圈组消息推送
实现圈组消息推送的流程如下图所示。
下图可能因为网络问题而显示异常。如显示异常,一般刷新当前页面即可正常显示。
步骤1:为圈组配置 APNs 推送
在初始化时,通过NIMQChatOption
传入 APNs 推送证书名和云信 PushKit 推送证书名。
示例代码如下:
objcNIMQChatOption *qchatOption = [NIMQChatOption option];
qchatOption.apnsCername = @"YunXinApnsCername"; // APNs推送证书名
qchatOption.pkCername = @"YunXinPkCername"; // 云信PushKit推送证书名
[[NIMSDK sharedSDK] qchatWithOption:qchatOption];
步骤2:配置圈组推送选项
为圈组配置 APNs 推送后,接收方可按需配置其他选项,包括推送免打扰和圈组各维度需要接收的推送消息类型。
推送免打扰
调用updateApnsSetting:completion:
方法更新圈组推送的免打扰设置,包括是否开启圈组推送免打扰,以及设置免打扰时间段。如果设置了免打扰时间,则在该时间段内将不再收到任何推送消息。
示例代码如下:
objcNIMPushNotificationSetting *setting = [[NIMPushNotificationSetting alloc] init];
setting.noDisturbing = YES;
setting.noDisturbingStartH = 10;
setting.noDisturbingStartM = 30;
setting.noDisturbingEndH = 22;
setting.noDisturbingEndM = 0;
[[[NIMSDK sharedSDK] qchatApnsManager] updateApnsSetting:setting
completion:^(NSError * error) {
// your code
}];
服务器维度的推送消息类型
调用updatePushNotificationProfile:server:completion:
方法配置某个服务器下用户自己需要接收的推送消息类型。
示例代码如下:
objc[[[NIMSDK sharedSDK] qchatApnsManager] updatePushNotificationProfile:NIMPushNotificationProfileOnlyHighAndMediumLevel serverId: 534262 completion:^(NSError * error) {
// your code
}];
频道分组维度的推送消息类型
调用updatePushNotificationProfile:channelCategory
配置某个频道分组下用户自己需要接收的推送消息类型。
示例代码如下:
NIMQChatChannelCategoryIdInfo *info = [[NIMQChatChannelCategoryIdInfo alloc] init];
info.serverId = 5432623;
info.categoryId = 70979;
[[[NIMSDK sharedSDK] qchatApnsManager] updatePushNotificationProfile:NIMPushNotificationProfileOnlyHighAndMediumLevel channelCategory:info completion:^(NSError * error) {
// your code
}];
频道维度的推送消息类型
调用 updatePushNotificationProfile:channel:completion:
方法配置某个频道下自己需要接收的推送消息类型。
示例代码如下:
objc
NIMQChatChannelIdInfo *info = [[NIMQChatChannelIdInfo alloc] init];
info.serverId = 5432623;
info.channelId = 70979;
[[[NIMSDK sharedSDK] qchatApnsManager] updatePushNotificationProfile:NIMPushNotificationProfileOnlyHighAndMediumLevel channel:info completion:^(NSError * error) {
// your code
}];
步骤3:发消息时配置推送
发送方调用sendMessage:toSession:error:
或 sendMessage:toSession:completion:
方法发送某条消息时,确保apnsEnabled
参数设置为 YES,即该消息需要离线推送。
apnsEnabled
默认为 YES,即圈组的消息默认需要推送。
发送方发消息时还可配置如下选项:
参数 | 说明 |
---|---|
apnsContent |
消息的推送文案,长度限制 500 字,撤回消息时该字段无效 |
apnsPayload |
消息推送的 Payload,支持字段参考 Apple 开发者文档。长度限制 2000 字,撤回消息时该字段无效 |
apnsWithPrefix |
推送是否需要带前缀(一般为发送者昵称) |
shouldBeCounted |
推送消息是否计入未读数 |
registerBadgeCountHandler:
方法注册获取(示例代码如下)。应用上层可根据获取的角标未读数进行角标自定义。
示例代码
```objc [[[NIMSDK sharedSDK] qchatApnsManager] registerBadgeCountHandler:^NSUInteger() { NSUInteger badge; // your code return badge; }]; ```获取圈组推送配置
接收方在其他设备端登录时,可按需调用如下方法获取相应的配置。
获取推送免打扰配置
调用currentSetting
方法获取圈组当前的推送免打扰配置(NIMPushNotificationSetting
)。
示例代码如下:
objcNIMPushNotificationSetting *setting = [[[NIMSDK sharedSDK] qchatApnsManager] currentSetting];
// your code
获取服务器维度的推送配置列表
调用getUserPushNotificationConfigByServer:completion:
方法获取多个服务器的推送配置列表。
单次调用最多可传入 10 个服务器 ID 进行查询。
示例代码如下:
objc
NSArray *serverIds = @[@(74356), @(53426)];
[[[NIMSDK sharedSDK] qchatApnsManager] getUserPushNotificationConfigByServer:serverIds completion:^(NSError * error,
NSArray<NIMQChatUserPushNotificationConfig *> * config){
// your code
}];
获取频道分组推送配置
调用getUserPushNotificationConfigByChannelCategories
获取多个频道分组的推送配置列表。
单次调用最多可传入 10 个频道分组 ID 进行查询。
示例代码如下:
//获取“频道分组”层级推送设置
NIMQChatChannelCategoryIdInfo *info = [[NIMQChatChannelCategoryIdInfo alloc] init];
info.serverId = 5432623;
info.categoryId = 70979;
NSArray *categories = @[info];
[[[NIMSDK sharedSDK] qchatApnsManager] getUserPushNotificationConfigByChannelCategories:categories completion:^(NSError * error,
NSArray<NIMQChatUserPushNotificationConfig *> * config){
// your code
}];
获取频道维度的推送配置
调用 getUserPushNotificationConfigByChannel:completion:
方法获取多个频道的推送配置列表。
单次调用最多可传入 10 频道 ID 进行查询。
示例代码如下:
objc
NIMQChatChannelIdInfo *info = [[NIMQChatChannelIdInfo alloc] init];
info.serverId = 5432623;
info.channelId = 70979;
NSArray *channels = @[info];
[[[NIMSDK sharedSDK] qchatApnsManager] getUserPushNotificationConfigByChannel:channels completion:^(NSError * error,
NSArray<NIMQChatUserPushNotificationConfig *> * config){
// your code
}];