fix:修改图标和其他

This commit is contained in:
2026-03-07 02:02:22 +07:00
parent d874620a83
commit 67495ea864
653 changed files with 78983 additions and 816 deletions

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Location</key>
<dict>
<key>LocationImageQuality</key>
<real>0.7</real>
<key>LocationImageWidth</key>
<string>480</string>
<key>LocationImageHeight</key>
<string>240</string>
</dict>
<key>File</key>
<dict>
<key>RelativePath</key>
<string>Documents/MyFile</string>
<key>MaxRangeUnit</key>
<real>1048576</real>
</dict>
<key>Voice</key>
<dict>
<key>AudioEncodingBitRate</key>
<real>7950</real>
</dict>
<key>Image</key>
<dict>
<key>ThumbnailQuality</key>
<string>0.3</string>
<key>ThumbnailMaxSize</key>
<string>240</string>
<key>ThumbnailMinSize</key>
<string>100</string>
<key>ImageQuality</key>
<real>0.85</real>
<key>ImageWidth</key>
<integer>1080</integer>
<key>ImageHeight</key>
<integer>1080</integer>
</dict>
<key>CustomerService</key>
<dict>
<key>SuspendWhenLeave</key>
<true/>
</dict>
<key>Download</key>
<dict>
<key>DownloadSliceSize</key>
<real>20971520</real>
</dict>
<key>Sight</key>
<dict>
<key>SightCompressWidth</key>
<integer>540</integer>
<key>SightCompressHeight</key>
<integer>960</integer>
</dict>
<key>HeartBeatInterval</key>
<integer>15</integer>
</dict>
</plist>

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AvailableLibraries</key>
<array>
<dict>
<key>BinaryPath</key>
<string>RCUniIMV2.framework/RCUniIMV2</string>
<key>LibraryIdentifier</key>
<string>ios-arm64</string>
<key>LibraryPath</key>
<string>RCUniIMV2.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>RCUniIMV2.framework/RCUniIMV2</string>
<key>LibraryIdentifier</key>
<string>ios-x86_64-simulator</string>
<key>LibraryPath</key>
<string>RCUniIMV2.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
<key>XCFrameworkFormatVersion</key>
<string>1.0</string>
</dict>
</plist>

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Location</key>
<dict>
<key>LocationImageQuality</key>
<real>0.7</real>
<key>LocationImageWidth</key>
<string>480</string>
<key>LocationImageHeight</key>
<string>240</string>
</dict>
<key>File</key>
<dict>
<key>RelativePath</key>
<string>Documents/MyFile</string>
<key>MaxRangeUnit</key>
<real>1048576</real>
</dict>
<key>Voice</key>
<dict>
<key>AudioEncodingBitRate</key>
<real>7950</real>
</dict>
<key>Image</key>
<dict>
<key>ThumbnailQuality</key>
<string>0.3</string>
<key>ThumbnailMaxSize</key>
<string>240</string>
<key>ThumbnailMinSize</key>
<string>100</string>
<key>ImageQuality</key>
<real>0.85</real>
<key>ImageWidth</key>
<integer>1080</integer>
<key>ImageHeight</key>
<integer>1080</integer>
</dict>
<key>CustomerService</key>
<dict>
<key>SuspendWhenLeave</key>
<true/>
</dict>
<key>Download</key>
<dict>
<key>DownloadSliceSize</key>
<real>20971520</real>
</dict>
<key>Sight</key>
<dict>
<key>SightCompressWidth</key>
<integer>540</integer>
<key>SightCompressHeight</key>
<integer>960</integer>
</dict>
<key>HeartBeatInterval</key>
<integer>15</integer>
</dict>
</plist>

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Location</key>
<dict>
<key>LocationImageQuality</key>
<real>0.7</real>
<key>LocationImageWidth</key>
<string>480</string>
<key>LocationImageHeight</key>
<string>240</string>
</dict>
<key>File</key>
<dict>
<key>RelativePath</key>
<string>Documents/MyFile</string>
<key>MaxRangeUnit</key>
<real>1048576</real>
</dict>
<key>Voice</key>
<dict>
<key>AudioEncodingBitRate</key>
<real>7950</real>
</dict>
<key>Image</key>
<dict>
<key>ThumbnailQuality</key>
<string>0.3</string>
<key>ThumbnailMaxSize</key>
<string>240</string>
<key>ThumbnailMinSize</key>
<string>100</string>
<key>ImageQuality</key>
<real>0.85</real>
<key>ImageWidth</key>
<integer>1080</integer>
<key>ImageHeight</key>
<integer>1080</integer>
</dict>
<key>CustomerService</key>
<dict>
<key>SuspendWhenLeave</key>
<true/>
</dict>
<key>Download</key>
<dict>
<key>DownloadSliceSize</key>
<real>20971520</real>
</dict>
<key>Sight</key>
<dict>
<key>SightCompressWidth</key>
<integer>540</integer>
<key>SightCompressHeight</key>
<integer>960</integer>
</dict>
<key>HeartBeatInterval</key>
<integer>15</integer>
</dict>
</plist>

View File

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
7Z8VGnrVS3jQnXLptWiizuMqG4E=
</data>
<key>RCConfig.plist</key>
<data>
QA7nn/q1j2Y4AJbaGtBBs8g71xE=
</data>
</dict>
<key>files2</key>
<dict>
<key>RCConfig.plist</key>
<dict>
<key>hash2</key>
<data>
q9qti/DvWdK6nHCUQ3R/b3gsZ4wASUjoeUzGtn7YyXI=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AvailableLibraries</key>
<array>
<dict>
<key>LibraryIdentifier</key>
<string>ios-arm64_i386_x86_64-simulator</string>
<key>LibraryPath</key>
<string>RongChatRoom.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>i386</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
<dict>
<key>LibraryIdentifier</key>
<string>ios-arm64_armv7</string>
<key>LibraryPath</key>
<string>RongChatRoom.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>armv7</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
<key>XCFrameworkFormatVersion</key>
<string>1.0</string>
</dict>
</plist>

View File

@@ -0,0 +1,85 @@
//
// RCChatRoomClient+Deprecated.h
// RongChatRoom
//
// Created by zgh on 2024/12/27.
// Copyright © 2024 RongCloud. All rights reserved.
//
#import <RongChatRoom/RongChatRoom.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCChatRoomClient (Deprecated)
#pragma mark - 聊天室操作
/*!
加入聊天室(如果聊天室不存在则会创建)
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter messageCount: 进入聊天室时获取历史消息的数量,-1 <= messageCount <= 50
- Parameter successBlock: 加入聊天室成功的回调
- Parameter errorBlock: 加入聊天室失败的回调 [status: 加入聊天室失败的错误码]
可以通过传入的 messageCount 设置加入聊天室成功之后需要获取的历史消息数量。
-1 表示不获取任何历史消息0 表示不特殊设置而使用SDK默认的设置默认为获取 10 条0 < messageCount <= 50
为具体获取的消息数量,最大值为 50。注如果是 7.x 系统获取历史消息数量不要大于 30
从5.3.1版本开始, 加入聊天室后,断网重新加入聊天室默认获取聊天室消息条数,为主动加入时获取的历史消息条数。由于每次传入的条数固定, 可能会导致消息重复App 需要做消息排重。
- Warning: 没有加入过的聊天室(或杀死 app 重新打开),调用该接口会把该聊天室本地的消息与 KV 清除
- Remark: 聊天室
*/
- (void)joinChatRoom:(NSString *)targetId
messageCount:(int)messageCount
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock
__deprecated_msg("Use [RCChatRoomClient joinExistChatRoom:messageCount:successBlock:errorBlock:] instead");
/*!
加入已经存在的聊天室(如果聊天室不存在返回错误 23410人数超限返回错误 23411
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter messageCount: 进入聊天室时获取历史消息的数量,-1 <= messageCount <= 50
- Parameter successBlock: 加入聊天室成功的回调
- Parameter errorBlock: 加入聊天室失败的回调 [status: 加入聊天室失败的错误码]
可以通过传入的 messageCount 设置加入聊天室成功之后,需要获取的历史消息数量。
-1 表示不获取任何历史消息0 表示不特殊设置而使用SDK默认的设置默认为获取 10 条0 < messageCount <= 50
为具体获取的消息数量,最大值为 50。
没有加入过的聊天室(或杀死 app 重新打开),调用该接口会把该聊天室本地的消息与 KV 清除
- Remark: 聊天室
*/
- (void)joinExistChatRoom:(NSString *)targetId
messageCount:(int)messageCount
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock
__deprecated_msg("Use [RCChatRoomClient joinExistChatRoom:messageCount:successBlock:errorBlock:] instead");
#pragma mark-- 监听器
/*!
设置 IMLib 的聊天室状态监听器
- Parameter delegate: IMLib 聊天室状态监听器
- Remark: 聊天室
*/
- (void)setChatRoomStatusDelegate:(id<RCChatRoomStatusDelegate>)delegate
__deprecated_msg("Use [RCChatRoomClient addChatRoomStatusDelegate:] instead");
/*!
设置聊天室 KV 状态变化监听器
- Parameter delegate: 聊天室 KV 状态变化的监听器
可以设置并实现此 delegate 来进行聊天室状态变化的监听 。SDK 会在回调中通知您聊天室状态的改变。
- Remark: 功能设置
*/
- (void)setRCChatRoomKVStatusChangeDelegate:(id<RCChatRoomKVStatusChangeDelegate>)delegate
__deprecated_msg("Use [RCChatRoomClient addChatRoomKVStatusChangeDelegate:] instead");
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,428 @@
//
// RCChatRoomClient.h
// RongIMLib
//
// Created by 张改红 on 2020/7/28.
// Copyright © 2020 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RongIMLibCore.h>
#import "RCChatRoomProtocol.h"
#import "RCChatRoomInfo.h"
NS_ASSUME_NONNULL_BEGIN
@class RCJoinChatRoomResponse;
@interface RCChatRoomClient : NSObject
+ (instancetype)sharedChatRoomClient;
#pragma mark - 聊天室操作
/*!
加入聊天室(如果聊天室不存在则会创建)
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter messageCount: 进入聊天室时获取历史消息的数量,-1 <= messageCount <= 50
- Parameter extra: 附加信息,默认最大长度为 128 个字符,服务可配置
- Parameter successBlock: 加入聊天室成功的回调
- Parameter errorBlock: 加入聊天室失败的回调 [status: 加入聊天室失败的错误码]
- Remark: 聊天室
- Since: 5.10.2
*/
- (void)joinChatRoom:(NSString *)targetId
messageCount:(int)messageCount
extra:(nullable NSString *)extra
successBlock:(nullable void (^)(RCJoinChatRoomResponse *response))successBlock
errorBlock:(nullable void (^)(RCErrorCode status))errorBlock;
/*!
加入已经存在的聊天室(如果聊天室不存在返回错误 23410人数超限返回错误 23411
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter messageCount: 进入聊天室时获取历史消息的数量,-1 <= messageCount <= 50
- Parameter successBlock: 加入聊天室成功的回调
- Parameter errorBlock: 加入聊天室失败的回调 [status: 加入聊天室失败的错误码]
- Remark: 聊天室
- Since: 5.6.3
*/
- (void)joinExistChatRoom:(NSString *)targetId
messageCount:(int)messageCount
successBlock:(nullable void (^)(RCJoinChatRoomResponse *response))successBlock
errorBlock:(nullable void (^)(RCErrorCode status))errorBlock;
/*!
加入已经存在的聊天室(如果聊天室不存在返回错误 23410人数超限返回错误 23411
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter messageCount: 进入聊天室时获取历史消息的数量,-1 <= messageCount <= 50
- Parameter extra: 附加信息,最大长度为超过 128 个字符
- Parameter successBlock: 加入聊天室成功的回调
- Parameter errorBlock: 加入聊天室失败的回调 [status: 加入聊天室失败的错误码]
- Remark: 聊天室
- Since: 5.10.2
*/
- (void)joinExistChatRoom:(NSString *)targetId
messageCount:(int)messageCount
extra:(nullable NSString *)extra
successBlock:(nullable void (^)(RCJoinChatRoomResponse *response))successBlock
errorBlock:(nullable void (^)(RCErrorCode status))errorBlock;
/*!
退出聊天室
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter successBlock: 退出聊天室成功的回调
- Parameter errorBlock: 退出聊天室失败的回调 [status:退出聊天室失败的错误码]
- Remark: 聊天室
*/
- (void)quitChatRoom:(NSString *)targetId
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock;
/*!
获取聊天室的信息(包含部分成员信息和当前聊天室中的成员总数)
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter count: 需要获取的成员信息的数量(目前获取到的聊天室信息中仅包含不多于 20 人的成员信息,即 0 <= count <=
20传入 0 获取到的聊天室信息将或仅包含成员总数,不包含具体的成员列表)
- Parameter order: 需要获取的成员列表的顺序(最早加入或是最晚加入的部分成员)
- Parameter successBlock: 获取成功的回调 [chatRoomInfo:聊天室信息]
- Parameter errorBlock: 获取失败的回调 [status:获取失败的错误码]
因为聊天室一般成员数量巨大,权衡效率和用户体验,目前返回的聊天室信息仅包含不多于 20 人的成员信息和当前成员总数。
如果您使用 RC_ChatRoom_Member_Asc 升序方式查询,将返回最早加入的成员信息列表;
如果您使用 RC_ChatRoom_Member_Desc 降序方式查询,将返回最晚加入的成员信息列表。
上述两种方式查询,返回的成员列表都是按加入时间从旧到新。
- Remark: 聊天室
*/
- (void)getChatRoomInfo:(NSString *)targetId
count:(int)count
order:(RCChatRoomMemberOrder)order
success:(nullable void (^)(RCChatRoomInfo *chatRoomInfo))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock;
/*!
添加 IMLib 的聊天室状态监听器
- Parameter delegate: IMLib 聊天室状态监听器
*/
- (void)addChatRoomStatusDelegate:(id<RCChatRoomStatusDelegate>)delegate NS_SWIFT_NAME(addChatRoomStatusDelegate(_:));
/*!
移除 IMLib 的聊天室状态监听器
- Parameter delegate: IMLib 聊天室状态监听器
*/
- (void)removeChatRoomStatusDelegate:(id<RCChatRoomStatusDelegate>)delegate
NS_SWIFT_NAME(removeChatRoomStatusDelegate(_:));
/*!
获取 IMLib 的聊天室状态监听器
- Returns: 所有 IMLib 聊天室状态监听器
*/
- (NSArray<id<RCChatRoomStatusDelegate>> *)allChatRoomStatusDelegates;
/*!
从服务器端获取聊天室的历史消息
- Parameter targetId: 聊天室ID最大长度为 64 个字符
- Parameter recordTime: 起始的消息发送时间戳,毫秒
- Parameter count: 需要获取的消息数量, 0 < count <= 200
- Parameter order: 拉取顺序RC_Timestamp_Desc:倒序RC_Timestamp_ASC:正序
- Parameter successBlock: 获取成功的回调 [messages:获取到的历史消息数组, syncTime:下次拉取消息的时间戳]
- Parameter errorBlock: 获取失败的回调 [status:获取失败的错误码]
此方法从服务器端获取聊天室的历史消息,但是必须先开通聊天室消息云存储功能。
指定开始时间,比如2016年9月1日10点(1472695200000),
默认是0(正序:从存储的第一条消息开始拉取,倒序:从存储的最后一条消息开始拉取)
*/
- (void)getRemoteChatroomHistoryMessages:(NSString *)targetId
recordTime:(long long)recordTime
count:(int)count
order:(RCTimestampOrder)order
success:(nullable void (^)(NSArray<RCMessage *> *messages,
long long syncTime))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock;
#pragma mark - 聊天室状态存储 (使用前必须先联系商务开通)
/*!
添加聊天室 KV 状态变化监听
- Parameter delegate: 代理
*/
- (void)addChatRoomKVStatusChangeDelegate:(id<RCChatRoomKVStatusChangeDelegate>)delegate
NS_SWIFT_NAME(addChatRoomKVStatusChangeDelegate(_:));
/*!
移除聊天室 KV 状态变化监听
- Parameter delegate: 代理
*/
- (void)removeChatRoomKVStatusChangeDelegate:(id<RCChatRoomKVStatusChangeDelegate>)delegate
NS_SWIFT_NAME(removeChatRoomKVStatusChangeDelegate(_:));
/*!
获取聊天室 KV 状态变化监听
- Returns: 所有聊天室 KV 状态变化的监听器
*/
- (NSArray<id<RCChatRoomKVStatusChangeDelegate>> *)allChatRoomKVStatusChangeDelegates;
/**
设置聊天室自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter key: 聊天室属性名称Key 支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式,最大长度 128 个字符
- Parameter value: 聊天室属性对应的值,最大长度 4096 个字符
- Parameter sendNotification: 是否需要发送通知,如果发送通知,聊天室中的其他用户会接收到 RCChatroomKVNotificationMessage
通知消息,消息内容中包含操作类型(type)、属性名称(key)、属性名称对应的值(value)和自定义字段(extra)
- Parameter autoDelete: 用户掉线或退出时,是否自动删除该 Key、Value 值;自动删除时不会发送通知
- Parameter notificationExtra: 通知的自定义字段RC:chrmKVNotiMsg 通知消息中会包含此字段,最大长度 2 kb
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调
必须先开通聊天室状态存储功能
设置聊天室自定义属性,当 key 不存在时,代表增加属性; 当 key 已经存在时,代表更新属性的值,且只有 key
的创建者可以更新属性的值。
- Remark: 聊天室
*/
- (void)setChatRoomEntry:(NSString *)chatroomId
key:(NSString *)key
value:(NSString *)value
sendNotification:(BOOL)sendNotification
autoDelete:(BOOL)autoDelete
notificationExtra:(nullable NSString *)notificationExtra
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
/**
强制设置聊天室自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter key: 聊天室属性名称Key 支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式,最大长度 128 个字符
- Parameter value: 聊天室属性对应的值,最大长度 4096 个字符
- Parameter sendNotification: 是否需要发送通知,如果发送通知,聊天室中的其他用户会接收到 RCChatroomKVNotificationMessage
通知消息,消息内容中包含操作类型(type)、属性名称(key)、属性名称对应的值(value)和自定义字段(extra)
- Parameter autoDelete: 用户掉线或退出时,是否自动删除该 Key、Value 值;自动删除时不会发送通知
- Parameter notificationExtra: 通知的自定义字段RCChatroomKVNotificationMessage 通知消息中会包含此字段,最大长度 2 kb
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调
必须先开通聊天室状态存储功能
强制设置聊天室自定义属性,当 key 不存在时,代表增加属性; 当 key 已经存在时,代表更新属性的值。
- Remark: 聊天室
*/
- (void)forceSetChatRoomEntry:(NSString *)chatroomId
key:(NSString *)key
value:(NSString *)value
sendNotification:(BOOL)sendNotification
autoDelete:(BOOL)autoDelete
notificationExtra:(nullable NSString *)notificationExtra
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
/**
批量设置聊天室自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter entries: 聊天室属性key 支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式,最大长度 128 个字符value 聊天室属性对应的值,最大长度 4096 个字符,最多一次设置 10 条
- Parameter isForce: 是否强制覆盖
- Parameter autoDelete: 用户掉线或退出时,是否自动删除该 Key、Value 值
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调,当 nErrorCode 为 RC_KV_STORE_NOT_ALL_SUCCESS23428的时候entries 才会有值key 为设置失败的 keyvalue 为该 key 对应的错误码)
必须先开通聊天室状态存储功能
- Remark: 聊天室
*/
- (void)setChatRoomEntries:(NSString *)chatroomId
entries:(NSDictionary<NSString *, NSString *> *)entries
isForce:(BOOL)isForce
autoDelete:(BOOL)autoDelete
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode,
NSDictionary<NSString *, NSNumber *> *failureEntries))errorBlock;
/**
获取聊天室单个属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter key: 聊天室属性名称
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调
必须先开通聊天室状态存储功能
- Remark: 聊天室
*/
- (void)getChatRoomEntry:(NSString *)chatroomId
key:(NSString *)key
success:(nullable void (^)(NSDictionary<NSString *, NSString *> *entry))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
/**
获取聊天室所有自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调
必须先开通聊天室状态存储功能
- Remark: 聊天室
*/
- (void)getAllChatRoomEntries:(NSString *)chatroomId
success:(nullable void (^)(NSDictionary<NSString *, NSString *> *entry))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
/**
删除聊天室自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter key: 聊天室属性名称
- Parameter sendNotification: 是否需要发送通知,如果发送通知,聊天室中的其他用户会接收到 RCChatroomKVNotificationMessage
通知消息,消息内容中包含操作类型(type)、属性名称(key)、属性名称对应的值(value)和自定义字段(extra)
- Parameter notificationExtra: 通知的自定义字段RCChatroomKVNotificationMessage 通知消息中会包含此字段,最大长度 2 kb
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调
必须先开通聊天室状态存储功能
删除聊天室自定义属性,只有自己设置的属性可以被删除。
- Remark: 聊天室
*/
- (void)removeChatRoomEntry:(NSString *)chatroomId
key:(NSString *)key
sendNotification:(BOOL)sendNotification
notificationExtra:(nullable NSString *)notificationExtra
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
/**
强制删除聊天室自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter key: 聊天室属性名称
- Parameter sendNotification: 是否需要发送通知,如果发送通知,聊天室中的其他用户会接收到 RCChatroomKVNotificationMessage
通知消息,消息内容中包含操作类型(type)、属性名称(key)、属性名称对应的值(value)和自定义字段(extra)
- Parameter notificationExtra: 通知的自定义字段RCChatroomKVNotificationMessage 通知消息中会包含此字段,最大长度 2 kb
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调
必须先开通聊天室状态存储功能
强制删除聊天室自定义属性。
- Remark: 聊天室
*/
- (void)forceRemoveChatRoomEntry:(NSString *)chatroomId
key:(NSString *)key
sendNotification:(BOOL)sendNotification
notificationExtra:(nullable NSString *)notificationExtra
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
/**
批量删除聊天室自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter keys: 聊天室属性名称,最多一次删除 10 条
- Parameter isForce: 是否强制覆盖
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调,当 nErrorCode 为 RC_KV_STORE_NOT_ALL_SUCCESS23428的时候entries 才会有值key 为设置失败的 keyvalue 为该 key 对应的错误码)
必须先开通聊天室状态存储功能
- Remark: 聊天室
*/
- (void)removeChatRoomEntries:(NSString *)chatroomId
keys:(NSArray<NSString *> *)keys
isForce:(BOOL)isForce
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode,
NSDictionary<NSString *, NSNumber *> *failureEntries))errorBlock;
#pragma mark - 聊天室成员变化监听器
/*!
设置聊天室成员变化的监听器
可以设置并实现此拦截器来监听聊天室成员的加入或退出
- Remark: 功能设置
*/
@property (nonatomic, weak, nullable) id<RCChatRoomMemberDelegate> memberDelegate;
/// 绑定聊天室 ID 和 RTCRoomID
/// - Parameter chatRoomId: 聊天室 ID最大长度为 64 个字符
/// - Parameter rtcRoomId: rtc room ID
/// - Parameter successBlock: 成功回调
/// - Parameter errorBlock: 失败回调
- (void)bindChatRoom:(NSString *)chatRoomId
withRTCRoom:(NSString *)rtcRoomId
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
#pragma mark - 聊天室事件通知监听器
/**
添加 IMLib 的聊天室事件通知监听器
聊天室事件通知
封禁、解封、禁言、解除禁言、多端同步相关事件等
- Parameter delegate: IMLib 聊天室事件通知监听器
- Since: 5.4.5
*/
- (void)addChatRoomNotifyEventDelegate:(id<RCChatRoomNotifyEventDelegate>)delegate
NS_SWIFT_NAME(addChatRoomNotifyEventDelegate(_:));
/**
移除 IMLib 的聊天室事件通知监听器
- Parameter delegate: IMLib 聊天室事件通知监听器
- Since: 5.4.5
*/
- (void)removeChatRoomNotifyEventDelegate:(id<RCChatRoomNotifyEventDelegate>)delegate
NS_SWIFT_NAME(removeChatRoomNotifyEventDelegate(_:));
/**
返回 IMLib 的聊天室事件通知监听器
- Since: 5.4.5
*/
- (NSArray<id<RCChatRoomNotifyEventDelegate>> *)allChatRoomNotifyEventDelegates;
/// 是否允许聊天室消息排重,默认值为 YES
///
/// 排重的场景如下
/// 发送方弱网情况下发送消息,消息到达服务但发送方没有收到服务 ack导致发送方认为消息发送失败
/// 此种情况下,服务端和接收方都会收到第一条消息
/// 此时发送方重发该消息再次达到服务那么此时服务端会有两条消息消息内容相同messageUid 不同)
/// 接收方会收到两条内容相同但 messageUid 不同的消息SDK 此时会把第二条相同内容消息排重掉
/// 以此来保证重发的相同内容消息,发送方只有一条消息,接收方也只有一条消息
///
/// 当消息量少时,消息排重影响不大;但是本地存在大量消息时,排重会出现性能问题
/// 当 APP 本地存在大量消息,且发生收消息卡顿时,建议将排重关闭
/// 在初始化接口之后连接之前调用
///
/// - Parameter enableCheck: 是否允许聊天室消息排重
///
/// - Since: 5.8.2
- (void)setCheckChatRoomDuplicateMessage:(BOOL)enableCheck;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,162 @@
//
// RCChatRoomEnumDefine.h
// RongChatRoom
//
// Created by 张改红 on 2020/8/12.
// Copyright © 2020 张改红。All rights reserved.
//
#import <Foundation/Foundation.h>
#ifndef RCChatRoomEnumDefine_h
#define RCChatRoomEnumDefine_h
#pragma mark RCChatRoomStatus - 聊天室状态码
/*!
聊天室状态码
*/
typedef NS_ENUM(NSInteger, RCChatRoomStatus) {
/*!
正在加入聊天室中
*/
RCChatRoomStatus_Joining = 1,
/*!
加入聊天室成功
*/
RCChatRoomStatus_Joined = 2,
/*!
加入聊天室失败
*/
RCChatRoomStatus_JoinFailed = 3,
/*!
退出了聊天室
*/
RCChatRoomStatus_Quited = 4,
/*!
聊天室被销毁
*/
RCChatRoomStatus_Destroyed = 5,
/*!
聊天室被重置
由于聊天室长时间不活跃,已经被系统回收。聊天室 KV 已经被清空,请开发者刷新界面。
*/
RCChatRoomStatus_Reset = 6,
};
#pragma mark RCChatRoomMemberOrder - 聊天室成员排列顺序
/*!
聊天室成员的排列顺序
*/
typedef NS_ENUM(NSUInteger, RCChatRoomMemberOrder) {
/*!
升序,返回最早加入的成员列表
*/
RC_ChatRoom_Member_Asc = 1,
/*!
降序,返回最晚加入的成员列表
*/
RC_ChatRoom_Member_Desc = 2,
};
#pragma mark RCChatRoomMemberActionType - 聊天室成员加入或退出
/*!
聊天室成员加入或者退出
*/
typedef NS_ENUM(NSInteger, RCChatRoomMemberActionType) {
/*!
聊天室成员退出
*/
RC_ChatRoom_Member_Quit = 0,
/*!
聊天室成员加入
*/
RC_ChatRoom_Member_Join = 1,
};
#pragma mark RCChatRoomEvent - 聊天室事件
/*!
聊天室多端登录同步时,消息中的状态
*/
typedef NS_ENUM(NSInteger, RCChatRoomSyncStatus) {
/*!
多端登录同步用户离开聊天室,
1. 同一用户在一终端离开聊天室,通知另一终端
2. 用户多端加入聊天室场景:用户在 Android 端加入聊天室,在 Web 端登录后又加入一个新的聊天室,自动将用户从上一个聊天室踢出
被踢出聊天室中的所有成员,包括被踢出用户
*/
RCChatRoomSyncStatusQuit = 0,
/*!
多端登录同步用户加入聊天室,
同一用户在一终端加入聊天室,通知另一终端
*/
RCChatRoomSyncStatusJoin = 1
};
/*!
聊天室解封/封禁用户消息,操作类型枚举
*/
typedef NS_ENUM(NSInteger, RCChatRoomMemberOperateType) {
/*!
解封
*/
RCChatRoomMemberOperateTypeDeblock = 0,
/*!
封禁
*/
RCChatRoomMemberOperateTypeBlocked = 1
};
/*!
聊天室禁言相关消息,操作类型枚举
*/
typedef NS_ENUM(NSInteger, RCChatRoomMemberBanType) {
/*!
解除指定聊天室中用户禁言
*/
RCChatRoomMemberBanTypeUnmuteUsers = 0,
/*!
禁言指定聊天室中用户
*/
RCChatRoomMemberBanTypeMuteUsers = 1,
/*!
解除聊天室全体禁言
*/
RCChatRoomMemberBanTypeUnmuteAll = 2,
/*!
聊天室全体禁言
*/
RCChatRoomMemberBanTypeMuteAll = 3,
/*!
移出禁言用户白名单
*/
RCChatRoomMemberBanTypeRemoveWhitelist = 4,
/*!
添加禁言用户白名单
*/
RCChatRoomMemberBanTypeAddWhitelist = 5,
/*!
解除用户聊天室全局禁言
*/
RCChatRoomMemberBanTypeUnmuteGlobal = 6,
/*!
用户聊天室全局禁言
*/
RCChatRoomMemberBanTypeMuteGlobal = 7
};
#endif /* RCChatRoomEnumDefine_h */

View File

@@ -0,0 +1,40 @@
//
// RCChatRoomInfo.h
// RongIMLib
//
// Created by 岑裕 on 16/1/11.
// Copyright © 2016 年 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "RCChatRoomMemberInfo.h"
#import "RCChatRoomEnumDefine.h"
/*!
聊天室信息类
*/
@interface RCChatRoomInfo : NSObject
/*!
聊天室 ID
*/
@property (nonatomic, copy) NSString *targetId;
/*!
包含的成员信息类型
*/
@property (nonatomic, assign) RCChatRoomMemberOrder memberOrder;
/*!
聊天室中的部分成员信息 RCChatRoomMemberInfo 列表
如果成员类型为RC_ChatRoom_Member_Asc则为最早加入的成员列表按成员加入时间升序排列
如果成员类型为RC_ChatRoom_Member_Desc则为最晚加入的成员列表按成员加入时间降序排列。
*/
@property (nonatomic, strong) NSArray<RCChatRoomMemberInfo *> *memberInfoArray;
/*!
当前聊天室的成员总数
*/
@property (nonatomic, assign) int totalMemberCount;
@end

View File

@@ -0,0 +1,36 @@
//
// RCChatRoomMemberAction.h
// RongChatRoom
//
// Created by 孙浩 on 2021/7/12.
// Copyright © 2021 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "RCChatRoomEnumDefine.h"
NS_ASSUME_NONNULL_BEGIN
@interface RCChatRoomMemberAction : NSObject
/// 成员 ID
@property (nonatomic, copy) NSString *memberId;
/// 成员加入或者退出
@property (nonatomic, assign) RCChatRoomMemberActionType action;
/// 附加信息
/// - Since 5.10.2
@property (nonatomic, copy, nullable) NSString *extra;
/*!
RCChatRoomMemberAction 初始化方法
- Parameter memberId: 成员 ID
- Parameter action: 成员加入或退出
*/
- (instancetype)initWithMemberId:(NSString *)memberId action:(RCChatRoomMemberActionType)action;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,37 @@
//
// RCChatRoomMemberActionModel.h
// RongChatRoom
//
// Created by chinaspx on 2023/10/18.
// Copyright © 2023 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class RCChatRoomMemberAction;
@interface RCChatRoomMemberActionModel : NSObject
/// 聊天室 ID
@property (nonatomic, readonly) NSString *roomId;
/// 聊天室成员变更信息
@property (nonatomic, strong, readonly) NSArray<RCChatRoomMemberAction *> *chatRoomMemberActions;
/// 当前的聊天室人数
@property (nonatomic, assign, readonly) NSUInteger memberCount;
/// 初始化方法
/// - Parameter roomId: 聊天室 ID
/// - Parameter memberActions: 聊天室成员变更信息
/// - Parameter memberCount: 当前的聊天室人数
///
- (instancetype)initWithRoomId:(NSString *)roomId
memberActions:(NSArray<RCChatRoomMemberAction *> *)memberActions
memberCount:(NSUInteger)memberCount;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,46 @@
//
// RCChatRoomMemberBanEvent.h
// RongChatRoom
//
// Created by chinaspx on 2023/5/6.
// Copyright © 2023 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "RCChatRoomEnumDefine.h"
NS_ASSUME_NONNULL_BEGIN
@interface RCChatRoomMemberBanEvent : NSObject
/// 聊天室 ID
@property (nonatomic, copy) NSString *chatroomId;
/**
禁言操作类型,详见枚举值
禁言/解除禁言操作类型:
0解除指定聊天室中用户禁言
1禁言指定聊天室中用户
2解除聊天室全体禁言
3聊天室全体禁言
4: 移出禁言用户白名单
5: 添加禁言用户白名单
6: 解除用户聊天室全局禁言
7用户聊天室全局禁言
*/
@property (nonatomic, assign) RCChatRoomMemberBanType banType;
/// 禁言的总时间(禁言的操作有此字段)(毫秒) ,最大值为 43200 分钟1 个月), 最小值 1 分钟
@property (nonatomic, assign) NSInteger durationTime;
/// 操作时间 (毫秒时间戳)
@property (nonatomic, assign) long long operateTime;
/// 禁言/解禁言用户 ID 列表
@property (nonatomic, copy) NSArray<NSString *> *userIdList;
/// 附加信息
@property (nonatomic, copy, nullable) NSString *extra;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,47 @@
//
// RCChatRoomMemberBlockEvent.h
// RongChatRoom
//
// Created by chinaspx on 2023/5/6.
// Copyright © 2023 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "RCChatRoomEnumDefine.h"
NS_ASSUME_NONNULL_BEGIN
@interface RCChatRoomMemberBlockEvent : NSObject
/*!
聊天室 ID
*/
@property (nonatomic, copy) NSString *chatroomId;
/**
封禁类型0是解封1是封禁
*/
@property (nonatomic, assign) RCChatRoomMemberOperateType operateType;
/**
封禁的总时间,封禁时有此字段(毫秒)最大值为43200分钟1个月, 最小值1分钟
*/
@property (nonatomic, assign) NSInteger durationTime;
/**
操作时间(毫秒时间戳)
*/
@property (nonatomic, assign) long long operateTime;
/**
被封禁/解封的用户 ID 列表
*/
@property (nonatomic, copy) NSArray<NSString *> *userIdList;
/**
附加信息
*/
@property (nonatomic, copy, nullable) NSString *extra;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,26 @@
//
// RCChatRoomMemberInfo.h
// RongIMLib
//
// Created by 岑裕 on 16/1/10.
// Copyright © 2016 年 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
/*!
聊天室成员信息类
*/
@interface RCChatRoomMemberInfo : NSObject
/*!
用户 ID
*/
@property (nonatomic, copy) NSString *userId;
/*!
用户加入聊天室时间Unix 时间戳,毫秒)
*/
@property (nonatomic, assign) long long joinTime;
@end

View File

@@ -0,0 +1,255 @@
//
// RCChatRoomProtocol.h
// RongChatRoom
//
// Created by 张改红 on 2020/8/12.
// Copyright © 2020 张改红。All rights reserved.
//
#ifndef RCChatRoomProtocol_h
#define RCChatRoomProtocol_h
NS_ASSUME_NONNULL_BEGIN
@class RCChatRoomMemberAction, RCChatRoomMemberActionModel, RCJoinChatRoomResponse;
@class RCChatRoomSyncEvent, RCChatRoomMemberBlockEvent, RCChatRoomMemberBanEvent;
typedef NS_ENUM(NSUInteger, RCChatRoomDestroyType) {
/// 开发者主动销毁
RCChatRoomDestroyTypeManual = 0,
/// 聊天室长时间不活跃,被系统自动回收
RCChatRoomDestroyTypeAuto = 3
};
#pragma mark - 聊天室监听器
/*!
IMLib聊天室状态的的监听器
设置IMLib的聊天室状态监听器请参考RCIMClient的setChatRoomStatusDelegate:方法。
*/
@protocol RCChatRoomStatusDelegate <NSObject>
/*!
开始加入聊天室的回调
- Parameter chatroomId: 聊天室ID
*/
- (void)onChatRoomJoining:(NSString *)chatroomId;
/*!
加入聊天室成功的回调
- Parameter chatroomId: 聊天室ID
*/
- (void)onChatRoomJoined:(NSString *)chatroomId response:(RCJoinChatRoomResponse *)response;
- (void)onChatRoomJoined:(NSString *)chatroomId
__deprecated_msg("Use [RCChatRoomStatusDelegate onChatRoomJoined:response:] instead");
/*!
加入聊天室失败的回调
- Parameter chatroomId: 聊天室ID
- Parameter errorCode: 加入失败的错误码
如果错误码是KICKED_FROM_CHATROOM或RC_CHATROOM_NOT_EXIST则不会自动重新加入聊天室App需要按照自己的逻辑处理。
*/
- (void)onChatRoomJoinFailed:(NSString *)chatroomId errorCode:(RCErrorCode)errorCode;
/*!
加入聊天室成功,但是聊天室被重置。接收到此回调后,还会收到 onChatRoomJoined回调。
- Parameter chatroomId: 聊天室ID
*/
- (void)onChatRoomReset:(NSString *)chatroomId;
/*!
退出聊天室成功的回调
- Parameter chatroomId: 聊天室ID
*/
- (void)onChatRoomQuited:(NSString *)chatroomId;
/*!
聊天室被销毁的回调,用户在线的时候房间被销毁才会收到此回调。
- Parameter chatroomId: 聊天室ID
- Parameter type: 聊天室销毁原因
*/
- (void)onChatRoomDestroyed:(NSString *)chatroomId type:(RCChatRoomDestroyType)type;
@end
#pragma mark - 聊天室 KV 状态变化
@class RCChatroomKVChangeInfo;
/**
IMLib 聊天室 KV 状态变化监听器
设置代理请参考 RCIMClient 的 setRCChatRoomKVStatusChangeDelegate: 方法。
*/
@protocol RCChatRoomKVStatusChangeDelegate <NSObject>
/**
IMLib 刚加入聊天室时 KV 同步完成的回调
- Parameter roomId: 聊天室 Id
*/
- (void)chatRoomKVDidSync:(NSString *)roomId;
/**
IMLib 聊天室 KV 变化的回调
- Parameter roomId: 聊天室 Id
- Parameter entry: KV 字典,如果刚进入聊天室时存在 KV会通过此回调将所有 KV 返回,再次回调时为其他人设置或者修改 KV
*/
- (void)chatRoomKVDidUpdate:(NSString *)roomId entry:(NSDictionary<NSString *, NSString *> *)entry;
/**
IMLib 聊天室 KV 被删除的回调
- Parameter roomId: 聊天室 Id
- Parameter entry: KV 字典
*/
- (void)chatRoomKVDidRemove:(NSString *)roomId entry:(NSDictionary<NSString *, NSString *> *)entry;
/**
聊天室 KV 变化的回调。
本回调包含 `chatRoomKVDidUpdate:entry:` 和 `chatRoomKVDidRemove:entry:` 的回调数据。
- Parameter roomId: 聊天室 ID。
- Parameter changeInfos: 发生变化的 KV严格按照聊天室属性设置时的顺序。
*/
- (void)chatRoomKVDidChange:(NSString *)roomId changeInfos:(NSArray<RCChatroomKVChangeInfo *> *)changeInfos;
@end
#pragma mark - 聊天室成员变化监听器
@protocol RCChatRoomMemberDelegate <NSObject>
/**
聊天室成员加入或退出的回调
- Parameter members: 变更的用户列表
- Parameter roomId: 聊天室 Id
- Warning: 子线程回调
为了保证接口兼容性,该回调和下面的回调 memberDidChange:
会同时触发,建议使用下面的回调
*/
- (void)memberDidChange:(NSArray<RCChatRoomMemberAction *> *)members inRoom:(NSString *)roomId;
/**
聊天室成员加入或退出的回调
- Parameter actionModel: 变更的事件模型
- Warning: 子线程回调
为了保证接口兼容性,该回调和上面的回调 memberDidChange:inRoom:
会同时触发,建议使用该回调
- Since: 5.6.7
*/
- (void)memberDidChange:(RCChatRoomMemberActionModel *)actionModel;
@end
#pragma mark - 聊天室事件通知
/**
聊天室事件通知
封禁、解封、禁言、解除禁言、多端同步相关事件等
- Since: 5.4.5
*/
@protocol RCChatRoomNotifyEventDelegate <NSObject>
/**
多端登录相关事件通知回调
包含三种通知 case
1. 多端登录情况,一端加入聊天室,需要通知另一终端
2. 多端登录情况,一端退出聊天室,需要通知另一终端
3. 用户多端加入聊天室场景:用户在 iOS 端加入聊天室,在 Web 端登录后又加入一个新的聊天室,自动将用户从上一个聊天室踢出
通知被踢出聊天室中的所有成员,包括被踢出用户
case 3 如果开通了一个用户可加入多个聊天室的情况不会进行通知
- Parameter event: 聊天室 RCChatRoomSyncEvent
*/
- (void)chatRoomNotifyMultiLoginSync:(RCChatRoomSyncEvent *)event;
/**
封禁用户相关事件通知回调
包含两种通知 case
1. 封禁用户,聊天室中所有成员,包括被封禁用户
注:
* 封禁后用户被自动踢出聊天室
* 封禁后用户不会再收到被踢出的通知
* 是否接收通知取决于 server API 的入参 needNotify默认为 false 不通知)
2. 解除封禁,被解除封禁的成员
注:
* 用户未在线时,再登录时不会收到通知
* 服务端仅对主动解除封禁做通知,封禁时间到了,自动解除的不通知, 此刻调用加入聊天室接口可成功
* 仅对解除封禁的本人做通知,是否接收通知取决于 server API 的入参 needNotify默认为 false 不通知)
封禁时长最大值为43200分钟/1个月, 最小值1分钟
- Parameter event: 聊天室 RCChatRoomMemberBlockEvent
*/
- (void)chatRoomNotifyBlock:(RCChatRoomMemberBlockEvent *)event;
/**
禁言相关事件通知回调
包含以下 case
注:
* 禁言,受到白名单保护,即白名单中用户不会被禁言
* 是否接收通知取决于 server API 的入参 needNotify默认为 false 不通知)。通知范围:
1. 禁言指定聊天室中用户,通知指定聊天室中任何成员
2. 解除指定聊天室中用户禁言,通知指定聊天室中任何成员
注:
* 全体禁言,也受到白名单保护,即白名单中用户不会被禁言
* 是否接收通知取决于 server API 的入参 needNotify默认为 false 不通知)。通知范围:
3. 聊天室全体禁言,通知聊天室中所有成员
4. 解除聊天室全体禁言,通知聊天室中所有成员
注:
* 白名单是聊天室维度,添加后,用户在此聊天室内无法被设置禁言,即被保护
生命周期跟随聊天室,销毁后,清空白名单,重建聊天室时,需要再次调用接口添加
* 是否接收通知取决于 server API 的入参 needNotify默认为 false 不通知)。通知范围:
5. 添加禁言用户白名单,通知聊天室中所有成员
6. 移出禁言用户白名单,通知聊天室中所有成员
注:
* 全局禁言是最高优先级,全局禁言后,禁言用户在所有聊天室内都无法发言,即便配置白名单也不行
* 只有全局禁言或解除全局禁言的用户可以收到通知。是否接收通知取决于 server API 的入参 needNotify默认为 false 不通知)
7. 用户聊天室全局禁言,通知被全局禁言用户
8. 解除用户聊天室全局禁言,通知被解除全局禁言用户
禁言时长最大值为43200分钟/1个月, 最小值1分钟
- Parameter event: 聊天室 ```RCChatRoomMemberBanEvent```
*/
- (void)chatRoomNotifyBan:(RCChatRoomMemberBanEvent *)event;
@end
NS_ASSUME_NONNULL_END
#endif /* RCChatRoomProtocol_h */

View File

@@ -0,0 +1,45 @@
//
// RCChatRoomSyncEvent.h
// RongChatRoom
//
// Created by chinaspx on 2023/5/6.
// Copyright © 2023 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "RCChatRoomEnumDefine.h"
NS_ASSUME_NONNULL_BEGIN
@interface RCChatRoomSyncEvent : NSObject
/*!
聊天室 ID
*/
@property (nonatomic, copy) NSString *chatroomId;
/**
同步通知的变更状态
*/
@property (nonatomic, assign) RCChatRoomSyncStatus status;
/**
如果status是0的情况区分离开类型
1自己主动离开
2多端加入互踢导致离开
*/
@property (nonatomic, assign) NSInteger reason;
/**
同步通知的变更时间
用户加入/退出/被踢的时间(毫秒时间戳)
*/
@property (nonatomic, assign) long long time;
/**
附加信息
*/
@property (nonatomic, copy, nullable) NSString *extra;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,29 @@
//
// RCChatroomKVChangeInfo.h
// RongChatRoom
//
// Created by shuai shao on 2025/4/21.
// Copyright © 2025 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCChatroomKVChangeInfo : NSObject
/// 房间 ID。
@property (nonatomic, copy, readonly) NSString *roomId;
/// 发生变化的 Key。
@property (nonatomic, copy, readonly) NSString *key;
/// 发生变化后的 Value。
@property (nonatomic, copy, readonly, nullable) NSString *value;
/// 是否是删除。
@property (nonatomic, assign, readonly) BOOL isDelete;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,57 @@
//
// RCChatroomKVNotificationMessage.h
// RongIMLib
//
// Created by 孙浩 on 2019/10/14.
// Copyright © 2019 RongCloud. All rights reserved.
//
#import <RongIMLibCore/RongIMLibCore.h>
NS_ASSUME_NONNULL_BEGIN
/// 聊天室自定义属性通知消息的类型名
#define RCChatroomKVNotificationMessageTypeIdentifier @"RC:chrmKVNotiMsg"
typedef NS_ENUM(NSInteger, RCChatroomKVNotificationType) {
/// 设置 KV 的操作
RCChatroomKVNotificationTypeSet = 1,
/// 删除 KV 的操作
RCChatroomKVNotificationTypeRemove = 2
};
/**
聊天室自定义属性通知消息
不要随意构造此类消息发送,调用设置或者删除接口时会自动构建。
此消息不存储不计入未读消息数。
- Remark: 通知类消息
*/
@interface RCChatroomKVNotificationMessage : RCMessageContent
/// 聊天室操作的类型
@property (nonatomic, assign) RCChatroomKVNotificationType type;
/// 聊天室属性名称
@property (nonatomic, copy) NSString *key;
/// 聊天室属性对应的值
@property (nonatomic, copy) NSString *value;
/*!
初始化聊天室自定义属性通知消息
- Parameter key: 聊天室属性名称
- Parameter value: 聊天室属性对应的值(删除 key 时不用传)
- Parameter extra: 通知消息的自定义字段
- Returns: 聊天室自定义属性通知消息的对象
*/
+ (instancetype)notificationWithType:(RCChatroomKVNotificationType)type
key:(NSString *)key
value:(NSString *_Nullable)value
extra:(NSString *)extra;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,39 @@
//
// RCJoinChatRoomResponse.h
// RongChatRoom
//
// Created by chinaspx on 2023/7/31.
// Copyright © 2023 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCJoinChatRoomResponse : NSObject
// 创建时间(毫秒时间戳)
@property (nonatomic, assign) long long createTime;
// 成员数量
@property (nonatomic, assign) NSInteger memberCount;
// 是否全局禁言
@property (nonatomic, assign) BOOL isAllChatRoomBanned;
// 是否当前用户被禁言
@property (nonatomic, assign) BOOL isCurrentUserBanned;
// 当前用户是否在此聊天室被禁言
@property (nonatomic, assign) BOOL isCurrentChatRoomBanned;
// 当前用户是否在此聊天室的白名单中
@property (nonatomic, assign) BOOL isCurrentChatRoomInWhitelist;
// 加入时间(毫秒时间戳)
// - Since: 5.10.2
@property (nonatomic, assign) long long joinTime;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,34 @@
//
// RongChatRoom.h
// RongChatRoom
//
// Created by 张改红 on 2020/8/12.
// Copyright © 2020 张改红。All rights reserved.
//
#import <Foundation/Foundation.h>
//! Project version number for RongChatRoom.
FOUNDATION_EXPORT double RongChatRoomVersionNumber;
//! Project version string for RongChatRoom.
FOUNDATION_EXPORT const unsigned char RongChatRoomVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <RongChatRoom/PublicHeader.h>
#import <RongChatRoom/RCChatRoomClient.h>
#import <RongChatRoom/RCChatRoomProtocol.h>
#import <RongChatRoom/RCChatRoomEnumDefine.h>
#import <RongChatRoom/RCChatRoomInfo.h>
#import <RongChatRoom/RCChatroomKVNotificationMessage.h>
#import <RongChatRoom/RCChatRoomMemberInfo.h>
#import <RongChatRoom/RCChatroomKVChangeInfo.h>
#import <RongChatRoom/RCChatRoomMemberAction.h>
#import <RongChatRoom/RCChatRoomMemberActionModel.h>
#import <RongChatRoom/RCChatRoomSyncEvent.h>
#import <RongChatRoom/RCChatRoomMemberBlockEvent.h>
#import <RongChatRoom/RCChatRoomMemberBanEvent.h>
#import <RongChatRoom/RCJoinChatRoomResponse.h>
#import <RongChatRoom/RCChatRoomClient+Deprecated.h>

View File

@@ -0,0 +1,6 @@
framework module RongChatRoom {
umbrella header "RongChatRoom.h"
export *
module * { export * }
}

View File

@@ -0,0 +1,85 @@
//
// RCChatRoomClient+Deprecated.h
// RongChatRoom
//
// Created by zgh on 2024/12/27.
// Copyright © 2024 RongCloud. All rights reserved.
//
#import <RongChatRoom/RongChatRoom.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCChatRoomClient (Deprecated)
#pragma mark - 聊天室操作
/*!
加入聊天室(如果聊天室不存在则会创建)
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter messageCount: 进入聊天室时获取历史消息的数量,-1 <= messageCount <= 50
- Parameter successBlock: 加入聊天室成功的回调
- Parameter errorBlock: 加入聊天室失败的回调 [status: 加入聊天室失败的错误码]
可以通过传入的 messageCount 设置加入聊天室成功之后需要获取的历史消息数量。
-1 表示不获取任何历史消息0 表示不特殊设置而使用SDK默认的设置默认为获取 10 条0 < messageCount <= 50
为具体获取的消息数量,最大值为 50。注如果是 7.x 系统获取历史消息数量不要大于 30
从5.3.1版本开始, 加入聊天室后,断网重新加入聊天室默认获取聊天室消息条数,为主动加入时获取的历史消息条数。由于每次传入的条数固定, 可能会导致消息重复App 需要做消息排重。
- Warning: 没有加入过的聊天室(或杀死 app 重新打开),调用该接口会把该聊天室本地的消息与 KV 清除
- Remark: 聊天室
*/
- (void)joinChatRoom:(NSString *)targetId
messageCount:(int)messageCount
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock
__deprecated_msg("Use [RCChatRoomClient joinExistChatRoom:messageCount:successBlock:errorBlock:] instead");
/*!
加入已经存在的聊天室(如果聊天室不存在返回错误 23410人数超限返回错误 23411
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter messageCount: 进入聊天室时获取历史消息的数量,-1 <= messageCount <= 50
- Parameter successBlock: 加入聊天室成功的回调
- Parameter errorBlock: 加入聊天室失败的回调 [status: 加入聊天室失败的错误码]
可以通过传入的 messageCount 设置加入聊天室成功之后,需要获取的历史消息数量。
-1 表示不获取任何历史消息0 表示不特殊设置而使用SDK默认的设置默认为获取 10 条0 < messageCount <= 50
为具体获取的消息数量,最大值为 50。
没有加入过的聊天室(或杀死 app 重新打开),调用该接口会把该聊天室本地的消息与 KV 清除
- Remark: 聊天室
*/
- (void)joinExistChatRoom:(NSString *)targetId
messageCount:(int)messageCount
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock
__deprecated_msg("Use [RCChatRoomClient joinExistChatRoom:messageCount:successBlock:errorBlock:] instead");
#pragma mark-- 监听器
/*!
设置 IMLib 的聊天室状态监听器
- Parameter delegate: IMLib 聊天室状态监听器
- Remark: 聊天室
*/
- (void)setChatRoomStatusDelegate:(id<RCChatRoomStatusDelegate>)delegate
__deprecated_msg("Use [RCChatRoomClient addChatRoomStatusDelegate:] instead");
/*!
设置聊天室 KV 状态变化监听器
- Parameter delegate: 聊天室 KV 状态变化的监听器
可以设置并实现此 delegate 来进行聊天室状态变化的监听 。SDK 会在回调中通知您聊天室状态的改变。
- Remark: 功能设置
*/
- (void)setRCChatRoomKVStatusChangeDelegate:(id<RCChatRoomKVStatusChangeDelegate>)delegate
__deprecated_msg("Use [RCChatRoomClient addChatRoomKVStatusChangeDelegate:] instead");
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,428 @@
//
// RCChatRoomClient.h
// RongIMLib
//
// Created by 张改红 on 2020/7/28.
// Copyright © 2020 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RongIMLibCore.h>
#import "RCChatRoomProtocol.h"
#import "RCChatRoomInfo.h"
NS_ASSUME_NONNULL_BEGIN
@class RCJoinChatRoomResponse;
@interface RCChatRoomClient : NSObject
+ (instancetype)sharedChatRoomClient;
#pragma mark - 聊天室操作
/*!
加入聊天室(如果聊天室不存在则会创建)
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter messageCount: 进入聊天室时获取历史消息的数量,-1 <= messageCount <= 50
- Parameter extra: 附加信息,默认最大长度为 128 个字符,服务可配置
- Parameter successBlock: 加入聊天室成功的回调
- Parameter errorBlock: 加入聊天室失败的回调 [status: 加入聊天室失败的错误码]
- Remark: 聊天室
- Since: 5.10.2
*/
- (void)joinChatRoom:(NSString *)targetId
messageCount:(int)messageCount
extra:(nullable NSString *)extra
successBlock:(nullable void (^)(RCJoinChatRoomResponse *response))successBlock
errorBlock:(nullable void (^)(RCErrorCode status))errorBlock;
/*!
加入已经存在的聊天室(如果聊天室不存在返回错误 23410人数超限返回错误 23411
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter messageCount: 进入聊天室时获取历史消息的数量,-1 <= messageCount <= 50
- Parameter successBlock: 加入聊天室成功的回调
- Parameter errorBlock: 加入聊天室失败的回调 [status: 加入聊天室失败的错误码]
- Remark: 聊天室
- Since: 5.6.3
*/
- (void)joinExistChatRoom:(NSString *)targetId
messageCount:(int)messageCount
successBlock:(nullable void (^)(RCJoinChatRoomResponse *response))successBlock
errorBlock:(nullable void (^)(RCErrorCode status))errorBlock;
/*!
加入已经存在的聊天室(如果聊天室不存在返回错误 23410人数超限返回错误 23411
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter messageCount: 进入聊天室时获取历史消息的数量,-1 <= messageCount <= 50
- Parameter extra: 附加信息,最大长度为超过 128 个字符
- Parameter successBlock: 加入聊天室成功的回调
- Parameter errorBlock: 加入聊天室失败的回调 [status: 加入聊天室失败的错误码]
- Remark: 聊天室
- Since: 5.10.2
*/
- (void)joinExistChatRoom:(NSString *)targetId
messageCount:(int)messageCount
extra:(nullable NSString *)extra
successBlock:(nullable void (^)(RCJoinChatRoomResponse *response))successBlock
errorBlock:(nullable void (^)(RCErrorCode status))errorBlock;
/*!
退出聊天室
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter successBlock: 退出聊天室成功的回调
- Parameter errorBlock: 退出聊天室失败的回调 [status:退出聊天室失败的错误码]
- Remark: 聊天室
*/
- (void)quitChatRoom:(NSString *)targetId
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock;
/*!
获取聊天室的信息(包含部分成员信息和当前聊天室中的成员总数)
- Parameter targetId: 聊天室 ID最大长度为 64 个字符
- Parameter count: 需要获取的成员信息的数量(目前获取到的聊天室信息中仅包含不多于 20 人的成员信息,即 0 <= count <=
20传入 0 获取到的聊天室信息将或仅包含成员总数,不包含具体的成员列表)
- Parameter order: 需要获取的成员列表的顺序(最早加入或是最晚加入的部分成员)
- Parameter successBlock: 获取成功的回调 [chatRoomInfo:聊天室信息]
- Parameter errorBlock: 获取失败的回调 [status:获取失败的错误码]
因为聊天室一般成员数量巨大,权衡效率和用户体验,目前返回的聊天室信息仅包含不多于 20 人的成员信息和当前成员总数。
如果您使用 RC_ChatRoom_Member_Asc 升序方式查询,将返回最早加入的成员信息列表;
如果您使用 RC_ChatRoom_Member_Desc 降序方式查询,将返回最晚加入的成员信息列表。
上述两种方式查询,返回的成员列表都是按加入时间从旧到新。
- Remark: 聊天室
*/
- (void)getChatRoomInfo:(NSString *)targetId
count:(int)count
order:(RCChatRoomMemberOrder)order
success:(nullable void (^)(RCChatRoomInfo *chatRoomInfo))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock;
/*!
添加 IMLib 的聊天室状态监听器
- Parameter delegate: IMLib 聊天室状态监听器
*/
- (void)addChatRoomStatusDelegate:(id<RCChatRoomStatusDelegate>)delegate NS_SWIFT_NAME(addChatRoomStatusDelegate(_:));
/*!
移除 IMLib 的聊天室状态监听器
- Parameter delegate: IMLib 聊天室状态监听器
*/
- (void)removeChatRoomStatusDelegate:(id<RCChatRoomStatusDelegate>)delegate
NS_SWIFT_NAME(removeChatRoomStatusDelegate(_:));
/*!
获取 IMLib 的聊天室状态监听器
- Returns: 所有 IMLib 聊天室状态监听器
*/
- (NSArray<id<RCChatRoomStatusDelegate>> *)allChatRoomStatusDelegates;
/*!
从服务器端获取聊天室的历史消息
- Parameter targetId: 聊天室ID最大长度为 64 个字符
- Parameter recordTime: 起始的消息发送时间戳,毫秒
- Parameter count: 需要获取的消息数量, 0 < count <= 200
- Parameter order: 拉取顺序RC_Timestamp_Desc:倒序RC_Timestamp_ASC:正序
- Parameter successBlock: 获取成功的回调 [messages:获取到的历史消息数组, syncTime:下次拉取消息的时间戳]
- Parameter errorBlock: 获取失败的回调 [status:获取失败的错误码]
此方法从服务器端获取聊天室的历史消息,但是必须先开通聊天室消息云存储功能。
指定开始时间,比如2016年9月1日10点(1472695200000),
默认是0(正序:从存储的第一条消息开始拉取,倒序:从存储的最后一条消息开始拉取)
*/
- (void)getRemoteChatroomHistoryMessages:(NSString *)targetId
recordTime:(long long)recordTime
count:(int)count
order:(RCTimestampOrder)order
success:(nullable void (^)(NSArray<RCMessage *> *messages,
long long syncTime))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock;
#pragma mark - 聊天室状态存储 (使用前必须先联系商务开通)
/*!
添加聊天室 KV 状态变化监听
- Parameter delegate: 代理
*/
- (void)addChatRoomKVStatusChangeDelegate:(id<RCChatRoomKVStatusChangeDelegate>)delegate
NS_SWIFT_NAME(addChatRoomKVStatusChangeDelegate(_:));
/*!
移除聊天室 KV 状态变化监听
- Parameter delegate: 代理
*/
- (void)removeChatRoomKVStatusChangeDelegate:(id<RCChatRoomKVStatusChangeDelegate>)delegate
NS_SWIFT_NAME(removeChatRoomKVStatusChangeDelegate(_:));
/*!
获取聊天室 KV 状态变化监听
- Returns: 所有聊天室 KV 状态变化的监听器
*/
- (NSArray<id<RCChatRoomKVStatusChangeDelegate>> *)allChatRoomKVStatusChangeDelegates;
/**
设置聊天室自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter key: 聊天室属性名称Key 支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式,最大长度 128 个字符
- Parameter value: 聊天室属性对应的值,最大长度 4096 个字符
- Parameter sendNotification: 是否需要发送通知,如果发送通知,聊天室中的其他用户会接收到 RCChatroomKVNotificationMessage
通知消息,消息内容中包含操作类型(type)、属性名称(key)、属性名称对应的值(value)和自定义字段(extra)
- Parameter autoDelete: 用户掉线或退出时,是否自动删除该 Key、Value 值;自动删除时不会发送通知
- Parameter notificationExtra: 通知的自定义字段RC:chrmKVNotiMsg 通知消息中会包含此字段,最大长度 2 kb
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调
必须先开通聊天室状态存储功能
设置聊天室自定义属性,当 key 不存在时,代表增加属性; 当 key 已经存在时,代表更新属性的值,且只有 key
的创建者可以更新属性的值。
- Remark: 聊天室
*/
- (void)setChatRoomEntry:(NSString *)chatroomId
key:(NSString *)key
value:(NSString *)value
sendNotification:(BOOL)sendNotification
autoDelete:(BOOL)autoDelete
notificationExtra:(nullable NSString *)notificationExtra
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
/**
强制设置聊天室自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter key: 聊天室属性名称Key 支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式,最大长度 128 个字符
- Parameter value: 聊天室属性对应的值,最大长度 4096 个字符
- Parameter sendNotification: 是否需要发送通知,如果发送通知,聊天室中的其他用户会接收到 RCChatroomKVNotificationMessage
通知消息,消息内容中包含操作类型(type)、属性名称(key)、属性名称对应的值(value)和自定义字段(extra)
- Parameter autoDelete: 用户掉线或退出时,是否自动删除该 Key、Value 值;自动删除时不会发送通知
- Parameter notificationExtra: 通知的自定义字段RCChatroomKVNotificationMessage 通知消息中会包含此字段,最大长度 2 kb
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调
必须先开通聊天室状态存储功能
强制设置聊天室自定义属性,当 key 不存在时,代表增加属性; 当 key 已经存在时,代表更新属性的值。
- Remark: 聊天室
*/
- (void)forceSetChatRoomEntry:(NSString *)chatroomId
key:(NSString *)key
value:(NSString *)value
sendNotification:(BOOL)sendNotification
autoDelete:(BOOL)autoDelete
notificationExtra:(nullable NSString *)notificationExtra
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
/**
批量设置聊天室自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter entries: 聊天室属性key 支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式,最大长度 128 个字符value 聊天室属性对应的值,最大长度 4096 个字符,最多一次设置 10 条
- Parameter isForce: 是否强制覆盖
- Parameter autoDelete: 用户掉线或退出时,是否自动删除该 Key、Value 值
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调,当 nErrorCode 为 RC_KV_STORE_NOT_ALL_SUCCESS23428的时候entries 才会有值key 为设置失败的 keyvalue 为该 key 对应的错误码)
必须先开通聊天室状态存储功能
- Remark: 聊天室
*/
- (void)setChatRoomEntries:(NSString *)chatroomId
entries:(NSDictionary<NSString *, NSString *> *)entries
isForce:(BOOL)isForce
autoDelete:(BOOL)autoDelete
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode,
NSDictionary<NSString *, NSNumber *> *failureEntries))errorBlock;
/**
获取聊天室单个属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter key: 聊天室属性名称
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调
必须先开通聊天室状态存储功能
- Remark: 聊天室
*/
- (void)getChatRoomEntry:(NSString *)chatroomId
key:(NSString *)key
success:(nullable void (^)(NSDictionary<NSString *, NSString *> *entry))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
/**
获取聊天室所有自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调
必须先开通聊天室状态存储功能
- Remark: 聊天室
*/
- (void)getAllChatRoomEntries:(NSString *)chatroomId
success:(nullable void (^)(NSDictionary<NSString *, NSString *> *entry))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
/**
删除聊天室自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter key: 聊天室属性名称
- Parameter sendNotification: 是否需要发送通知,如果发送通知,聊天室中的其他用户会接收到 RCChatroomKVNotificationMessage
通知消息,消息内容中包含操作类型(type)、属性名称(key)、属性名称对应的值(value)和自定义字段(extra)
- Parameter notificationExtra: 通知的自定义字段RCChatroomKVNotificationMessage 通知消息中会包含此字段,最大长度 2 kb
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调
必须先开通聊天室状态存储功能
删除聊天室自定义属性,只有自己设置的属性可以被删除。
- Remark: 聊天室
*/
- (void)removeChatRoomEntry:(NSString *)chatroomId
key:(NSString *)key
sendNotification:(BOOL)sendNotification
notificationExtra:(nullable NSString *)notificationExtra
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
/**
强制删除聊天室自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter key: 聊天室属性名称
- Parameter sendNotification: 是否需要发送通知,如果发送通知,聊天室中的其他用户会接收到 RCChatroomKVNotificationMessage
通知消息,消息内容中包含操作类型(type)、属性名称(key)、属性名称对应的值(value)和自定义字段(extra)
- Parameter notificationExtra: 通知的自定义字段RCChatroomKVNotificationMessage 通知消息中会包含此字段,最大长度 2 kb
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调
必须先开通聊天室状态存储功能
强制删除聊天室自定义属性。
- Remark: 聊天室
*/
- (void)forceRemoveChatRoomEntry:(NSString *)chatroomId
key:(NSString *)key
sendNotification:(BOOL)sendNotification
notificationExtra:(nullable NSString *)notificationExtra
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
/**
批量删除聊天室自定义属性
- Parameter chatroomId: 聊天室 ID最大长度为 64 个字符
- Parameter keys: 聊天室属性名称,最多一次删除 10 条
- Parameter isForce: 是否强制覆盖
- Parameter successBlock: 成功回调
- Parameter errorBlock: 失败回调,当 nErrorCode 为 RC_KV_STORE_NOT_ALL_SUCCESS23428的时候entries 才会有值key 为设置失败的 keyvalue 为该 key 对应的错误码)
必须先开通聊天室状态存储功能
- Remark: 聊天室
*/
- (void)removeChatRoomEntries:(NSString *)chatroomId
keys:(NSArray<NSString *> *)keys
isForce:(BOOL)isForce
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode,
NSDictionary<NSString *, NSNumber *> *failureEntries))errorBlock;
#pragma mark - 聊天室成员变化监听器
/*!
设置聊天室成员变化的监听器
可以设置并实现此拦截器来监听聊天室成员的加入或退出
- Remark: 功能设置
*/
@property (nonatomic, weak, nullable) id<RCChatRoomMemberDelegate> memberDelegate;
/// 绑定聊天室 ID 和 RTCRoomID
/// - Parameter chatRoomId: 聊天室 ID最大长度为 64 个字符
/// - Parameter rtcRoomId: rtc room ID
/// - Parameter successBlock: 成功回调
/// - Parameter errorBlock: 失败回调
- (void)bindChatRoom:(NSString *)chatRoomId
withRTCRoom:(NSString *)rtcRoomId
success:(nullable void (^)(void))successBlock
error:(nullable void (^)(RCErrorCode nErrorCode))errorBlock;
#pragma mark - 聊天室事件通知监听器
/**
添加 IMLib 的聊天室事件通知监听器
聊天室事件通知
封禁、解封、禁言、解除禁言、多端同步相关事件等
- Parameter delegate: IMLib 聊天室事件通知监听器
- Since: 5.4.5
*/
- (void)addChatRoomNotifyEventDelegate:(id<RCChatRoomNotifyEventDelegate>)delegate
NS_SWIFT_NAME(addChatRoomNotifyEventDelegate(_:));
/**
移除 IMLib 的聊天室事件通知监听器
- Parameter delegate: IMLib 聊天室事件通知监听器
- Since: 5.4.5
*/
- (void)removeChatRoomNotifyEventDelegate:(id<RCChatRoomNotifyEventDelegate>)delegate
NS_SWIFT_NAME(removeChatRoomNotifyEventDelegate(_:));
/**
返回 IMLib 的聊天室事件通知监听器
- Since: 5.4.5
*/
- (NSArray<id<RCChatRoomNotifyEventDelegate>> *)allChatRoomNotifyEventDelegates;
/// 是否允许聊天室消息排重,默认值为 YES
///
/// 排重的场景如下
/// 发送方弱网情况下发送消息,消息到达服务但发送方没有收到服务 ack导致发送方认为消息发送失败
/// 此种情况下,服务端和接收方都会收到第一条消息
/// 此时发送方重发该消息再次达到服务那么此时服务端会有两条消息消息内容相同messageUid 不同)
/// 接收方会收到两条内容相同但 messageUid 不同的消息SDK 此时会把第二条相同内容消息排重掉
/// 以此来保证重发的相同内容消息,发送方只有一条消息,接收方也只有一条消息
///
/// 当消息量少时,消息排重影响不大;但是本地存在大量消息时,排重会出现性能问题
/// 当 APP 本地存在大量消息,且发生收消息卡顿时,建议将排重关闭
/// 在初始化接口之后连接之前调用
///
/// - Parameter enableCheck: 是否允许聊天室消息排重
///
/// - Since: 5.8.2
- (void)setCheckChatRoomDuplicateMessage:(BOOL)enableCheck;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,162 @@
//
// RCChatRoomEnumDefine.h
// RongChatRoom
//
// Created by 张改红 on 2020/8/12.
// Copyright © 2020 张改红。All rights reserved.
//
#import <Foundation/Foundation.h>
#ifndef RCChatRoomEnumDefine_h
#define RCChatRoomEnumDefine_h
#pragma mark RCChatRoomStatus - 聊天室状态码
/*!
聊天室状态码
*/
typedef NS_ENUM(NSInteger, RCChatRoomStatus) {
/*!
正在加入聊天室中
*/
RCChatRoomStatus_Joining = 1,
/*!
加入聊天室成功
*/
RCChatRoomStatus_Joined = 2,
/*!
加入聊天室失败
*/
RCChatRoomStatus_JoinFailed = 3,
/*!
退出了聊天室
*/
RCChatRoomStatus_Quited = 4,
/*!
聊天室被销毁
*/
RCChatRoomStatus_Destroyed = 5,
/*!
聊天室被重置
由于聊天室长时间不活跃,已经被系统回收。聊天室 KV 已经被清空,请开发者刷新界面。
*/
RCChatRoomStatus_Reset = 6,
};
#pragma mark RCChatRoomMemberOrder - 聊天室成员排列顺序
/*!
聊天室成员的排列顺序
*/
typedef NS_ENUM(NSUInteger, RCChatRoomMemberOrder) {
/*!
升序,返回最早加入的成员列表
*/
RC_ChatRoom_Member_Asc = 1,
/*!
降序,返回最晚加入的成员列表
*/
RC_ChatRoom_Member_Desc = 2,
};
#pragma mark RCChatRoomMemberActionType - 聊天室成员加入或退出
/*!
聊天室成员加入或者退出
*/
typedef NS_ENUM(NSInteger, RCChatRoomMemberActionType) {
/*!
聊天室成员退出
*/
RC_ChatRoom_Member_Quit = 0,
/*!
聊天室成员加入
*/
RC_ChatRoom_Member_Join = 1,
};
#pragma mark RCChatRoomEvent - 聊天室事件
/*!
聊天室多端登录同步时,消息中的状态
*/
typedef NS_ENUM(NSInteger, RCChatRoomSyncStatus) {
/*!
多端登录同步用户离开聊天室,
1. 同一用户在一终端离开聊天室,通知另一终端
2. 用户多端加入聊天室场景:用户在 Android 端加入聊天室,在 Web 端登录后又加入一个新的聊天室,自动将用户从上一个聊天室踢出
被踢出聊天室中的所有成员,包括被踢出用户
*/
RCChatRoomSyncStatusQuit = 0,
/*!
多端登录同步用户加入聊天室,
同一用户在一终端加入聊天室,通知另一终端
*/
RCChatRoomSyncStatusJoin = 1
};
/*!
聊天室解封/封禁用户消息,操作类型枚举
*/
typedef NS_ENUM(NSInteger, RCChatRoomMemberOperateType) {
/*!
解封
*/
RCChatRoomMemberOperateTypeDeblock = 0,
/*!
封禁
*/
RCChatRoomMemberOperateTypeBlocked = 1
};
/*!
聊天室禁言相关消息,操作类型枚举
*/
typedef NS_ENUM(NSInteger, RCChatRoomMemberBanType) {
/*!
解除指定聊天室中用户禁言
*/
RCChatRoomMemberBanTypeUnmuteUsers = 0,
/*!
禁言指定聊天室中用户
*/
RCChatRoomMemberBanTypeMuteUsers = 1,
/*!
解除聊天室全体禁言
*/
RCChatRoomMemberBanTypeUnmuteAll = 2,
/*!
聊天室全体禁言
*/
RCChatRoomMemberBanTypeMuteAll = 3,
/*!
移出禁言用户白名单
*/
RCChatRoomMemberBanTypeRemoveWhitelist = 4,
/*!
添加禁言用户白名单
*/
RCChatRoomMemberBanTypeAddWhitelist = 5,
/*!
解除用户聊天室全局禁言
*/
RCChatRoomMemberBanTypeUnmuteGlobal = 6,
/*!
用户聊天室全局禁言
*/
RCChatRoomMemberBanTypeMuteGlobal = 7
};
#endif /* RCChatRoomEnumDefine_h */

View File

@@ -0,0 +1,40 @@
//
// RCChatRoomInfo.h
// RongIMLib
//
// Created by 岑裕 on 16/1/11.
// Copyright © 2016 年 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "RCChatRoomMemberInfo.h"
#import "RCChatRoomEnumDefine.h"
/*!
聊天室信息类
*/
@interface RCChatRoomInfo : NSObject
/*!
聊天室 ID
*/
@property (nonatomic, copy) NSString *targetId;
/*!
包含的成员信息类型
*/
@property (nonatomic, assign) RCChatRoomMemberOrder memberOrder;
/*!
聊天室中的部分成员信息 RCChatRoomMemberInfo 列表
如果成员类型为RC_ChatRoom_Member_Asc则为最早加入的成员列表按成员加入时间升序排列
如果成员类型为RC_ChatRoom_Member_Desc则为最晚加入的成员列表按成员加入时间降序排列。
*/
@property (nonatomic, strong) NSArray<RCChatRoomMemberInfo *> *memberInfoArray;
/*!
当前聊天室的成员总数
*/
@property (nonatomic, assign) int totalMemberCount;
@end

View File

@@ -0,0 +1,36 @@
//
// RCChatRoomMemberAction.h
// RongChatRoom
//
// Created by 孙浩 on 2021/7/12.
// Copyright © 2021 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "RCChatRoomEnumDefine.h"
NS_ASSUME_NONNULL_BEGIN
@interface RCChatRoomMemberAction : NSObject
/// 成员 ID
@property (nonatomic, copy) NSString *memberId;
/// 成员加入或者退出
@property (nonatomic, assign) RCChatRoomMemberActionType action;
/// 附加信息
/// - Since 5.10.2
@property (nonatomic, copy, nullable) NSString *extra;
/*!
RCChatRoomMemberAction 初始化方法
- Parameter memberId: 成员 ID
- Parameter action: 成员加入或退出
*/
- (instancetype)initWithMemberId:(NSString *)memberId action:(RCChatRoomMemberActionType)action;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,37 @@
//
// RCChatRoomMemberActionModel.h
// RongChatRoom
//
// Created by chinaspx on 2023/10/18.
// Copyright © 2023 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class RCChatRoomMemberAction;
@interface RCChatRoomMemberActionModel : NSObject
/// 聊天室 ID
@property (nonatomic, readonly) NSString *roomId;
/// 聊天室成员变更信息
@property (nonatomic, strong, readonly) NSArray<RCChatRoomMemberAction *> *chatRoomMemberActions;
/// 当前的聊天室人数
@property (nonatomic, assign, readonly) NSUInteger memberCount;
/// 初始化方法
/// - Parameter roomId: 聊天室 ID
/// - Parameter memberActions: 聊天室成员变更信息
/// - Parameter memberCount: 当前的聊天室人数
///
- (instancetype)initWithRoomId:(NSString *)roomId
memberActions:(NSArray<RCChatRoomMemberAction *> *)memberActions
memberCount:(NSUInteger)memberCount;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,46 @@
//
// RCChatRoomMemberBanEvent.h
// RongChatRoom
//
// Created by chinaspx on 2023/5/6.
// Copyright © 2023 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "RCChatRoomEnumDefine.h"
NS_ASSUME_NONNULL_BEGIN
@interface RCChatRoomMemberBanEvent : NSObject
/// 聊天室 ID
@property (nonatomic, copy) NSString *chatroomId;
/**
禁言操作类型,详见枚举值
禁言/解除禁言操作类型:
0解除指定聊天室中用户禁言
1禁言指定聊天室中用户
2解除聊天室全体禁言
3聊天室全体禁言
4: 移出禁言用户白名单
5: 添加禁言用户白名单
6: 解除用户聊天室全局禁言
7用户聊天室全局禁言
*/
@property (nonatomic, assign) RCChatRoomMemberBanType banType;
/// 禁言的总时间(禁言的操作有此字段)(毫秒) ,最大值为 43200 分钟1 个月), 最小值 1 分钟
@property (nonatomic, assign) NSInteger durationTime;
/// 操作时间 (毫秒时间戳)
@property (nonatomic, assign) long long operateTime;
/// 禁言/解禁言用户 ID 列表
@property (nonatomic, copy) NSArray<NSString *> *userIdList;
/// 附加信息
@property (nonatomic, copy, nullable) NSString *extra;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,47 @@
//
// RCChatRoomMemberBlockEvent.h
// RongChatRoom
//
// Created by chinaspx on 2023/5/6.
// Copyright © 2023 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "RCChatRoomEnumDefine.h"
NS_ASSUME_NONNULL_BEGIN
@interface RCChatRoomMemberBlockEvent : NSObject
/*!
聊天室 ID
*/
@property (nonatomic, copy) NSString *chatroomId;
/**
封禁类型0是解封1是封禁
*/
@property (nonatomic, assign) RCChatRoomMemberOperateType operateType;
/**
封禁的总时间,封禁时有此字段(毫秒)最大值为43200分钟1个月, 最小值1分钟
*/
@property (nonatomic, assign) NSInteger durationTime;
/**
操作时间(毫秒时间戳)
*/
@property (nonatomic, assign) long long operateTime;
/**
被封禁/解封的用户 ID 列表
*/
@property (nonatomic, copy) NSArray<NSString *> *userIdList;
/**
附加信息
*/
@property (nonatomic, copy, nullable) NSString *extra;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,26 @@
//
// RCChatRoomMemberInfo.h
// RongIMLib
//
// Created by 岑裕 on 16/1/10.
// Copyright © 2016 年 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
/*!
聊天室成员信息类
*/
@interface RCChatRoomMemberInfo : NSObject
/*!
用户 ID
*/
@property (nonatomic, copy) NSString *userId;
/*!
用户加入聊天室时间Unix 时间戳,毫秒)
*/
@property (nonatomic, assign) long long joinTime;
@end

View File

@@ -0,0 +1,255 @@
//
// RCChatRoomProtocol.h
// RongChatRoom
//
// Created by 张改红 on 2020/8/12.
// Copyright © 2020 张改红。All rights reserved.
//
#ifndef RCChatRoomProtocol_h
#define RCChatRoomProtocol_h
NS_ASSUME_NONNULL_BEGIN
@class RCChatRoomMemberAction, RCChatRoomMemberActionModel, RCJoinChatRoomResponse;
@class RCChatRoomSyncEvent, RCChatRoomMemberBlockEvent, RCChatRoomMemberBanEvent;
typedef NS_ENUM(NSUInteger, RCChatRoomDestroyType) {
/// 开发者主动销毁
RCChatRoomDestroyTypeManual = 0,
/// 聊天室长时间不活跃,被系统自动回收
RCChatRoomDestroyTypeAuto = 3
};
#pragma mark - 聊天室监听器
/*!
IMLib聊天室状态的的监听器
设置IMLib的聊天室状态监听器请参考RCIMClient的setChatRoomStatusDelegate:方法。
*/
@protocol RCChatRoomStatusDelegate <NSObject>
/*!
开始加入聊天室的回调
- Parameter chatroomId: 聊天室ID
*/
- (void)onChatRoomJoining:(NSString *)chatroomId;
/*!
加入聊天室成功的回调
- Parameter chatroomId: 聊天室ID
*/
- (void)onChatRoomJoined:(NSString *)chatroomId response:(RCJoinChatRoomResponse *)response;
- (void)onChatRoomJoined:(NSString *)chatroomId
__deprecated_msg("Use [RCChatRoomStatusDelegate onChatRoomJoined:response:] instead");
/*!
加入聊天室失败的回调
- Parameter chatroomId: 聊天室ID
- Parameter errorCode: 加入失败的错误码
如果错误码是KICKED_FROM_CHATROOM或RC_CHATROOM_NOT_EXIST则不会自动重新加入聊天室App需要按照自己的逻辑处理。
*/
- (void)onChatRoomJoinFailed:(NSString *)chatroomId errorCode:(RCErrorCode)errorCode;
/*!
加入聊天室成功,但是聊天室被重置。接收到此回调后,还会收到 onChatRoomJoined回调。
- Parameter chatroomId: 聊天室ID
*/
- (void)onChatRoomReset:(NSString *)chatroomId;
/*!
退出聊天室成功的回调
- Parameter chatroomId: 聊天室ID
*/
- (void)onChatRoomQuited:(NSString *)chatroomId;
/*!
聊天室被销毁的回调,用户在线的时候房间被销毁才会收到此回调。
- Parameter chatroomId: 聊天室ID
- Parameter type: 聊天室销毁原因
*/
- (void)onChatRoomDestroyed:(NSString *)chatroomId type:(RCChatRoomDestroyType)type;
@end
#pragma mark - 聊天室 KV 状态变化
@class RCChatroomKVChangeInfo;
/**
IMLib 聊天室 KV 状态变化监听器
设置代理请参考 RCIMClient 的 setRCChatRoomKVStatusChangeDelegate: 方法。
*/
@protocol RCChatRoomKVStatusChangeDelegate <NSObject>
/**
IMLib 刚加入聊天室时 KV 同步完成的回调
- Parameter roomId: 聊天室 Id
*/
- (void)chatRoomKVDidSync:(NSString *)roomId;
/**
IMLib 聊天室 KV 变化的回调
- Parameter roomId: 聊天室 Id
- Parameter entry: KV 字典,如果刚进入聊天室时存在 KV会通过此回调将所有 KV 返回,再次回调时为其他人设置或者修改 KV
*/
- (void)chatRoomKVDidUpdate:(NSString *)roomId entry:(NSDictionary<NSString *, NSString *> *)entry;
/**
IMLib 聊天室 KV 被删除的回调
- Parameter roomId: 聊天室 Id
- Parameter entry: KV 字典
*/
- (void)chatRoomKVDidRemove:(NSString *)roomId entry:(NSDictionary<NSString *, NSString *> *)entry;
/**
聊天室 KV 变化的回调。
本回调包含 `chatRoomKVDidUpdate:entry:` 和 `chatRoomKVDidRemove:entry:` 的回调数据。
- Parameter roomId: 聊天室 ID。
- Parameter changeInfos: 发生变化的 KV严格按照聊天室属性设置时的顺序。
*/
- (void)chatRoomKVDidChange:(NSString *)roomId changeInfos:(NSArray<RCChatroomKVChangeInfo *> *)changeInfos;
@end
#pragma mark - 聊天室成员变化监听器
@protocol RCChatRoomMemberDelegate <NSObject>
/**
聊天室成员加入或退出的回调
- Parameter members: 变更的用户列表
- Parameter roomId: 聊天室 Id
- Warning: 子线程回调
为了保证接口兼容性,该回调和下面的回调 memberDidChange:
会同时触发,建议使用下面的回调
*/
- (void)memberDidChange:(NSArray<RCChatRoomMemberAction *> *)members inRoom:(NSString *)roomId;
/**
聊天室成员加入或退出的回调
- Parameter actionModel: 变更的事件模型
- Warning: 子线程回调
为了保证接口兼容性,该回调和上面的回调 memberDidChange:inRoom:
会同时触发,建议使用该回调
- Since: 5.6.7
*/
- (void)memberDidChange:(RCChatRoomMemberActionModel *)actionModel;
@end
#pragma mark - 聊天室事件通知
/**
聊天室事件通知
封禁、解封、禁言、解除禁言、多端同步相关事件等
- Since: 5.4.5
*/
@protocol RCChatRoomNotifyEventDelegate <NSObject>
/**
多端登录相关事件通知回调
包含三种通知 case
1. 多端登录情况,一端加入聊天室,需要通知另一终端
2. 多端登录情况,一端退出聊天室,需要通知另一终端
3. 用户多端加入聊天室场景:用户在 iOS 端加入聊天室,在 Web 端登录后又加入一个新的聊天室,自动将用户从上一个聊天室踢出
通知被踢出聊天室中的所有成员,包括被踢出用户
case 3 如果开通了一个用户可加入多个聊天室的情况不会进行通知
- Parameter event: 聊天室 RCChatRoomSyncEvent
*/
- (void)chatRoomNotifyMultiLoginSync:(RCChatRoomSyncEvent *)event;
/**
封禁用户相关事件通知回调
包含两种通知 case
1. 封禁用户,聊天室中所有成员,包括被封禁用户
注:
* 封禁后用户被自动踢出聊天室
* 封禁后用户不会再收到被踢出的通知
* 是否接收通知取决于 server API 的入参 needNotify默认为 false 不通知)
2. 解除封禁,被解除封禁的成员
注:
* 用户未在线时,再登录时不会收到通知
* 服务端仅对主动解除封禁做通知,封禁时间到了,自动解除的不通知, 此刻调用加入聊天室接口可成功
* 仅对解除封禁的本人做通知,是否接收通知取决于 server API 的入参 needNotify默认为 false 不通知)
封禁时长最大值为43200分钟/1个月, 最小值1分钟
- Parameter event: 聊天室 RCChatRoomMemberBlockEvent
*/
- (void)chatRoomNotifyBlock:(RCChatRoomMemberBlockEvent *)event;
/**
禁言相关事件通知回调
包含以下 case
注:
* 禁言,受到白名单保护,即白名单中用户不会被禁言
* 是否接收通知取决于 server API 的入参 needNotify默认为 false 不通知)。通知范围:
1. 禁言指定聊天室中用户,通知指定聊天室中任何成员
2. 解除指定聊天室中用户禁言,通知指定聊天室中任何成员
注:
* 全体禁言,也受到白名单保护,即白名单中用户不会被禁言
* 是否接收通知取决于 server API 的入参 needNotify默认为 false 不通知)。通知范围:
3. 聊天室全体禁言,通知聊天室中所有成员
4. 解除聊天室全体禁言,通知聊天室中所有成员
注:
* 白名单是聊天室维度,添加后,用户在此聊天室内无法被设置禁言,即被保护
生命周期跟随聊天室,销毁后,清空白名单,重建聊天室时,需要再次调用接口添加
* 是否接收通知取决于 server API 的入参 needNotify默认为 false 不通知)。通知范围:
5. 添加禁言用户白名单,通知聊天室中所有成员
6. 移出禁言用户白名单,通知聊天室中所有成员
注:
* 全局禁言是最高优先级,全局禁言后,禁言用户在所有聊天室内都无法发言,即便配置白名单也不行
* 只有全局禁言或解除全局禁言的用户可以收到通知。是否接收通知取决于 server API 的入参 needNotify默认为 false 不通知)
7. 用户聊天室全局禁言,通知被全局禁言用户
8. 解除用户聊天室全局禁言,通知被解除全局禁言用户
禁言时长最大值为43200分钟/1个月, 最小值1分钟
- Parameter event: 聊天室 ```RCChatRoomMemberBanEvent```
*/
- (void)chatRoomNotifyBan:(RCChatRoomMemberBanEvent *)event;
@end
NS_ASSUME_NONNULL_END
#endif /* RCChatRoomProtocol_h */

View File

@@ -0,0 +1,45 @@
//
// RCChatRoomSyncEvent.h
// RongChatRoom
//
// Created by chinaspx on 2023/5/6.
// Copyright © 2023 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "RCChatRoomEnumDefine.h"
NS_ASSUME_NONNULL_BEGIN
@interface RCChatRoomSyncEvent : NSObject
/*!
聊天室 ID
*/
@property (nonatomic, copy) NSString *chatroomId;
/**
同步通知的变更状态
*/
@property (nonatomic, assign) RCChatRoomSyncStatus status;
/**
如果status是0的情况区分离开类型
1自己主动离开
2多端加入互踢导致离开
*/
@property (nonatomic, assign) NSInteger reason;
/**
同步通知的变更时间
用户加入/退出/被踢的时间(毫秒时间戳)
*/
@property (nonatomic, assign) long long time;
/**
附加信息
*/
@property (nonatomic, copy, nullable) NSString *extra;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,29 @@
//
// RCChatroomKVChangeInfo.h
// RongChatRoom
//
// Created by shuai shao on 2025/4/21.
// Copyright © 2025 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCChatroomKVChangeInfo : NSObject
/// 房间 ID。
@property (nonatomic, copy, readonly) NSString *roomId;
/// 发生变化的 Key。
@property (nonatomic, copy, readonly) NSString *key;
/// 发生变化后的 Value。
@property (nonatomic, copy, readonly, nullable) NSString *value;
/// 是否是删除。
@property (nonatomic, assign, readonly) BOOL isDelete;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,57 @@
//
// RCChatroomKVNotificationMessage.h
// RongIMLib
//
// Created by 孙浩 on 2019/10/14.
// Copyright © 2019 RongCloud. All rights reserved.
//
#import <RongIMLibCore/RongIMLibCore.h>
NS_ASSUME_NONNULL_BEGIN
/// 聊天室自定义属性通知消息的类型名
#define RCChatroomKVNotificationMessageTypeIdentifier @"RC:chrmKVNotiMsg"
typedef NS_ENUM(NSInteger, RCChatroomKVNotificationType) {
/// 设置 KV 的操作
RCChatroomKVNotificationTypeSet = 1,
/// 删除 KV 的操作
RCChatroomKVNotificationTypeRemove = 2
};
/**
聊天室自定义属性通知消息
不要随意构造此类消息发送,调用设置或者删除接口时会自动构建。
此消息不存储不计入未读消息数。
- Remark: 通知类消息
*/
@interface RCChatroomKVNotificationMessage : RCMessageContent
/// 聊天室操作的类型
@property (nonatomic, assign) RCChatroomKVNotificationType type;
/// 聊天室属性名称
@property (nonatomic, copy) NSString *key;
/// 聊天室属性对应的值
@property (nonatomic, copy) NSString *value;
/*!
初始化聊天室自定义属性通知消息
- Parameter key: 聊天室属性名称
- Parameter value: 聊天室属性对应的值(删除 key 时不用传)
- Parameter extra: 通知消息的自定义字段
- Returns: 聊天室自定义属性通知消息的对象
*/
+ (instancetype)notificationWithType:(RCChatroomKVNotificationType)type
key:(NSString *)key
value:(NSString *_Nullable)value
extra:(NSString *)extra;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,39 @@
//
// RCJoinChatRoomResponse.h
// RongChatRoom
//
// Created by chinaspx on 2023/7/31.
// Copyright © 2023 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCJoinChatRoomResponse : NSObject
// 创建时间(毫秒时间戳)
@property (nonatomic, assign) long long createTime;
// 成员数量
@property (nonatomic, assign) NSInteger memberCount;
// 是否全局禁言
@property (nonatomic, assign) BOOL isAllChatRoomBanned;
// 是否当前用户被禁言
@property (nonatomic, assign) BOOL isCurrentUserBanned;
// 当前用户是否在此聊天室被禁言
@property (nonatomic, assign) BOOL isCurrentChatRoomBanned;
// 当前用户是否在此聊天室的白名单中
@property (nonatomic, assign) BOOL isCurrentChatRoomInWhitelist;
// 加入时间(毫秒时间戳)
// - Since: 5.10.2
@property (nonatomic, assign) long long joinTime;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,34 @@
//
// RongChatRoom.h
// RongChatRoom
//
// Created by 张改红 on 2020/8/12.
// Copyright © 2020 张改红。All rights reserved.
//
#import <Foundation/Foundation.h>
//! Project version number for RongChatRoom.
FOUNDATION_EXPORT double RongChatRoomVersionNumber;
//! Project version string for RongChatRoom.
FOUNDATION_EXPORT const unsigned char RongChatRoomVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <RongChatRoom/PublicHeader.h>
#import <RongChatRoom/RCChatRoomClient.h>
#import <RongChatRoom/RCChatRoomProtocol.h>
#import <RongChatRoom/RCChatRoomEnumDefine.h>
#import <RongChatRoom/RCChatRoomInfo.h>
#import <RongChatRoom/RCChatroomKVNotificationMessage.h>
#import <RongChatRoom/RCChatRoomMemberInfo.h>
#import <RongChatRoom/RCChatroomKVChangeInfo.h>
#import <RongChatRoom/RCChatRoomMemberAction.h>
#import <RongChatRoom/RCChatRoomMemberActionModel.h>
#import <RongChatRoom/RCChatRoomSyncEvent.h>
#import <RongChatRoom/RCChatRoomMemberBlockEvent.h>
#import <RongChatRoom/RCChatRoomMemberBanEvent.h>
#import <RongChatRoom/RCJoinChatRoomResponse.h>
#import <RongChatRoom/RCChatRoomClient+Deprecated.h>

View File

@@ -0,0 +1,6 @@
framework module RongChatRoom {
umbrella header "RongChatRoom.h"
export *
module * { export * }
}

View File

@@ -0,0 +1,342 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Headers/RCChatRoomClient+Deprecated.h</key>
<data>
59QNtRGVYcW/81lCM3xXg8lcQTw=
</data>
<key>Headers/RCChatRoomClient.h</key>
<data>
4eeeWjTqbKSxJiBH1+lIU8V3abs=
</data>
<key>Headers/RCChatRoomEnumDefine.h</key>
<data>
7ipmzPgcPv3DlG7eu7bVUPncN1I=
</data>
<key>Headers/RCChatRoomInfo.h</key>
<data>
lMBSs6LuI5dj/SCgE5xofYNUNlI=
</data>
<key>Headers/RCChatRoomMemberAction.h</key>
<data>
8zVSvoPUHmvAqJy4g+7g2uPwNlk=
</data>
<key>Headers/RCChatRoomMemberActionModel.h</key>
<data>
Kq7FrXdzQ4axCQ7jHUXBSFuUP2E=
</data>
<key>Headers/RCChatRoomMemberBanEvent.h</key>
<data>
XMGBk5348/rPk+3SCFGlKz3bs5w=
</data>
<key>Headers/RCChatRoomMemberBlockEvent.h</key>
<data>
kl/ISDncrFFOTQnWCEq5ihYM39U=
</data>
<key>Headers/RCChatRoomMemberInfo.h</key>
<data>
MeunTuYWza6J6GNeU9jJ9yAIf6k=
</data>
<key>Headers/RCChatRoomProtocol.h</key>
<data>
dN1Cerf8C6IiNIVHIYvMUXmR8T8=
</data>
<key>Headers/RCChatRoomSyncEvent.h</key>
<data>
BF1X0bQS1U9pTg6JsKiouacegOs=
</data>
<key>Headers/RCChatroomKVChangeInfo.h</key>
<data>
kOgFBsvA95iTFPNOg8KvSZjpAp4=
</data>
<key>Headers/RCChatroomKVNotificationMessage.h</key>
<data>
MqUh4GHtUDgcpdhFkexLTJozHAs=
</data>
<key>Headers/RCJoinChatRoomResponse.h</key>
<data>
7CLt4pIv0TSmLd9G2GotOhGqjYA=
</data>
<key>Headers/RongChatRoom.h</key>
<data>
0Uc+ipnUebWHdxJFY3UNRSaB9FY=
</data>
<key>Info.plist</key>
<data>
BAbVxQ9YcskGmA3oVy8szLM52d4=
</data>
<key>Modules/module.modulemap</key>
<data>
ii0hqjTTGnemjpGIXXGYCaoB99o=
</data>
</dict>
<key>files2</key>
<dict>
<key>Headers/RCChatRoomClient+Deprecated.h</key>
<dict>
<key>hash</key>
<data>
59QNtRGVYcW/81lCM3xXg8lcQTw=
</data>
<key>hash2</key>
<data>
VeUz0KM7anFOMcjqzwc0q8t7r+w5VNR2DvbWM91Uc7o=
</data>
</dict>
<key>Headers/RCChatRoomClient.h</key>
<dict>
<key>hash</key>
<data>
4eeeWjTqbKSxJiBH1+lIU8V3abs=
</data>
<key>hash2</key>
<data>
8JnB3SmbUh/wFyuPvi3b3Gray+VplP/FYAHRWai1uQw=
</data>
</dict>
<key>Headers/RCChatRoomEnumDefine.h</key>
<dict>
<key>hash</key>
<data>
7ipmzPgcPv3DlG7eu7bVUPncN1I=
</data>
<key>hash2</key>
<data>
EzVs+EtKfpdjeis8qZtgtjFNOw1ANDosc411HfRTl6U=
</data>
</dict>
<key>Headers/RCChatRoomInfo.h</key>
<dict>
<key>hash</key>
<data>
lMBSs6LuI5dj/SCgE5xofYNUNlI=
</data>
<key>hash2</key>
<data>
fdFCTcU8VIPr+5LZSLAUEPplOnimj7CTHXwJH9F4pj0=
</data>
</dict>
<key>Headers/RCChatRoomMemberAction.h</key>
<dict>
<key>hash</key>
<data>
8zVSvoPUHmvAqJy4g+7g2uPwNlk=
</data>
<key>hash2</key>
<data>
/mjF0gKIZ4AVh+AfA4XWHAvW7qdkiIE+LH3PRp0pT1M=
</data>
</dict>
<key>Headers/RCChatRoomMemberActionModel.h</key>
<dict>
<key>hash</key>
<data>
Kq7FrXdzQ4axCQ7jHUXBSFuUP2E=
</data>
<key>hash2</key>
<data>
viBnYaS0atwrF8B3MA29jgUN3KrX6yIzHLcnTj+r4Jw=
</data>
</dict>
<key>Headers/RCChatRoomMemberBanEvent.h</key>
<dict>
<key>hash</key>
<data>
XMGBk5348/rPk+3SCFGlKz3bs5w=
</data>
<key>hash2</key>
<data>
uYWFoWtk0fbPUQ/fX158NA8MzZD68zGVXFv3wi9It74=
</data>
</dict>
<key>Headers/RCChatRoomMemberBlockEvent.h</key>
<dict>
<key>hash</key>
<data>
kl/ISDncrFFOTQnWCEq5ihYM39U=
</data>
<key>hash2</key>
<data>
fAw/5mf4KgR9kzfIx4rDQtRJZY16ZJC86j7psjme1ao=
</data>
</dict>
<key>Headers/RCChatRoomMemberInfo.h</key>
<dict>
<key>hash</key>
<data>
MeunTuYWza6J6GNeU9jJ9yAIf6k=
</data>
<key>hash2</key>
<data>
p+ptXasD1EwetwwGO6fkJejatacBm1Likt7kOiwi1c0=
</data>
</dict>
<key>Headers/RCChatRoomProtocol.h</key>
<dict>
<key>hash</key>
<data>
dN1Cerf8C6IiNIVHIYvMUXmR8T8=
</data>
<key>hash2</key>
<data>
FP805Zw9tuCBVyHqvOiuQfvErxdVc93Hzngte47Vjao=
</data>
</dict>
<key>Headers/RCChatRoomSyncEvent.h</key>
<dict>
<key>hash</key>
<data>
BF1X0bQS1U9pTg6JsKiouacegOs=
</data>
<key>hash2</key>
<data>
RpMzkJUbvTp7PdPLzEO0RE9VRJ17F/lJAg8LEhhGroI=
</data>
</dict>
<key>Headers/RCChatroomKVChangeInfo.h</key>
<dict>
<key>hash</key>
<data>
kOgFBsvA95iTFPNOg8KvSZjpAp4=
</data>
<key>hash2</key>
<data>
qUsA04eVGGxQv1OgHrfHwlnT+IGTFas+JD3vziKyhhs=
</data>
</dict>
<key>Headers/RCChatroomKVNotificationMessage.h</key>
<dict>
<key>hash</key>
<data>
MqUh4GHtUDgcpdhFkexLTJozHAs=
</data>
<key>hash2</key>
<data>
24CgnDh2oGGjydwLW/QvEkLFDKKn2ZLsXYMlLWDPcIY=
</data>
</dict>
<key>Headers/RCJoinChatRoomResponse.h</key>
<dict>
<key>hash</key>
<data>
7CLt4pIv0TSmLd9G2GotOhGqjYA=
</data>
<key>hash2</key>
<data>
IvgmaZuARMCpoX+wh1/P+S/IOaXIu69UJUE9J5/3aU4=
</data>
</dict>
<key>Headers/RongChatRoom.h</key>
<dict>
<key>hash</key>
<data>
0Uc+ipnUebWHdxJFY3UNRSaB9FY=
</data>
<key>hash2</key>
<data>
2ckWRnD9M3feRHniqsmr95+ttGnSL0Ugz+MGZDDWHn4=
</data>
</dict>
<key>Modules/module.modulemap</key>
<dict>
<key>hash</key>
<data>
ii0hqjTTGnemjpGIXXGYCaoB99o=
</data>
<key>hash2</key>
<data>
wJMy+vWcBIzIHUTDDqJsgKqxiJI3RYxErBRoeokdByQ=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AvailableLibraries</key>
<array>
<dict>
<key>LibraryIdentifier</key>
<string>ios-arm64_i386_x86_64-simulator</string>
<key>LibraryPath</key>
<string>RongIMLibCore.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>i386</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
<dict>
<key>LibraryIdentifier</key>
<string>ios-arm64_armv7</string>
<key>LibraryPath</key>
<string>RongIMLibCore.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>armv7</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
<key>XCFrameworkFormatVersion</key>
<string>1.0</string>
</dict>
</plist>

View File

@@ -0,0 +1,62 @@
/**
* Copyright (c) 2014-2015, RongCloud.
* All rights reserved.
*
* All the contents are the copyright of RongCloud Network Technology Co.Ltd.
* Unless otherwise credited. http://rongcloud.cn
*
*/
// RCAMRDataConverter.h
// Created by Heq.Shinoda on 14-6-17.
#ifndef __RCAMRDataConverter
#define __RCAMRDataConverter
#import <Foundation/Foundation.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
NS_ASSUME_NONNULL_BEGIN
/*!
AMR 格式与 WAV 格式音频转换工具类
*/
@interface RCAMRDataConverter : NSObject
/*!
获取 AMR 格式与 WAV 格式音频转换工具类单例
- Returns: AMR 格式与 WAV 格式音频转换工具类单例
*/
+ (RCAMRDataConverter *)sharedAMRDataConverter;
/*!
将 AMR 格式的音频数据转化为 WAV 格式的音频数据
- Parameter data: AMR 格式的音频数据,可以是 AMR-NB 或者 AMR-WB 格式
- Returns: WAV 格式的音频数据
*/
- (nullable NSData *)decodeAMRToWAVE:(NSData *)data;
/*!
将 AMR 格式的音频数据转化为 WAV 格式的音频数据
- Parameter data: AMR格式的音频数据必须是 AMR-NB 的格式
- Returns: WAV格式的音频数据
*/
- (nullable NSData *)decodeAMRToWAVEWithoutHeader:(NSData *)data;
/*!
将 WAV 格式的音频数据转化为 AMR 格式的音频数据8KHz/16KHz 采样)
- Parameter data: WAV 格式的音频数据
- Returns: AMR-NB/AMR-WB 格式的音频数据
如果采样率为 8KHz 则返回 AMR-NB 格式数据,如果采样率为 16KHz 则返回 AMR-WB 格式数据。
*/
- (nullable NSData *)encodeWAVEToAMR:(NSData *)data;
@end
SEC_ASSUME_NONNULL_END
#endif

View File

@@ -0,0 +1,131 @@
//
// RCAndroidConfig.h
// RongIMLib
//
// Created by 孙浩 on 2020/9/17.
// Copyright © 2020 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/// 华为推送消息级别
typedef NSString *RCImportanceHw NS_STRING_ENUM;
/// 华为推送消息级别 NORMAL
FOUNDATION_EXPORT RCImportanceHw const RCImportanceHwNormal;
/// 华为推送消息级别 LOW
FOUNDATION_EXPORT RCImportanceHw const RCImportanceHwLow;
/// 荣耀推送消息级别
typedef NSString *RCImportanceHonor NS_STRING_ENUM;
/// 荣耀推送消息级别 NORMAL
FOUNDATION_EXPORT RCImportanceHonor const RCImportanceHonorNormal;
/// 荣耀推送消息级别 LOW
FOUNDATION_EXPORT RCImportanceHonor const RCImportanceHonorLow;
@interface RCAndroidConfig : NSObject
/// Android 平台 Push 唯一标识
///
/// 目前支持小米、华为推送平台,默认开发者不需要进行设置,当消息产生推送时,消息的 messageUId 作为 notificationId 使用。
@property (nonatomic, copy) NSString *notificationId;
#pragma mark - 小米
/// 小米的渠道 ID
///
/// 该条消息针对小米使用的推送渠道,如开发者集成了小米推送,需要指定 channelId 时,可向 Android 端研发人员获取channelId 由开发者自行创建。
@property (nonatomic, copy, nullable) NSString *channelIdMi;
/// 小米 Large icon 链接
///
/// Large icon 可以出现在大图版和多字版消息中,显示在右边。国内版仅 MIUI12 以上版本支持,以下版本均不支持;国际版支持。图片要求:大小 120 * 120px格式为 png 或者 jpg 格式。
@property (nonatomic, copy, nullable)
NSString *miLargeIconUrl __deprecated_msg("由于小米官方已停止支持该能力,该字段/方法已失效");
#pragma mark - 华为
/// 华为的渠道 ID
///
/// 该条消息针对华为使用的推送渠道,如开发者集成了华为推送,需要指定 channelId 时,可向 Android 端研发人员获取channelId 由开发者自行创建。
@property (nonatomic, copy, nullable) NSString *channelIdHW;
////// 华为推送消息级别
@property (nonatomic, copy, nullable) RCImportanceHw importanceHW;
/// 华为通知栏消息右侧大图标 URL
///
/// 如果不设置则不展示通知栏右侧图标URL 使用的协议必须是 HTTPS 协议。
/// 图标文件须小于 512KB图标建议规格大小40dp x 40dp弧角大小为 8dp超出建议规格大小的图标会存在图片压缩或显示不全的情况。
@property (nonatomic, copy, nullable) NSString *hwImageUrl;
/// 华为推送消息分类:
/// - 社交通讯:即时通讯 [IM],音频、视频通话 [VOIP]
/// - 服务提醒:订阅 [SUBSCRIPTION],出行 [TRAVEL],健康 [HEALTH],工作事项提醒 [WORK],帐号动态 [ACCOUNT],订单&物流 [EXPRESS],财务 [FINANCE],系统提示 [SYSTEM_REMINDER],邮件 [MAIL]
/// - 资讯营销类:内容资讯/新闻/财经动态/生活资讯/社交动态/调研/其他 [MARKETING]
/// - 营销活动:产品促销/功能推荐/运营活动/MARKETING
///
/// 更多信息请参考华为消息分类标准文档https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/message-classification-0000001149358835
///
/// 默认值为 null如果为 null则以服务配置为准
///
/// - Since: 5.4.0
@property (nonatomic, copy, nullable) NSString *categoryHW;
#pragma mark - Honor
/// 荣耀推送消息级别
@property (nonatomic, copy, nullable) RCImportanceHonor importanceHonor;
/// 荣耀通知栏消息右侧大图标 URL
@property (nonatomic, copy, nullable) NSString *imageUrlHonor;
#pragma mark - OPPO
/// OPPO 的渠道 ID
///
/// 该条消息针对 OPPO 使用的推送渠道,如开发者集成了 OPPO 推送,需要指定 channelId 时,可向 Android 端研发人员获取channelId 由开发者自行创建。
@property (nonatomic, copy, nullable) NSString *channelIdOPPO;
#pragma mark - VIVO
/// VIVO 推送通道类型
/// 开发者集成了 VIVO 推送,需要指定推送类型时,可进行设置。
/// 目前可选值 "0"(运营消息) 和 "1"(系统消息)
@property (nonatomic, copy, nullable) NSString *typeVivo;
/// Vivo 推送消息分类
///
/// 系统消息分类
/// 即时消息 [IM],账号与资产 [ACCOUNT],日程待办 [TODO],设备信息 [DEVICE_REMINDER],订单与物流 [ORDER],订阅提醒 [SUBSCRIPTION]
/// 运营消息分类
/// 新闻 [NEWS],内容推荐 [CONTENT],运营活动 [MARKETING],社交动态 [SOCIAL]
/// 更多信息请参考 Vivo 消息分类标准文档https://dev.vivo.com.cn/documentCenter/doc/359
///
/// 默认值为 null如果为 null则以服务配置为准
///
/// - Since: 5.4.2
@property (nonatomic, copy, nullable) NSString *categoryVivo;
#pragma mark - FCM
/// FCM 通知的频道 ID
///
/// 该应用程序必须使用此频道 ID 创建一个频道,然后才能收到带有该频道 ID 的任何通知。如果您未在请求中发送此频道 ID或者如果应用尚未创建提供的频道 ID则 FCM 使用应用清单中指定的频道 ID。
@property (nonatomic, copy, nullable) NSString *fcmChannelId;
/// FCM 通知类型推送时所使用的分组 id
@property (nonatomic, copy, nullable) NSString *fcmCollapseKey;
/// FCM 通知类型的推送所使用的通知图片 url
@property (nonatomic, copy, nullable) NSString *fcmImageUrl;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,34 @@
//
// RCAppSettings.h
// RongIMLibCore
//
// Created by shuai shao on 2025/6/9.
// Copyright © 2025 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCStatusDefine.h>
NS_ASSUME_NONNULL_BEGIN
/// 当前 AppKey 对应的配置。
///
/// - Since: 5.22.0
@interface RCAppSettings : NSObject
/// 语音转文字功能是否开启。
@property (nonatomic, readonly, assign) BOOL isSpeechToTextEnable;
/// 消息可编辑的有效时间,单位:分钟。
///
/// - Since: 5.26.0
@property (nonatomic, readonly, assign) NSInteger messageModifiableMinutes;
/// 已读回执版本
///
/// - Since: 5.30.0
@property (nonatomic, readonly, assign) RCMessageReadReceiptVersion readReceiptVersion;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,63 @@
//
// RCBlockedMessageInfo.h
// RongIMLibCore
//
// Created by 孙浩 on 2021/7/9.
// Copyright © 2021 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCStatusDefine.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCBlockedMessageInfo : NSObject
/// 会话类型
@property (nonatomic, assign) RCConversationType type;
/// 会话 ID
@property (nonatomic, copy) NSString *targetId;
/// 频道 ID
@property (nonatomic, copy, nullable) NSString *channelId;
/// 被拦截的消息 UID
@property (nonatomic, copy) NSString *blockedMsgUId;
/// 拦截原因
/// 1. 全局敏感词:命中了融云内置的全局敏感词
/// 2. 自定义敏感词拦截:命中了客户在融云自定义的敏感词
/// 3. 第三方审核拦截:命中了第三方(数美)或消息回调服务决定不下发的状态
@property (nonatomic, assign) RCMessageBlockType blockType;
/// 附加信息
@property (nonatomic, copy, nullable) NSString *extra;
/// 消息的发送时间Unix 时间戳、毫秒)
@property (nonatomic, assign) long long sentTime;
/// 消息源触发类型。0 默认原始消息1 消息扩展2 消息修改
@property (nonatomic, assign) NSInteger sourceType;
/// 源内容 Json 字符串。sourceType 为 1、2 时返回1 扩展内容2 消息内容
///
/// - sourceType 为 0sourceContent 内容为 nil
/// - sourceType 为 1sourceContent 是扩展内容,示例 {"mid":"xxx-xxx-xxx-xxx","put":{"key":"敏感词"}}
/// - sourceType 为 2sourceContent 是消息修改后内容,示例 {"content":"敏感词"}
@property (nonatomic, copy) NSString *sourceContent;
/// RCBlockedMessageInfo 初始化方法
///
/// - Parameter type: 会话类型
/// - Parameter targetId: 会话 ID
/// - Parameter blockedMsgUId: 被拦截的消息 ID
/// - Parameter blockType: 会话 id
- (instancetype)initWithConversationType:(RCConversationType)type
targetId:(NSString *)targetId
blockedMsgUId:(NSString *)blockedMsgUId
blockType:(RCMessageBlockType)blockType;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,19 @@
//
// RCChannelIdentifier.h
// RongIMLibCore
//
// Created by RobinCui on 2023/1/3.
// Copyright © 2023 RongCloud. All rights reserved.
//
//#import <RongIMLibCore/RongIMLibCore.h>
#import <RongIMLibCore/RCConversationIdentifier.h>
NS_ASSUME_NONNULL_BEGIN
/// - Since: 5.4.0
@interface RCChannelIdentifier : RCConversationIdentifier
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,20 @@
//
// RCClearConversationOption.h
// RongIMLibCore
//
// Created by 孙浩 on 2021/8/23.
// Copyright © 2021 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCClearConversationOption : NSObject
/// 是否清除本地历史消息
@property (nonatomic, assign) BOOL isDeleteMessage;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,28 @@
//
// RCClearMessageOption.h
// RongIMLibCore
//
// Created by chinaspx on 2023/9/18.
// Copyright © 2023 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCStatusDefine.h>
NS_ASSUME_NONNULL_BEGIN
/// - Since: 5.6.7
@interface RCClearMessageOption : NSObject
/// 会话类型
@property (nonatomic, assign) RCConversationType type;
/// 会话 ID
@property (nonatomic, copy) NSString *targetId;
/// channel ID
@property (nonatomic, copy) NSString *channelId;
/// timestamp 时间戳(毫秒)
@property (nonatomic, assign) long long timestamp;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,51 @@
//
// RCCombineMessage.h
// RongIMLib
//
// Created by liyan on 2019/8/13.
// Copyright © 2019 RongCloud. All rights reserved.
//
#import <RongIMLibCore/RongIMLibCore.h>
NS_ASSUME_NONNULL_BEGIN
/// 合并转发消息的类型名
#define RCCombineMessageTypeIdentifier @"RC:CombineMsg"
/// 合并转发消息类
///
/// 合并转发消息,此消息会进行存储并计入未读消息数。
///
/// 该消息不支持超级群的会话类型。
///
/// - Remark: 内容类消息
@interface RCCombineMessage : RCMediaMessageContent
/// 转发的消息展示的缩略内容列表 (格式是发送者:缩略内容)
@property (nonatomic, strong) NSArray *summaryList;
/// 转发的全部消息的发送者名称列表(单聊是经过排重的,群聊是群组名称)
@property (nonatomic, strong) NSArray *nameList;
/// 转发的消息会话类型(目前仅支持单聊和群聊)
@property (nonatomic, assign) RCConversationType conversationType;
/// 初始化 RCCombineMessage 消息
///
/// - Parameter summaryList: 转发的消息展示的缩略内容列表
/// - Parameter nameList: 转发的全部消息的发送者名称列表(单聊是经过排重的,群聊是群组名称)
/// - Parameter conversationType: 转发的消息会话类型
/// - Parameter content: 转发的内容
///
/// - Returns: 消息对象
+ (instancetype)messageWithSummaryList:(NSArray *)summaryList
nameList:(NSArray *)nameList
conversationType:(RCConversationType)conversationType
content:(NSString *)content;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,62 @@
//
// RCCombineV2Message.h
// GlobalIMUIKit
//
// Created by zgh on 2023/11/6.
//
#import <RongIMLibCore/RongIMLibCore.h>
NS_ASSUME_NONNULL_BEGIN
/// 合并转发消息的类型名
#define RCCombineV2MessageTypeIdentifier @"RC:CombineV2Msg"
@interface RCCombineV2Message : RCMediaMessageContent
/// 转发的消息会话类型(目前仅支持单聊和群聊)。
@property (nonatomic, assign, readonly) RCConversationType conversationType;
/// 转发的消息展示的缩略内容列表 (格式是发送者:缩略内容)。
@property (nonatomic, readonly) NSArray<NSString *> *summaryList;
/// 转发的全部消息的发送者名称列表(单聊是经过排重的,群聊是群组名称)。
@property (nonatomic, readonly) NSArray<NSString *> *nameList;
/// 被转发的消息条数。
@property (nonatomic, assign, readonly) NSUInteger msgNum;
/// 消息列表。当被转发的消息长度之和小于等于 12K 时才会有此字段,此时不会有 JsonMsgKey 字段。
/// [
/// {
/// "fromUserId":"uid_A",
/// "targetId":"group1",
/// "timestamp":1693382006578,
/// "objectName":"RC:TxtMsg",
/// "content":{
/// "content":"大家觉得这个怎么样?"
/// }
/// }
/// ]
@property (nonatomic, readonly, nullable) NSArray<NSDictionary<NSString *, id<NSCoding>> *> *msgList;
/// 合并转发的消息列表 Key。当被转发的消息长度之和大于 12K 时才会有此字段,此时不会有 msgList 字段。
@property (nonatomic, readonly, nullable) NSString *jsonMsgKey;
/// 初始化 RCCombineV2Message 消息
///
/// - Parameter summaryList: 转发的消息展示的缩略内容列表
/// - Parameter nameList: 转发的全部消息的发送者名称列表(单聊是经过排重的,群聊是群组名称)
/// - Parameter conversationType: 转发的消息会话类型
/// - Parameter msgList: 转发的消息体列表
///
/// - Returns: 消息实例对象
+ (instancetype)messageWithSummaryList:(NSArray<NSString *> *)summaryList
nameList:(NSArray<NSString *> *)nameList
conversationType:(RCConversationType)conversationType
messages:(NSArray<RCMessage *> *)messages;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,41 @@
//
// RCCommandMessage.h
// RongIMLib
//
// Created by 张改红 on 15/12/2.
// Copyright © 2015 年 RongCloud. All rights reserved.
//
#import <RongIMLibCore/RCMessageContent.h>
/// 命令消息的类型名
#define RCCommandMessageIdentifier @"RC:CmdMsg"
NS_ASSUME_NONNULL_BEGIN
/// 命令消息类
///
/// 命令消息类,此消息不存储不计入未读消息数。
/// 与 RCCommandNotificationMessage 的区别是,此消息不存储,也不会在界面上显示。
///
/// - Remark: 通知类消息
@interface RCCommandMessage : RCMessageContent <NSCoding>
/// 命令的名称
@property (nonatomic, copy) NSString *name;
/// 命令的扩展数据
///
/// 命令的扩展数据,可以为任意字符串,如存放您定义的 json 数据。
@property (nonatomic, copy, nullable) NSString *data;
/// 初始化命令消息
///
/// - Parameter name: 命令的名称
/// - Parameter data: 命令的扩展数据
///
/// - Returns: 命令消息对象
+ (instancetype)messageWithName:(NSString *)name data:(nullable NSString *)data;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,46 @@
/**
* Copyright (c) 2014-2015, RongCloud.
* All rights reserved.
*
* All the contents are the copyright of RongCloud Network Technology Co.Ltd.
* Unless otherwise credited. http://rongcloud.cn
*
*/
// RCCommandNotificationMessage.h
// Created by xugang on 14/11/28.
#import <RongIMLibCore/RCMessageContent.h>
/// 命令提醒消息的类型名
#define RCCommandNotificationMessageIdentifier @"RC:CmdNtf"
NS_ASSUME_NONNULL_BEGIN
/// 命令提醒消息类
///
/// 此消息会进行存储,但不计入未读消息数。
/// 与 RCCommandMessage 的区别是,此消息会进行存储并在界面上显示。
///
/// - Remark: 通知类消息
@interface RCCommandNotificationMessage : RCMessageContent <NSCoding>
/// 命令提醒的名称
@property (nonatomic, copy) NSString *name;
/// 命令提醒消息的扩展数据
///
/// 命令提醒消息的扩展数据,可以为任意字符串,如存放您定义的 json 数据。
@property (nonatomic, copy, nullable) NSString *data;
/// 初始化命令提醒消息
///
/// - Parameter name: 命令的名称
/// - Parameter data: 命令的扩展数据
///
/// - Returns: 命令提醒消息对象
+ (instancetype)notificationWithName:(NSString *)name data:(nullable NSString *)data;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,72 @@
/**
* Copyright (c) 2014-2015, RongCloud.
* All rights reserved.
*
* All the contents are the copyright of RongCloud Network Technology Co.Ltd.
* Unless otherwise credited. http://rongcloud.cn
*
*/
// RCContactNotificationMessage.h
// Created by xugang on 14/11/28.
#import <RongIMLibCore/RCMessageContent.h>
/// 好友请求消息的类型名
#define RCContactNotificationMessageIdentifier @"RC:ContactNtf"
/// 请求添加好友
#define ContactNotificationMessage_ContactOperationRequest @"Request"
/// 同意添加好友的请求
#define ContactNotificationMessage_ContactOperationAcceptResponse @"AcceptResponse"
/// 拒绝添加好友的请求
#define ContactNotificationMessage_ContactOperationRejectResponse @"RejectResponse"
NS_ASSUME_NONNULL_BEGIN
/// 好友请求消息类
///
/// 好友请求消息类,此消息会进行存储,但不计入未读消息数。
///
/// - Remark: 通知类消息
@interface RCContactNotificationMessage : RCMessageContent <NSCoding>
/// 好友请求的当前操作名
///
/// 好友请求当前的操作名称,您可以使用预定义好的操作名,也可以是您自己定义的任何操作名。
/// 预定义的操作名ContactNotificationMessage_ContactOperationRequest、ContactNotificationMessage_ContactOperationAcceptResponse、ContactNotificationMessage_ContactOperationRejectResponse。
@property (nonatomic, copy) NSString *operation;
/// 当前操作发起用户的用户 ID
@property (nonatomic, copy) NSString *sourceUserId;
/// 当前操作目标用户的用户 ID
@property (nonatomic, copy) NSString *targetUserId;
/// 当前操作的消息内容
///
/// 当前操作的消息内容,如同意、拒绝的理由等。
@property (nonatomic, copy) NSString *message;
/// 初始化好友请求消息
///
/// - Parameter operation: 好友请求当前的操作名
/// - Parameter sourceUserId: 当前操作发起用户的用户 ID
/// - Parameter targetUserId: 当前操作目标用户的用户 ID
/// - Parameter message: 当前操作的消息内容
/// - Parameter extra: 当前操作的附加信息
/// - Returns: 好友请求消息对象
///
/// 融云不介入您的好友关系,所有的好友关系都由您的服务器自己维护。
/// 所以好友请求的操作名和消息内容、扩展信息您均可以自己定制,只要您发送方和接收方针对具体字段内容做好 UI 显示即可。
+ (instancetype)notificationWithOperation:(NSString *)operation
sourceUserId:(NSString *)sourceUserId
targetUserId:(NSString *)targetUserId
message:(NSString *)message
extra:(nullable NSString *)extra;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,186 @@
/**
* Copyright (c) 2014-2015, RongCloud.
* All rights reserved.
*
* All the contents are the copyright of RongCloud Network Technology Co.Ltd.
* Unless otherwise credited. http://rongcloud.cn
*
*/
// RCConversation.h
// Created by Heq.Shinoda on 14-6-13.
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCMessageContent.h>
NS_ASSUME_NONNULL_BEGIN
@class RCReadReceiptInfo, RCGroupReadReceiptInfoV2, RCMessageConfig;
@class RCReceivedStatusInfo, RCMessage;
@class RCEditedMessageDraft;
/// 会话类,包含会话的所有属性。
@interface RCConversation : NSObject <NSCoding>
/// 会话类型
@property (nonatomic, assign) RCConversationType conversationType;
/// 会话 ID
@property (nonatomic, copy) NSString *targetId;
/// 该会话的业务标识,长度限制 20 字符
@property (nonatomic, copy, nullable) NSString *channelId;
/// 会话的标题
@property (nonatomic, copy, nullable) NSString *conversationTitle;
/// 会话中的未读消息数量
@property (nonatomic, assign) int unreadMessageCount;
/// 是否置顶,默认值为 NO
/// 如果设置了置顶,在 IMKit 的 RCConversationListViewController 中会将此会话置顶显示。
@property (nonatomic, assign) BOOL isTop;
/// 当前会话在此 tag 下的置顶状态。
/// 仅在通过 tag 获取会话时 getConversationsFromTagByPage此字段有效。
@property (nonatomic, assign) BOOL isTopForTag;
/// 会话中最后一条消息的接收状态
@property (nonatomic, assign) RCReceivedStatus receivedStatus __deprecated_msg("Use receivedStatusInfo instead");
/// 会话中最后一条消息的接收状态类 (针对接收的消息生效)
/// - Since: 5.6.8
@property (nonatomic, strong, nullable) RCReceivedStatusInfo *receivedStatusInfo;
/// 会话中最后一条消息的发送状态
@property (nonatomic, assign) RCSentStatus sentStatus;
/// 会话中最后一条消息的接收时间Unix 时间戳、毫秒)
@property (nonatomic, assign) long long receivedTime;
/// 会话中最后一条消息的发送时间Unix 时间戳、毫秒)
@property (nonatomic, assign) long long sentTime;
/// 会话的操作时间Unix 时间戳、毫秒),用于分页获取会话列表时传入的时间戳
/// 初始值与 sentTime 相同,置顶等操作会更新此时间戳
/// - Since: 5.6.7
@property (nonatomic, assign) long long operationTime;
/// 会话中存在的草稿
@property (nonatomic, copy, nullable) NSString *draft;
/// 会话中最后一条消息的类型名
@property (nonatomic, copy, nullable) NSString *objectName;
/// 会话中最后一条消息的发送者用户 ID
@property (nonatomic, copy, nullable) NSString *senderUserId;
/// 会话中最后一条消息的消息 ID
@property (nonatomic, assign) long latestMessageId;
/// 会话中最后一条消息的内容
@property (nonatomic, strong, nullable) RCMessageContent *latestMessage;
/// 会话中最后一条的完整消息体
@property (nonatomic, strong, readonly, nullable) RCMessage *latestRCMessage;
/// 会话中最后一条消息的方向
@property (nonatomic, assign) RCMessageDirection latestMessageDirection;
/// 会话中最后一条消息的 json Dictionary
///
/// 此字段存放最后一条消息内容中未编码的 json 数据。
/// SDK 内置的消息,如果消息解码失败,默认会将消息的内容存放到此字段;如果编码和解码正常,此字段会置为 nil。
@property (nonatomic, strong, nullable) NSDictionary *jsonDict;
/// 最后一条消息的全局唯一 ID
///
/// 服务器消息唯一 ID在同一个 AppKey 下全局唯一)
@property (nonatomic, copy, nullable) NSString *latestMessageUId;
/// 会话中是否存在被 @ 的消息
///
/// 在清除会话未读数clearMessagesUnreadStatus:targetId:)的时候,会将此状态置成 NO。
@property (nonatomic, assign, readonly) BOOL hasUnreadMentioned;
/// 会话中 @ 消息的总个数(包含 @ 我的个数和 @ 所有人的个数)
///
/// 在清除会话未读数clearMessagesUnreadStatus:targetId:)的时候,会将此值置成 0。
@property (nonatomic, assign) int mentionedCount;
/// 超级群会话中 @ 我的消息的个数
///
/// 只有超级群获取频道列表时有效
/// 在清除会话未读数clearMessagesUnreadStatus:targetId:)的时候,会将此值置成 0。
@property (nonatomic, assign) int mentionedMeCount;
/// 会话是否是免打扰状态
@property (nonatomic, assign) RCConversationNotificationStatus blockStatus;
/// 最后一条消息的阅读回执状态
@property (nonatomic, strong, nullable) RCReadReceiptInfo *latestMessageReadReceiptInfo;
/// 最后一条消息的群阅读回执状态
///
/// 如果是调用 RCGroupReadReceiptV2Manager 中方法实现群已读回执功能,此参数才有效,否则请使用 readReceiptInfo 属性获取阅读回执状态
/// 如果使用 IMKit请用 readReceiptInfo 属性
@property (nonatomic, strong, nullable) RCGroupReadReceiptInfoV2 *latestMessageGroupReadReceiptInfoV2;
/// 最后一条消息的消息配置
@property (nonatomic, strong, nullable) RCMessageConfig *latestMessageMessageConfig;
/// 最后一条消息是否可以包含扩展信息
///
/// 该属性在消息发送时确定,发送之后不能再做修改
/// 扩展信息只支持单聊和群组,其它会话类型不能设置扩展信息
@property (nonatomic, assign) BOOL latestMessageCanIncludeExpansion;
/// 最后一条消息的扩展信息列表
///
/// 扩展信息只支持单聊和群组,其它会话类型不能设置扩展信息
/// 默认消息扩展字典 key 长度不超过 32value 长度不超过 4096单次设置扩展数量最大为 20消息的扩展总数不能超过 300
@property (nonatomic, strong, nullable) NSDictionary<NSString *, NSString *> *latestMessageExpansion;
/// 免打扰级别
@property (nonatomic, assign) RCPushNotificationLevel notificationLevel;
/// 超级群频道类型,只有 ConversationType 为超级群时该字段有效,非超级群时为 0
@property (nonatomic, assign) RCUltraGroupChannelType channelType;
/// 会话中第一条未读消息时间戳Unix 时间戳、毫秒)
///
/// 仅支持 超级群会话
/// - Since: 5.2.5
@property (nonatomic, assign) long long firstUnreadMsgSendTime;
/// 文本消息翻译方式。
///
/// - Since: 5.24.0
@property (nonatomic, assign) RCTranslateStrategy translateStrategy;
@property (nonatomic, strong) RCEditedMessageDraft *editedMessageDraft;
@end
@interface RCConversation (deprecated)
/// 会话中最后一条消息的消息 ID
@property (nonatomic, assign) long lastestMessageId __deprecated_msg("Use latestMessageId instead");
/// 会话中最后一条消息的内容
@property (nonatomic, strong, nullable) RCMessageContent *lastestMessage __deprecated_msg("Use latestMessage instead");
/// 会话中最后一条消息的方向
@property (nonatomic, assign)
RCMessageDirection lastestMessageDirection __deprecated_msg("Use latestMessageDirection instead");
/// 最后一条消息的全局唯一 ID
///
/// 服务器消息唯一 ID在同一个 AppKey 下全局唯一)
@property (nonatomic, copy, nullable) NSString *lastestMessageUId __deprecated_msg("Use latestMessageUId instead");
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,29 @@
//
// RCConversationBatchDeletionParams.h
// RongIMLibCore
//
// Created by RongCloud on 2025/8/5.
// Copyright © 2025 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class RCConversationIdentifier;
@interface RCConversationBatchDeletionParams : NSObject
/// 待删除的会话列表,最多同时删除 100 个会话
@property (nonatomic, copy) NSArray<RCConversationIdentifier *> *identifiers;
/// 是否同步删除服务器端会话
@property (nonatomic, assign) BOOL deleteRemotely;
///是否同步删除会话中的历史消息
/// 1. 当 deleteRemotely && deleteMessages 为 YES 时,将同时删除本地和远端会话中的历史消息
/// 2. 当 deleteRemotely 为 NO 而 deleteMessages 为 YES 时,只删除本地会话中的历史消息
/// 3. 当 deleteMessages 为 NO只删会话
@property (nonatomic, assign) BOOL deleteMessages;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,126 @@
//
// RCConversationChannelProtocol.h
// RongIMLibCore
//
// Created by Sin on 2021/3/5.
// Copyright © 2021 RongCloud. All rights reserved.
//
#ifndef RCConversationChannelProtocol_h
#define RCConversationChannelProtocol_h
#import <RongIMLibCore/RCUltraGroupChannelChangeInfo.h>
NS_ASSUME_NONNULL_BEGIN
@class RCUserTypingStatus;
@protocol RCConversationChannelMessageReceiptDelegate <NSObject>
@optional
/*!
请求消息已读回执(收到需要阅读时发送回执的请求,收到此请求后在会话页面已经展示该 messageUId 对应的消息或者调用
getHistoryMessages 获取消息的时候,包含此 messageUId 的消息,需要调用 sendMessageReadReceiptResponse
接口发送消息阅读回执)
- Parameter messageUId: 请求已读回执的消息ID
- Parameter conversationType: conversationType
- Parameter targetId: targetId
- Parameter channelId: 所属会话的业务标识
*/
- (void)onMessageReceiptRequest:(RCConversationType)conversationType
targetId:(NSString *)targetId
channelId:(nullable NSString *)channelId
messageUId:(NSString *)messageUId;
/*!
消息已读回执响应(收到阅读回执响应,可以按照 messageUId 更新消息的阅读数)
- Parameter messageUId: 请求已读回执的消息ID
- Parameter conversationType: conversationType
- Parameter targetId: targetId
- Parameter channelId: 所属会话的业务标识
- Parameter userIdList: 已读userId列表
*/
- (void)onMessageReceiptResponse:(RCConversationType)conversationType
targetId:(NSString *)targetId
channelId:(nullable NSString *)channelId
messageUId:(NSString *)messageUId
readerList:(NSMutableDictionary *)userIdList;
@end
@protocol RCConversationChannelTypingStatusDelegate <NSObject>
/*!
用户输入状态变化的回调
- Parameter conversationType: 会话类型
- Parameter targetId: 会话目标ID
- Parameter channelId: 所属会话的业务标识
- Parameter userTypingStatusList: 正在输入的RCUserTypingStatus列表nil表示当前没有用户正在输入
当客户端收到用户输入状态的变化时会回调此接口通知发生变化的会话以及当前正在输入的RCUserTypingStatus列表。
*/
- (void)onTypingStatusChanged:(RCConversationType)conversationType
targetId:(NSString *)targetId
channelId:(nullable NSString *)channelId
status:(nullable NSArray<RCUserTypingStatus *> *)userTypingStatusList;
@end
#pragma mark - 超级群会话代理
@protocol RCUltraGroupConversationDelegate <NSObject>
//超级群会话列表与会话最后一条消息同步完成
- (void)ultraGroupConversationListDidSync;
@end
@protocol RCUltraGroupChannelDelegate <NSObject>
/*!
超级群类型变更通知
1. 公有频道变私有频道时,公有频道所有用户会收到该通知
a. 在私有频道白名单内的用户,收到的变更类型是 PublicToPrivate(公有频道变私有频道前,可以提前将用户加入私有频道白名单)
b. 不在私有频道白名单的其他用户,变更类型为 PublicToPrivateUserNotIn
2. 私有频道变公有频道时,私有频道白名单中的用户收到通知,变更类型为 PrivateToPublic
- Parameter infoList: 频道变更信息
当客户端收到频道变更时,会回调此接口,通知发生变化的会话频道列表。
该功能仅支持超级群。
*/
- (void)ultraGroupChannelTypeDidChanged:(NSArray<RCUltraGroupChannelChangeTypeInfo *> *)infoList;
/*!
频道白名单用户被移除通知(当前仅支持私有频道)
1. 公有频道时,将用户从私有频道白名单移除时,不通知
2. 私有频道时,将用户从白名单移除时,仅通知私有频道所有用户,含被踢的用户
3. 清理本地数据
a. 当被踢用户为当前用户时:用户本地会话删除,本地会话的消息保留
b. 当被踢用户为其他人时:不做任何处理
- Parameter infoList: 频道变更信息
当客户端收到用户被移除频道时,会回调此接口,通知发生变化的会话频道列表。
该功能仅支持超级群。
*/
- (void)ultraGroupChannelUserDidKicked:(NSArray<RCUltraGroupChannelUserKickedInfo *> *)infoList;
/*!
删除频道通知,可以认为是频道解散。
1. 公有频道时,删除频道通知频道中所有人
2. 私有频道时,删除频道通知白名单中所有人
3. 清理本地数据:用户本地会话删除,本地会话的消息保留
- Parameter infoList: 频道变更信息
当客户端收到频道解散时,会回调此接口,通知发生变化的会话频道列表。
该功能仅支持超级群。
*/
- (void)ultraGroupChannelDidDisbanded:(NSArray<RCUltraGroupChannelDisbandedInfo *> *)infoList;
@end
NS_ASSUME_NONNULL_END
#endif /* RCConversationChannelProtocol_h */

View File

@@ -0,0 +1,51 @@
//
// RCConversationFilterOption.h
// RongIMLibCore
//
// Created by chinaspx on 2025/3/25.
// Copyright © 2025 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCStatusDefine.h>
NS_ASSUME_NONNULL_BEGIN
/// 会话类型过滤。
///
/// - Since: 5.20.0
@interface RCConversationTypeFilter : NSObject
/// 会话类型
@property (nonatomic, assign, readonly) RCConversationType type;
/// 频道 ID有效值包含 @"" 或有效字符串无效值nil 不包含 channelId 的条件查询
/// 单群聊未启用 channelId 传 nil启用则传真实有效值
@property (nonatomic, copy, nullable) NSString *channelId;
/// 构造方法。
/// - Parameter type: 会话类型。
- (instancetype)initWithType:(RCConversationType)type;
@end
/// 会话列表参数配置。
///
/// - Since: 5.20.0
@interface RCConversationListOption : NSObject
/// 获取的数量,默认为 20。
/// 当实际取回的会话数量小于 count 值时,表明已取完数据。
@property (nonatomic, assign) NSInteger count;
/// 会话的时间戳单位毫秒。获取这个时间戳之前的会话列表0 表示从最新开始获取。
@property (nonatomic, assign) long long startTime;
/// 查询结果的排序方式,是否置顶优先,传 YES 表示置顶会话优先返回,否则结果只以会话时间排序。
/// 默认为 YES。
@property (nonatomic, assign) BOOL topPriority;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,44 @@
//
// RCConversationIdentifier.h
// RongIMLib
//
// Created by 张改红 on 2021/1/27.
// Copyright © 2021 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCStatusDefine.h>
NS_ASSUME_NONNULL_BEGIN
/// 会话标识
@interface RCConversationIdentifier : NSObject
/// 会话类型
@property (nonatomic, assign) RCConversationType type;
/// 会话 ID
@property (nonatomic, copy) NSString *targetId;
/// 频道 ID
/// - Since: 5.6.7
@property (nonatomic, copy, nullable) NSString *channelId;
/// 初始化方法
///
/// - Parameter type: 会话类型
/// - Parameter targetId: 会话 ID
- (instancetype)initWithConversationIdentifier:(RCConversationType)type targetId:(NSString *)targetId;
/// 初始化方法
///
/// - Parameter type: 会话类型
/// - Parameter targetId: 会话 id
/// - Parameter channel: 频道 id
/// - Since: 5.6.7
- (instancetype)initWithConversationIdentifier:(RCConversationType)type
targetId:(NSString *)targetId
channelId:(nullable NSString *)channelId;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,69 @@
//
// RCConversationStatusInfo.h
// RongIMLib
//
// Created by liyan on 2020/5/13.
// Copyright © 2020 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCStatusDefine.h>
/// 会话状态类型
typedef NS_ENUM(NSUInteger, RCConversationStatusType) {
/// 免打扰
RCConversationStatusType_Mute = 1,
/// 置顶
RCConversationStatusType_Top = 2,
/// 翻译
RCConversationStatusType_Translation = 4
};
NS_ASSUME_NONNULL_BEGIN
@interface RCConversationStatusInfo : NSObject
/// 会话类型
@property (nonatomic, assign) RCConversationType conversationType;
/// 会话 ID
@property (nonatomic, copy) NSString *targetId;
/// 所属会话的业务标识
@property (nonatomic, copy, nullable) NSString *channelId;
/// 会话状态改变的类型
@property (nonatomic, assign) RCConversationStatusType conversationStatusType;
/*!
如果 conversationStatusType = RCConversationStatusType_MuteconversationStatusValue = 1 是提醒conversationStatusValue = 0 是免打扰。
如果 conversationStatusType = RCConversationStatusType_TopconversationStatusValue = 0 是不置顶conversationStatusValue = 1 是置顶。
如果 conversationStatusType = RCConversationStatusType_TranslationconversationStatusValue 代表以下功能:
RCTranslateStrategyDefault = 0, 默认,会跟随用户级别的自动翻译方式。
RCTranslateStrategyAutoOn = 1,自动翻译
RCTranslateStrategyAutoOff = 2 手动翻译
*/
@property (nonatomic, assign) int conversationStatusValue;
/*!
会话免打扰类型
当 conversationStatusType = RCConversationStatusType_Mute 时notificationLevel 值为有效值。
*/
@property (nonatomic, assign) RCPushNotificationLevel notificationLevel;
@end
@interface RCConversationStatusInfo (deprecated)
@property (nonatomic, assign) int conversationStatusvalue __deprecated_msg("Use conversationStatusValue instead");
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,25 @@
//
// ConversationTagInfo.h
// RongIMLib
//
// Created by 张改红 on 2021/1/27.
// Copyright © 2021 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCTagInfo.h>
NS_ASSUME_NONNULL_BEGIN
/// 会话所属的标签信息
@interface RCConversationTagInfo : NSObject
/// 标签 ID
@property (nonatomic, strong) RCTagInfo *tagInfo;
/// 会话是否置顶
@property (nonatomic, assign) BOOL isTop;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,31 @@
//
// RCConversationTopOption.h
// RongIMLibCore
//
// Created by shuai shao on 2025/4/3.
// Copyright © 2025 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/// 设置置顶的配置信息。
///
/// - Since: 5.20.0
@interface RCConversationTopOption : NSObject
/// 是否更新会话的操作时间。默认值为 YES。
@property (nonatomic, assign) BOOL needUpdateTime;
/// 会话不存在时,是否需要创建会话。默认值为 YES。
@property (nonatomic, assign) BOOL needCreateConversation;
/// 初始化方法。
/// - Parameter needUpdateTime: 是否更新时间。
/// - Parameter needCreateConversation: 是否创建会话。
- (instancetype)initWithNeedUpdateTime:(BOOL)needUpdateTime needCreateConversation:(BOOL)needCreateConversation;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,42 @@
//
// RCConversationUnreadInfo.h
// RongIMLibCore
//
// Created by shuai shao on 2023/6/2.
// Copyright © 2023 RongCloud. All rights reserved.
//
#import <RongIMLibCore/RongIMLibCore.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCConversationUnreadInfo : NSObject
/// 会话类型
@property (nonatomic, assign) RCConversationType conversationType;
/// 会话 ID
@property (nonatomic, copy) NSString *targetId;
/// 该会话的业务标识,长度限制 20 字符
@property (nonatomic, copy, nullable) NSString *channelId;
/// 会话中的未读消息数量
@property (nonatomic, assign) int unreadMessageCount;
/// 会话中 @ 消息的总个数(包含 @ 我的个数和 @ 所有人的个数)
@property (nonatomic, assign) int mentionedCount;
/// 超级群会话中 @ 我的消息的个数
/// 只有超级群获取频道列表时有效
@property (nonatomic, assign) int mentionedMeCount;
/// 免打扰级别
@property (nonatomic, assign) RCPushNotificationLevel notificationLevel;
/// 初始化
- (instancetype)initWithConversation:(RCConversation *)conversation;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,27 @@
//
// RCDownloadInfo.h
// RongIMLibCore
//
// Created by Lang on 2024/1/30.
// Copyright © 2024 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/// 文件下载信息
@interface RCDownloadInfo : NSObject
/// 文件总大小
@property (nonatomic, assign) long totalLength;
/// 文件当前下载的大小
@property (nonatomic, assign) long currentLength;
/// 文档当前的下载进度 0 - 100
@property (nonatomic, assign) int currentProgress;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,115 @@
//
// RCEDownloadItem.h
// RongEnterpriseApp
//
// Created by zhaobingdong on 2018/5/15.
// Copyright © 2018 年 rongcloud. All rights reserved.
//
///
/// - Warning: 此类不支持异步拦截下载 [RCDownloadInterceptor onDownloadRequest:withRequestHandler:]
/// - Warning: Since 5.8.0 开始支持同步拦截下载 [RCDownloadInterceptor onDownloadRequest:]
///
#import <Foundation/Foundation.h>
/**
下载状态枚举
- RCDownloadItemStateWaiting: 等待
- RCDownloadItemStateChecking: 正在检测是否支持 Range
- RCDownloadItemStateRunning: 正在下载
- RCDownloadItemStateSuspended: 暂停
- RCDownloadItemStateCanceled: 已取消
- RCDownloadItemStateCompleted: 完成
- RCDownloadItemStateFailed: 失败
*/
typedef NS_ENUM(NSInteger, RCDownloadItemState) {
RCDownloadItemStateWaiting = 0,
RCDownloadItemStateChecking,
RCDownloadItemStateRunning,
RCDownloadItemStateSuspended,
RCDownloadItemStateCanceled,
RCDownloadItemStateCompleted,
RCDownloadItemStateFailed
};
NS_ASSUME_NONNULL_BEGIN
@class RCDownloadItem;
@protocol RCDownloadItemDelegate <NSObject>
/**
下载任务状态变化时调用
- Parameter item: 下载任务对象
- Parameter state: 状态
*/
- (void)downloadItem:(RCDownloadItem *)item state:(RCDownloadItemState)state;
/**
下载进度上报时调用
- Parameter item: 下载任务
- Parameter progress: 下载进度
*/
- (void)downloadItem:(RCDownloadItem *)item progress:(float)progress;
/**
任务结束时调用
- Parameter item: 下载任务
- Parameter error: 错误信息对象,成功时为 nil
- Parameter path: 下载完成后文件的路径,此路径为相对路径,相对于沙盒根目录 NSHomeDirectory
*/
- (void)downloadItem:(RCDownloadItem *)item
didCompleteWithError:(nullable NSError *)error
filePath:(nullable NSString *)path;
@end
__deprecated_msg("Use [RCCoreClient getDownloadInfo:] instead")
///
/// - Warning: 此类不支持异步拦截下载 [RCDownloadInterceptor onDownloadRequest:withRequestHandler:]
/// - Warning: Since 5.8.0 开始支持同步拦截下载 [RCDownloadInterceptor onDownloadRequest:]
///
@interface RCDownloadItem : NSObject
/// 下载状态
@property (nonatomic, assign, readonly)
RCDownloadItemState state __deprecated_msg("Use [RCDownloadInfo getDownloadInfo:] instead");
/// 文件总大小 单位字节
@property (nonatomic, assign, readonly)
long long totalLength __deprecated_msg("Use [RCDownloadInfo totalLength] instead");
/// 文件当前的大小
@property (nonatomic, assign, readonly)
long long currentLength __deprecated_msg("Use [RCDownloadInfo totalLength] currentLength");
/// 文件对应的网络 URL
@property (nonatomic, strong, readonly, nullable) NSURL *URL;
/// 标识是否可恢复下载。YES 表示可恢复,支持 Range。NO 表示不支持 Range。
@property (nonatomic, assign, readonly) BOOL resumable;
/// 下载任务的标识符
@property (nonatomic, copy, readonly, nullable) NSString *identify;
/// 下载任务的代理对象
@property (nonatomic, weak, nullable) id<RCDownloadItemDelegate> delegate;
+ (instancetype)new NS_UNAVAILABLE;
/// 开始下载
- (void)
downLoad __deprecated_msg("Use [RCCoreClient downloadMediaFile:mediaUrl:progress:success:error:cancel:] instead");
/// 暂停下载
- (void)suspend __deprecated_msg("Use [RCCoreClient pauseDownloadMediaUrl:successBlock:errorBlock:] instead");
/// 恢复下载
- (void)resume __deprecated_msg("Use [RCCoreClient downloadMediaFile:mediaUrl:progress:success:error:cancel:] instead");
/// 取消下载
- (void)cancel __deprecated_msg("Use [RCCoreClient cancelDownloadMediaUrl:successBlock:errorBlock:] instead");
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,20 @@
//
// RCEditedMessageDraft.h
// RongIMLibCore
//
// Created by huan xu on 2025/9/8.
// Copyright © 2025 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/// - Since 5.28.0
@interface RCEditedMessageDraft : NSObject
/// 消息唯一标识(必填参数)
@property (nonatomic, copy) NSString *messageUId;
/// 草稿内容(可选参数)
@property (nonatomic, copy, nullable) NSString *content;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,40 @@
//
// RCFileMessage.h
// RongIMLib
//
// Created by 珏王 on 16/5/23.
// Copyright © 2016 年 RongCloud. All rights reserved.
//
#import <RongIMLibCore/RongIMLibCore.h>
/// 文件消息的类型名
#define RCFileMessageTypeIdentifier @"RC:FileMsg"
NS_ASSUME_NONNULL_BEGIN
/// 文件消息类
///
/// 文件消息类,此消息会进行存储并计入未读消息数。
///
/// - Remark: 内容类消息
@interface RCFileMessage : RCMediaMessageContent <NSCoding>
/// 文件大小,单位为 Byte
@property (nonatomic, assign) long long size;
/// 文件类型
@property (nonatomic, copy, nullable) NSString *type;
/// 文件的网络地址
@property (nonatomic, copy, nullable) NSString *fileUrl;
/// 初始化文件消息
///
/// - Parameter localPath: 文件的本地路径
/// - Returns: 文件消息对象
+ (instancetype)messageWithFile:(NSString *)localPath;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,127 @@
/**
* Copyright (c) 2014-2015, RongCloud.
* All rights reserved.
*
* All the contents are the copyright of RongCloud Network Technology Co.Ltd.
* Unless otherwise credited. http://rongcloud.cn
*
*/
// RCFileUtility.h
#ifndef __RCFileUtility
#define __RCFileUtility
#import "RCStatusDefine.h"
NS_ASSUME_NONNULL_BEGIN
@interface RCFileUtility : NSObject
/*!
设置文件媒体类型
- Returns: 文件类型
*/
+ (NSString *)getMimeType:(RCMediaType)fileType;
/*!
获取上传文件名称
- Returns: 文件媒体类型
*/
+ (NSString *)generateKey:(NSString *)mimeType;
/*!
生成下载的文件路径
- Returns: 文件名称
*/
+ (NSString *)getFileName:(NSString *)imgUrl
conversationType:(RCConversationType)conversationType
mediaType:(RCMediaType)mediaType
targetId:(NSString *)targetId;
/*!
根据文件 URL 获取 MD5 key
- Returns: key
*/
+ (NSString *)getFileKey:(NSString *)fileUri;
/*!
根据文件类型获取文件夹名称
- Returns: 文件夹名称
*/
+ (NSString *)getMediaDir:(RCMediaType)fileType;
/*!
根据会话类型获取存储的文件夹名称
- Returns: 文件夹名称
*/
+ (NSString *)getCateDir:(RCConversationType)categoryId;
/*!
文件是否存在
- Returns: 是否存在
*/
+ (BOOL)isFileExist:(NSString *)fileName;
/*!
存储数据到指定路径
- Parameter filePath: 文件存储路径
- Parameter content: 存储数据
- Returns: 存储成功与否的结果
*/
+ (BOOL)saveFile:(NSString *)filePath content:(NSData *)content;
/// 文件唯一存储地址,用于解决文件重命名冲突处理。
/// 如果 filePath 对应的本地文件不存在,则返回 filePath。
/// 如果 filePath 对应的本地文件存在,则在 filePath 的名字后面增加 (1),数字会累加,直到找到文件不存在的路径。
+ (NSString *)uniqueFilePath:(NSString *)filePath;
/*!
根据文件名获取文件类型
- Parameter fileName: 文件名,需要带扩展名
*/
+ (NSString *)getTypeName:(NSString *)fileName;
/*!
根据文件 URL 获取文件本地存储路径
- Returns: 文件本地存储路径
*/
+ (nullable NSString *)getFileLocalPath:(NSString *)fileUri;
/// 关联文件远端 URL 和本地路径
+ (void)setFileLocalPath:(NSString *)localPath fileUri:(NSString *)fileUri;
/// 获取小视频文件缓存路径
+ (NSString *)getSightCachePath:(NSString *)sightUrl;
/// 移除非法字符(../name.txt, ../..name.txt => name.txt
+ (NSString *)recheckFileName:(NSString *)fileName;
/// 媒体消息文件名字生成规则,主要用于文件下载。
/// 1. 获取 remoteUrl 属性中的 attname 字段对应的文件名。
/// 2. 获取 remoteUrl 链接中最后一段作为文件名。
/// 3. 对 remoteUrl 做 md5 作为文件名。
/// 将上面取到的文件名做 urlDecode。
+ (NSString *)getFileNameFromRemoteURL:(NSString *)remoteURL;
@end
@interface RCFileUtility (Deprecated)
/// 文件唯一存储地址
+ (NSString *)getUniqueFileName:(NSString *)baseFileName __deprecated_msg("Use uniqueFilePath: instead.");
@end
NS_ASSUME_NONNULL_END
#endif

View File

@@ -0,0 +1,24 @@
//
// RCFollowInfo.h
// RongIMLibCore
//
// Created by Lang on 2024/8/14.
// Copyright © 2024 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCFollowInfo : NSObject
/// 用户 Id
@property (nonatomic, copy) NSString *userId;
/// 关注时间戳
/// 当前用户关注此用户的时间戳
@property (nonatomic, assign) long long time;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,40 @@
//
// RCFriendApplicationInfo.h
// RongIMLibCore
//
// Created by Lang on 2024/8/12.
// Copyright © 2024 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCFriendEnum.h>
NS_ASSUME_NONNULL_BEGIN
/// 好友申请信息
@interface RCFriendApplicationInfo : NSObject
/// 申请用户 ID
@property (nonatomic, copy) NSString *userId;
/// 申请用户名
@property (nonatomic, copy) NSString *name;
/// 申请用户头像
@property (nonatomic, copy) NSString *portraitUri;
/// 请求类型:发送的好友请求、接收的好友请求
@property (nonatomic, assign) RCFriendApplicationType applicationType;
/// 状态类型:申请添加好友、已同意、已拒绝、已过期
@property (nonatomic, assign) RCFriendApplicationStatus applicationStatus;
/// 操作时间
@property (nonatomic, assign) long long operationTime;
/// 备注内容
@property (nonatomic, copy) NSString *extra;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,67 @@
//
// RCFriendEnum.h
// RongIMLibCore
//
// Created by Lang on 2024/8/12.
// Copyright © 2024 RongCloud. All rights reserved.
//
#ifndef RCFriendEnum_h
#define RCFriendEnum_h
/// 添加好友权限
typedef NS_ENUM(NSInteger, RCFriendAddPermission) {
/// 不需本人同意,任何人直接添加好友
RCFriendAddPermissionFree = 1,
/// 需要用户同意添加好友
RCFriendAddPermissionNeedVerify = 2,
/// 不允许任何人添加好友
RCFriendAddPermissionNoOneAllowed = 3,
};
/// - 好友方向类型:双向好友(目前只支持双向好友)
typedef NS_ENUM(NSInteger, RCDirectionType) {
/// 双向好友
RCDirectionTypeBoth = 2,
};
/// 好友关系类型
typedef NS_ENUM(NSInteger, RCFriendRelationType) {
/// 不在双方的好友列表中
RCFriendRelationTypeNone = 0,
/// 在我的好友列表中
RCFriendRelationTypeInMyFriendList = 1,
/// 仅在对方的好友列表中
RCFriendRelationTypeInOtherFriendList = 2,
/// 在双方的好友列表中
RCFriendRelationTypeBothWay = 3,
};
/// 好友申请类型
typedef NS_ENUM(NSInteger, RCFriendApplicationType) {
/// 发送的好友请求
RCFriendApplicationTypeSent = 1,
/// 接收的好友请求
RCFriendApplicationTypeReceived = 2
};
/// 好友申请状态
typedef NS_ENUM(NSInteger, RCFriendApplicationStatus) {
/// 未处理
RCFriendApplicationStatusUnHandled = 0,
/// 已同意
RCFriendApplicationStatusAccepted = 1,
/// 已拒绝
RCFriendApplicationStatusRefused = 2,
/// 已过期
RCFriendApplicationStatusExpired = 3,
};
/// 好友列表查询方向
typedef NS_ENUM(NSInteger, RCQueryFriendsDirectionType) {
/// 双向好友
RCQueryFriendsDirectionTypeBoth = 2,
};
#endif /* RCFriendEnum_h */

View File

@@ -0,0 +1,69 @@
//
// RCFriendEventDelegate.h
// RongIMLibCore
//
// Created by Lang on 2024/8/23.
// Copyright © 2024 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCFriendEnum.h>
NS_ASSUME_NONNULL_BEGIN
@protocol RCFriendEventDelegate <NSObject>
@optional
/// 添加好友回调
/// - Parameter userId: 用户 ID
/// - Parameter name: 用户名
/// - Parameter portraitUri: 用户头像
/// - Parameter directionType: 好友方向类型
/// - Parameter operationTime: 操作时间
- (void)onFriendAdd:(NSString *)userId
name:(NSString *)name
portraitUri:(NSString *)portraitUri
directionType:(RCDirectionType)directionType
operationTime:(long long)operationTime;
/// 删除好友回调
/// - Parameter userIds: 用户列表
/// - Parameter directionType: 好友方向类型
/// - Parameter operationTime: 操作时间
- (void)onFriendDelete:(NSArray<NSString *> *)userIds
directionType:(RCDirectionType)directionType
operationTime:(long long)operationTime;
/// 好友申请状态变更回调
/// - Parameter userId: 用户 ID
/// - Parameter applicationType: 请求类型
/// - Parameter applicationStatus: 状态类型
/// - Parameter directionType: 好友方向类型
/// - Parameter operationTime: 操作时间
/// - Parameter extra: 备注内容
- (void)onFriendApplicationStatusChanged:(NSString *)userId
applicationType:(RCFriendApplicationType)applicationType
applicationStatus:(RCFriendApplicationStatus)applicationStatus
directionType:(RCDirectionType)directionType
operationTime:(long long)operationTime
extra:(nullable NSString *)extra;
/// 清空好友的回调
/// 此操作只能由服务端发起
/// - Parameter operationTime: 操作时间
- (void)onFriendCleared:(long long)operationTime;
/// 好友信息变更多端回调事件
/// - Parameter userId: 用户 ID
/// - Parameter remark: 好友备注
/// - Parameter extProfile: 扩展信息
/// - Parameter operationTime: 操作时间
- (void)onFriendInfoChangedSync:(NSString *)userId
remark:(nullable NSString *)remark
extProfile:(nullable NSDictionary<NSString *, NSString *> *)extProfile
operationTime:(long long)operationTime;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,40 @@
//
// RCFriendInfo.h
// RongIMLibCore
//
// Created by Lang on 2024/8/12.
// Copyright © 2024 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCFriendEnum.h>
NS_ASSUME_NONNULL_BEGIN
/// 好友信息
@interface RCFriendInfo : NSObject
/// 用户 id
@property (nonatomic, copy) NSString *userId;
/// 用户名
@property (nonatomic, copy) NSString *name;
/// 用户头像
@property (nonatomic, copy) NSString *portraitUri;
/// 好友备注
@property (nonatomic, copy) NSString *remark;
/// 好友扩展信息
@property (nonatomic, copy) NSDictionary<NSString *, NSString *> *extProfile;
/// 好友添加时间
@property (nonatomic, assign) long long addTime;
/// 好友方向类型
@property (nonatomic, assign) RCDirectionType directionType;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,25 @@
//
// RCFriendRelationInfo.h
// RongIMLibCore
//
// Created by Lang on 2024/8/12.
// Copyright © 2024 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCFriendEnum.h>
NS_ASSUME_NONNULL_BEGIN
/// 好友关系结果
@interface RCFriendRelationInfo : NSObject
/// 用户 ID
@property (nonatomic, copy) NSString *userId;
/// 好友关系
@property (nonatomic, assign) RCFriendRelationType relationType;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,96 @@
//
// RCFwLog.h
// MacLogTest
//
// Created by ZhangLei on 26/02/2018.
// Copyright © 2018 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#define __FILE_STRING__ [NSString stringWithUTF8String:__FILE__]
#define __GET_FILENAME__ \
[__FILE_STRING__ substringFromIndex:[__FILE_STRING__ rangeOfString:@"/" options:NSBackwardsSearch].location + 1]
#define RCLogS(k, ...) \
[[RCFwLog getInstance] write:RC_Level_S type:RC_Type_DEB tag:__GET_FILENAME__ keys:k, ##__VA_ARGS__]
#define RCLogR(k, ...) \
[[RCFwLog getInstance] write:RC_Level_R type:RC_Type_DEB tag:__GET_FILENAME__ keys:k, ##__VA_ARGS__]
#define RCLogF(k, ...) \
[[RCFwLog getInstance] write:RC_Level_F type:RC_Type_DEB tag:__GET_FILENAME__ keys:k, ##__VA_ARGS__]
#define RCLogE(k, ...) \
[[RCFwLog getInstance] write:RC_Level_E type:RC_Type_DEB tag:__GET_FILENAME__ keys:k, ##__VA_ARGS__]
#define RCLogW(k, ...) \
[[RCFwLog getInstance] write:RC_Level_W type:RC_Type_DEB tag:__GET_FILENAME__ keys:k, ##__VA_ARGS__]
#define RCLogI(k, ...) \
[[RCFwLog getInstance] write:RC_Level_I type:RC_Type_DEB tag:__GET_FILENAME__ keys:k, ##__VA_ARGS__]
#define RCLogD(k, ...) \
[[RCFwLog getInstance] write:RC_Level_D type:RC_Type_DEB tag:__GET_FILENAME__ keys:k, ##__VA_ARGS__]
#define RCLogV(k, ...) \
[[RCFwLog getInstance] write:RC_Level_V type:RC_Type_DEB tag:__GET_FILENAME__ keys:k, ##__VA_ARGS__]
#define FwLogS(p, t, k, ...) [[RCFwLog getInstance] write:RC_Level_S type:p tag:t keys:k, ##__VA_ARGS__]
#define FwLogR(p, t, k, ...) [[RCFwLog getInstance] write:RC_Level_R type:p tag:t keys:k, ##__VA_ARGS__]
#define FwLogF(p, t, k, ...) [[RCFwLog getInstance] write:RC_Level_F type:p tag:t keys:k, ##__VA_ARGS__]
#define FwLogE(p, t, k, ...) [[RCFwLog getInstance] write:RC_Level_E type:p tag:t keys:k, ##__VA_ARGS__]
#define FwLogW(p, t, k, ...) [[RCFwLog getInstance] write:RC_Level_W type:p tag:t keys:k, ##__VA_ARGS__]
#define FwLogI(p, t, k, ...) [[RCFwLog getInstance] write:RC_Level_I type:p tag:t keys:k, ##__VA_ARGS__]
#define FwLogD(p, t, k, ...) [[RCFwLog getInstance] write:RC_Level_D type:p tag:t keys:k, ##__VA_ARGS__]
typedef NS_ENUM(NSInteger, RCFwLogLevel) {
RC_Level_S = -2, //Statistics
RC_Level_R = -1, //Record
RC_Level_N = 0, //None
RC_Level_F = 1, //Fatal
RC_Level_E = 2, //Error
RC_Level_W = 3, //Warn
RC_Level_I = 4, //Info
RC_Level_D = 5, //Debug
RC_Level_V = 6 //Verbose
};
typedef NS_OPTIONS(NSUInteger, RCLogType) {
RC_Type_APP = 1 << 0, // User interface.
RC_Type_PTC = 1 << 1, // Protocol.
RC_Type_ENV = 1 << 2,
RC_Type_DET = 1 << 3,
RC_Type_CON = 1 << 4,
RC_Type_RCO = 1 << 5,
RC_Type_CRM = 1 << 6,
RC_Type_MSG = 1 << 7, // Message.
RC_Type_MED = 1 << 8, // Media file.
RC_Type_LOG = 1 << 9,
RC_Type_DEB = 1 << 10, // Debug log.
RC_Type_CRS = 1 << 11, // Crash stack.
RC_Type_RTC = 1 << 12 // RTC.
};
NS_ASSUME_NONNULL_BEGIN
@interface RCFwLog : NSObject
// should be call init first, otherwise getInstance will return nil.
+ (void)init:(NSString *)appKey sdkVer:(NSString *)sdkVer;
+ (instancetype)getInstance;
+ (void)setLogMonitor:(NSInteger)value;
+ (void)setToken:(NSString *)token;
+ (void)setUserId:(NSString *)userId;
+ (void)setLogListener:(void (^)(NSString *log))logBlock;
+ (void)setConsoleLogLevel:(RCFwLogLevel)level;
/// 网络状态 100% lost 时,此方法会阻塞 30s切记不要在主线程直接调用
+ (nullable NSString *)getIpWithHost:(NSString *)hostName;
/// 异步获取 ip 地址,内部有切线程处理,子线程执行,主线程回调 callback
+ (void)getIpWithHost:(NSString *)hostName callback:(void (^)(NSString *_Nullable ipString))callback;
+ (void)setRcDebugLogLevel:(NSInteger)rcDebugLogLevel;
+ (void)setRcDebugLogMaxSize:(long long)rcDebugLogMaxSize;
+ (void)startRealTimelog __deprecated_msg("has been deprecated");
- (void)uploadLog:(nullable void (^)(int code))errorBlock __deprecated_msg("has been deprecated");
- (void)uploadDebugLog __deprecated_msg("has been deprecated");
- (void)write:(RCFwLogLevel)level
type:(RCLogType)type
tag:(NSString *)tag
keys:(NSString *)keys, ... NS_FORMAT_FUNCTION(4, 5);
- (void)write:(RCFwLogLevel)level type:(RCLogType)type tag:(NSString *)tag keys:(NSArray *)keys values:(NSArray *)vals;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,54 @@
//
// RCGIFMessage.h
// RongIMLib
//
// Created by liyan on 2018/12/20.
// Copyright © 2018 年 RongCloud. All rights reserved.
//
#import <RongIMLibCore/RongIMLibCore.h>
NS_ASSUME_NONNULL_BEGIN
/// GIF 消息的类型名
///
/// 仅支持 gif 类型的图片jpg、png 等其他格式的图片请使用 RCImageMessage
#define RCGIFMessageTypeIdentifier @"RC:GIFMsg"
/// GIF 消息
///
/// GIF 消息类,此消息会进行存储并计入未读消息数。
///
/// - Remark: 内容类消息
@interface RCGIFMessage : RCMediaMessageContent
/// GIF 图的大小,单位字节
@property (nonatomic, assign) long long gifDataSize;
/// GIF 图的宽
@property (nonatomic, assign) long width;
/// GIF 图的高
@property (nonatomic, assign) long height;
/// 初始化 GIF 消息
///
/// - Parameter gifImageData: GIF 图的数据
/// - Parameter width: GIF 的宽
/// - Parameter height: GIF 的高
///
/// - Returns: GIF 消息对象
+ (instancetype)messageWithGIFImageData:(NSData *)gifImageData width:(long)width height:(long)height;
/// 初始化 GIF 消息
///
/// - Parameter gifURI: GIF 的本地路径
/// - Parameter width: GIF 的宽
/// - Parameter height: GIF 的高
///
/// - Returns: GIF 消息对象
+ (instancetype)messageWithGIFURI:(NSString *)gifURI width:(long)width height:(long)height;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,31 @@
//
// RCGetUnreadMentionMeConversationListParams.h
// RongIMLibCore
//
// Created by RongCloud on 2025/9/5.
// Copyright © 2025 RongCloud. All rights reserved.
//
/// - Since: 5.28.0
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCGetUnreadMentionMeConversationListParams : NSObject
/// 支持的会话类型的数组 (需要将 RCConversationType 转为 NSNumber 构建 NSArray)
/// 支持单聊、群聊、系统、超级群会话类型
/// 非上述类型或者空数组,查询返回错误码 34284
@property (nonatomic, copy)NSArray<NSNumber *> *conversationTypes;
/// 是否置顶优先,传 YES 表示置顶会话优先返回,否则结果只以会话时间排序
/// 默认值为 YES
@property (nonatomic, assign)BOOL topPriority;
/// 查询的开始时间, 传 0 表示查询最新时间的会话,后续查询可传入 conversations 的最后一个元素的 conversation time 单位:毫秒
/// 默认值为 0小于 0 则查询返回错误码 34202
@property (nonatomic, assign)long long timestamp;
/// 获取的数量,有效值范围 [1, 100] 默认值为 0超过范围则查询返回错误码 34232
@property (nonatomic, assign)NSUInteger count;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,44 @@
/**
* Copyright (c) 2014-2015, RongCloud.
* All rights reserved.
*
* All the contents are the copyright of RongCloud Network Technology Co.Ltd.
* Unless otherwise credited. http://rongcloud.cn
*
*/
// RCGroup.h
// Created by Heq.Shinoda on 14-9-6.
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/// 群组信息类
@interface RCGroup : NSObject <NSCoding>
/// 群组 ID
@property (nonatomic, copy) NSString *groupId;
/// 群组名称
@property (nonatomic, copy) NSString *groupName;
/// 群组头像的 URL
@property (nonatomic, copy, nullable) NSString *portraitUri;
/// 群组信息附加字段
@property (nonatomic, copy, nullable) NSString *extra;
/// 群组信息的初始化方法
///
/// - Parameter groupId: 群组 ID
/// - Parameter groupName: 群组名称
/// - Parameter portraitUri: 群组头像的 URL
///
/// - Returns: 群组信息对象
- (instancetype)initWithGroupId:(NSString *)groupId
groupName:(NSString *)groupName
portraitUri:(nullable NSString *)portraitUri;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,48 @@
//
// RCGroupApplicationInfo.h
// RongIMLibCore
//
// Created by Lang on 2024/8/22.
// Copyright © 2024 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCGroupEnum.h>
@class RCGroupMemberInfo;
NS_ASSUME_NONNULL_BEGIN
/// 群申请事件
@interface RCGroupApplicationInfo : NSObject
/// 群组 ID
@property (nonatomic, copy) NSString *groupId;
/// 入群者信息
@property (nonatomic, strong) RCGroupMemberInfo *joinMemberInfo;
/// 邀请者信息
@property (nonatomic, strong, nullable) RCGroupMemberInfo *inviterInfo;
/// 操作人信息
@property (nonatomic, strong, nullable) RCGroupMemberInfo *operatorInfo;
/// 群申请状态
@property (nonatomic, assign) RCGroupApplicationStatus status;
/// 群申请方向
@property (nonatomic, assign) RCGroupApplicationDirection direction;
/// 群申请类型
@property (nonatomic, assign) RCGroupApplicationType type;
/// 操作时间
@property (nonatomic, assign) long long operationTime;
/// 原因
@property (nonatomic, copy, nullable) NSString *reason;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,136 @@
//
// RCGroupEnum.h
// RongIMLibCore
//
// Created by Lang on 2024/7/19.
// Copyright © 2024 RongCloud. All rights reserved.
//
#ifndef RCGroupEnum_h
#define RCGroupEnum_h
/// 加入群权限
typedef NS_ENUM(NSInteger, RCGroupJoinPermission) {
/// 需要群主验证(默认)
RCGroupJoinPermissionOwnerVerify = 0,
/// 不用验证
RCGroupJoinPermissionFree = 1,
/// 群主或群管理员
RCGroupJoinPermissionOwnerOrManagerVerify = 2,
/// 不允许任何人加入
RCGroupJoinPermissionNoOneAllowed = 3,
};
/// 群操作权限
typedef NS_ENUM(NSInteger, RCGroupOperationPermission) {
/// 群主(默认)
RCGroupOperationPermissionOwner = 0,
/// 群主或群管理员
RCGroupOperationPermissionOwnerOrManager = 1,
/// 所有人
RCGroupOperationPermissionEveryone = 2
};
/// 邀请加入群组处理权限
typedef NS_ENUM(NSInteger, RCGroupInviteHandlePermission) {
/// 不需要被邀请人同意(默认)
RCGroupInviteHandlePermissionFree = 0,
/// 需要被邀请人同意
RCGroupInviteHandlePermissionInviteeVerify = 1,
};
/// 群成员资料编辑权限
typedef NS_ENUM(NSInteger, RCGroupMemberInfoEditPermission) {
/// 群主、群管理员和自己(默认)
RCGroupMemberInfoEditPermissionOwnerOrManagerOrSelf = 0,
/// 群主和自己
RCGroupMemberInfoEditPermissionOwnerOrSelf = 1,
/// 仅自己
RCGroupMemberInfoEditPermissionSelf = 2,
};
/// 群成员身份
typedef NS_ENUM(NSInteger, RCGroupMemberRole) {
/// 不区分角色(未加群时无角色)
RCGroupMemberRoleUndef = 0,
/// 普通群成员
RCGroupMemberRoleNormal = 1,
/// 管理员
RCGroupMemberRoleManager = 2,
/// 群主
RCGroupMemberRoleOwner = 3,
};
/// 操作类型枚举
typedef NS_ENUM(NSInteger, RCGroupOperation) {
/// 创建群
RCGroupOperationCreate = 0,
/// 加入
RCGroupOperationJoin = 1,
/// 踢出
RCGroupOperationKick = 2,
/// 退出
RCGroupOperationQuit = 3,
/// 解散
RCGroupOperationDismiss = 4,
/// 添加管理员
RCGroupOperationAddManager = 5,
/// 移除管理员
RCGroupOperationRemoveManager = 6,
/// 转让群主
RCGroupOperationTransferGroupOwner = 7,
};
/// 群申请状态
typedef NS_ENUM(NSInteger, RCGroupApplicationStatus) {
/// 管理员待处理
RCGroupApplicationStatusManagerUnHandled = 0,
/// 管理员已拒绝
RCGroupApplicationStatusManagerRefused = 1,
/// 被邀请人待处理
RCGroupApplicationStatusInviteeUnHandled = 2,
/// 被邀请人拒绝
RCGroupApplicationStatusInviteeRefused = 3,
/// 已加入
RCGroupApplicationStatusJoined = 4,
/// 已过期
RCGroupApplicationStatusExpired = 5,
};
/// 操作类型
typedef NS_ENUM(NSInteger, RCGroupOperationType) {
/// 添加
RCGroupOperationTypeAdd = 1,
/// 删除
RCGroupOperationTypeRemove = 2
};
/// 群申请方向
typedef NS_ENUM(NSInteger, RCGroupApplicationDirection) {
/// 发出的申请
RCGroupApplicationDirectionApplicationSent = 0,
/// 发出的邀请
RCGroupApplicationDirectionInvitationSent = 1,
/// 收到的邀请
RCGroupApplicationDirectionInvitationReceived = 2,
/// 收到的申请
RCGroupApplicationDirectionApplicationReceived = 3
};
/// 群申请类型
typedef NS_ENUM(NSInteger, RCGroupApplicationType) {
/// 主动加入群组
RCGroupApplicationTypeApplication = 0,
/// 被邀请加入群组
RCGroupApplicationTypeInvitation = 1,
};
#endif /* RCGroupEnum_h */

View File

@@ -0,0 +1,114 @@
//
// RCGroupEventDelegate.h
// RongIMLibCore
//
// Created by Lang on 2024/7/22.
// Copyright © 2024 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCGroupEnum.h>
#import <RongIMLibCore/RCGroupInfo.h>
@class RCGroupMemberInfo;
@class RCGroupApplicationInfo;
NS_ASSUME_NONNULL_BEGIN
@protocol RCGroupEventDelegate <NSObject>
@optional
/// 群组操作回调
/// - Parameter groupId: 群组 ID
/// - Parameter operatorInfo: 操作者信息。服务端 api 操作踢出时为空。
/// - Parameter groupInfo: 群组信息,仅在操作类型为创建群组时有效。
/// - Parameter operation: 操作类型
/// - Parameter memberInfos: 目标用户信息列表
/// - Parameter operationTime: 操作时间
/// - Warning 在该回调中,`groupInfo` 的 `remark`、`role`、`joinedTime` 字段不会返回有效值,它们可能为空或为默认值。
/// 如需获取这些字段,请通过` -[RCCoreClient getGroupsInfo:success:error:]` 接口查询。
- (void)onGroupOperation:(NSString *)groupId
operatorInfo:(nullable RCGroupMemberInfo *)operatorInfo
groupInfo:(nullable RCGroupInfo *)groupInfo
operation:(RCGroupOperation)operation
memberInfos:(NSArray<RCGroupMemberInfo *> *)memberInfos
operationTime:(long long)operationTime;
/// 群组资料变更回调
/// - Parameter operatorInfo: 操作者信息
/// - Parameter groupInfo: 群组信息,只有包含在 updateKeys 中的属性值有效
/// - Parameter updateKeys: 群组信息内容有变更的属性
/// - Parameter operationTime: 操作时间
- (void)onGroupInfoChanged:(RCGroupMemberInfo *)operatorInfo
groupInfo:(RCGroupInfo *)groupInfo
updateKeys:(NSArray<RCGroupInfoKeys> *)updateKeys
operationTime:(long long)operationTime
__deprecated_msg(
"Use [RCGroupEventDelegate onGroupInfoChanged:fullGroupInfo:changedGroupInfo:operationTime:] instead");
/// 群组资料变更回调
/// - Parameter operatorInfo: 操作者信息
/// - Parameter fullGroupInfo: 全量群组信息
/// - Parameter changedGroupInfo: 内容有变更的群组信息
/// - Parameter operationTime: 操作时间
- (void)onGroupInfoChanged:(RCGroupMemberInfo *)operatorInfo
fullGroupInfo:(RCGroupInfo *)fullGroupInfo
changedGroupInfo:(RCGroupInfo *)changedGroupInfo
operationTime:(long long)operationTime
__deprecated_msg(
"Use [RCGroupEventDelegate onGroupInfoChanged:fullGroupInfo:changedProperties:operationTime:] instead");
/// 群组资料变更回调
/// - Parameter operatorInfo: 操作者信息
/// - Parameter fullGroupInfo: 全量群组信息
/// - Parameter properties: 群组信息有变更的属性
/// - Parameter operationTime: 操作时间
/// - Since: 5.22.0
/// - Warning 在该回调中,`fullGroupInfo` 的 `remark`、`role`、`joinedTime` 字段不会返回有效值,它们可能为空或为默认值。
/// 如需获取这些字段,请通过` -[RCCoreClient getGroupsInfo:success:error:]` 接口查询。
- (void)onGroupInfoChanged:(RCGroupMemberInfo *)operatorInfo
fullGroupInfo:(RCGroupInfo *)fullGroupInfo
changedProperties:(NSArray<NSString *> *)properties
operationTime:(long long)operationTime;
/// 群成员资料变更回调
/// - Parameter groupId: 群组 ID
/// - Parameter operatorInfo: 操作人成员资料
/// - Parameter memberInfo: 有变更的群成员资料
/// - Parameter operationTime: 操作时间
- (void)onGroupMemberInfoChanged:(NSString *)groupId
operatorInfo:(RCGroupMemberInfo *)operatorInfo
memberInfo:(RCGroupMemberInfo *)memberInfo
operationTime:(long long)operationTime;
/// 群申请事件回调
/// 包含以下事件:
/// - 用户申请加入群组的**申请**或**结果**
/// - 邀请加入群组的**申请**或**结果**
- (void)onGroupApplicationEvent:(RCGroupApplicationInfo *)event;
/// 群备注名更新多端同步回调事件
/// - Parameter groupId: 群组 ID
/// - Parameter operationType: 操作类型,添加或移除
/// - Parameter groupRemark: 群备注名
/// - Parameter operationTime: 操作时间
- (void)onGroupRemarkChangedSync:(NSString *)groupId
operationType:(RCGroupOperationType)operationType
groupRemark:(NSString *)groupRemark
operationTime:(long long)operationTime;
/// 群成员特别关注变更多端同步回调事件
/// - Parameter groupId: 群组 ID
/// - Parameter operationType: 操作类型,添加或移除
/// - Parameter userIds: 用户 ID 列表
/// - Parameter operationTime: 操作时间
- (void)onGroupFollowsChangedSync:(NSString *)groupId
operationType:(RCGroupOperationType)operationType
userIds:(NSArray<NSString *> *)userIds
operationTime:(long long)operationTime;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,113 @@
//
// RCGroupInfo.h
// RongIMLibCore
//
// Created by Lang on 2024/7/19.
// Copyright © 2024 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCGroupEnum.h>
NS_ASSUME_NONNULL_BEGIN
/// 群组信息属性 key 值
typedef NSString *RCGroupInfoKeys NS_STRING_ENUM;
/// 群名称 key
FOUNDATION_EXPORT RCGroupInfoKeys const RCGroupInfoKeysName;
/// 群头像 URL 地址 key
FOUNDATION_EXPORT RCGroupInfoKeys const RCGroupInfoKeysPortraitUri;
/// 群简介 key
FOUNDATION_EXPORT RCGroupInfoKeys const RCGroupInfoKeysIntroduction;
/// 群公告 key
FOUNDATION_EXPORT RCGroupInfoKeys const RCGroupInfoKeysNotice;
/// 主动加入群权限 key
FOUNDATION_EXPORT RCGroupInfoKeys const RCGroupInfoKeysJoinPermission;
/// 将群成员移出群组设置 key
FOUNDATION_EXPORT RCGroupInfoKeys const RCGroupInfoKeysRemoveMemberPerm;
/// 谁可以邀请他人入群 key
FOUNDATION_EXPORT RCGroupInfoKeys const RCGroupInfoKeysInvitePermission;
/// 被邀请加入群组权限 key
FOUNDATION_EXPORT RCGroupInfoKeys const RCGroupInfoKeysInviteHandlePermission;
/// 修改群资料权限 key
FOUNDATION_EXPORT RCGroupInfoKeys const RCGroupInfoKeysGroupInfoEditPermission;
/// 修改群成员资料权限 key
FOUNDATION_EXPORT RCGroupInfoKeys const RCGroupInfoKeysMemberInfoEditPermission;
/// 群扩展信息 key
FOUNDATION_EXPORT RCGroupInfoKeys const RCGroupInfoKeysExtProfile;
@interface RCGroupInfo : NSObject
/// 群组 ID
@property (nonatomic, copy) NSString *groupId;
/// 群名称
@property (nonatomic, copy) NSString *groupName;
/// 群头像 URL 地址,长度不超过 1024 个字符
@property (nonatomic, copy, nullable) NSString *portraitUri;
/// 群简介,长度不超过 512 个字符
@property (nonatomic, copy, nullable) NSString *introduction;
/// 群公告,长度不超过 1024 个字符
@property (nonatomic, copy, nullable) NSString *notice;
/// 扩展信息,
/// 自定义属性需要通过开发者后台或 服务端 API 设置后才能使用,否则返回设置失败
@property (nonatomic, strong) NSDictionary<NSString *, NSString *> *extProfile;
/// 主动加入群权限
/// 默认需要群主验证
@property (nonatomic, assign) RCGroupJoinPermission joinPermission;
/// 移除群成员权限
/// 默认群主
@property (nonatomic, assign) RCGroupOperationPermission removeMemberPermission;
/// 邀请他人入群权限
/// 默认群主
@property (nonatomic, assign) RCGroupOperationPermission invitePermission;
/// 被邀请加入群组权限
/// 默认不需要被邀请人同意
@property (nonatomic, assign) RCGroupInviteHandlePermission inviteHandlePermission;
/// 修改群资料权限
/// 默认群主
@property (nonatomic, assign) RCGroupOperationPermission groupInfoEditPermission;
/// 修改群成员资料权限
/// 默认群主、群管理员、自已都可以
@property (nonatomic, assign) RCGroupMemberInfoEditPermission memberInfoEditPermission;
#pragma mark - 只读属性
/// 创建者 userId
@property (nonatomic, copy, readonly) NSString *creatorId;
/// 群主 userId
@property (nonatomic, copy, readonly) NSString *ownerId;
/// 群备注
/// 自己设置备注名,其他人看不到
@property (nonatomic, copy, readonly, nullable) NSString *remark;
/// 群组创建时间。
@property (nonatomic, assign, readonly) long long createTime;
/// 群当前成员人数。
@property (nonatomic, assign, readonly) NSUInteger membersCount;
/// 当前用户加入时间:用户多次加入群组时,以最后一次加入时间为准
@property (nonatomic, assign, readonly) long long joinedTime;
/// 我的群身份
@property (nonatomic, assign, readonly) RCGroupMemberRole role;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,39 @@
//
// RCGroupMemberInfo.h
// RongIMLibCore
//
// Created by Lang on 2024/7/19.
// Copyright © 2024 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <RongIMLibCore/RCGroupEnum.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCGroupMemberInfo : NSObject
/// 用户 Id
@property (nonatomic, copy) NSString *userId;
/// 头像 URL
@property (nonatomic, copy) NSString *portraitUri;
/// 用户名
@property (nonatomic, copy) NSString *name;
/// 在群中的昵称(别名),默认为用户名
@property (nonatomic, copy, nullable) NSString *nickname;
/// 附加信息
@property (nonatomic, copy, nullable) NSString *extra;
/// 入群时间戳
@property (nonatomic, assign) long long joinedTime;
/// 我群身份
@property (nonatomic, assign) RCGroupMemberRole role;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,24 @@
//
// RCMessageReadUser.h
// RongIMLibCore
//
// Created by 张改红 on 2021/2/22.
// Copyright © 2021 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/// 已读用户对象
@interface RCGroupMessageReaderV2 : NSObject
/// 已读用户 id
@property (nonatomic, copy) NSString *userId;
/// 已读时间
@property (nonatomic, assign) long long readTime;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,74 @@
/**
* Copyright (c) 2014-2015, RongCloud.
* All rights reserved.
*
* All the contents are the copyright of RongCloud Network Technology Co.Ltd.
* Unless otherwise credited. http://rongcloud.cn
*
*/
// RCGroupNotificationMessage.h
// Created by xugang on 14/11/24.
#import <RongIMLibCore/RCMessageContent.h>
/// 群组通知消息的类型名
#define RCGroupNotificationMessageIdentifier @"RC:GrpNtf"
/// 有成员加入群组的通知
#define GroupNotificationMessage_GroupOperationAdd @"Add"
/// 有成员退出群组的通知
#define GroupNotificationMessage_GroupOperationQuit @"Quit"
/// 有成员被踢出群组的通知
#define GroupNotificationMessage_GroupOperationKicked @"Kicked"
/// 群组名称发生变更的通知
#define GroupNotificationMessage_GroupOperationRename @"Rename"
/// 群组公告发生变更的通知
#define GroupNotificationMessage_GroupOperationBulletin @"Bulletin"
/// 群组通知消息类
///
/// 群组通知消息类,此消息会进行存储,但不计入未读消息数。
///
/// - Remark: 通知类消息
@interface RCGroupNotificationMessage : RCMessageContent <NSCoding>
/// 群组通知的当前操作名
///
/// 群组通知的当前操作名称,您可以使用预定义好的操作名,也可以是您自己定义的任何操作名。
/// 预定义的操作名:
/// GroupNotificationMessage_GroupOperationAdd、GroupNotificationMessage_GroupOperationQuit、
/// GroupNotificationMessage_GroupOperationKicked、GroupNotificationMessage_GroupOperationRename、
/// GroupNotificationMessage_GroupOperationBulletin。
@property (nonatomic, copy) NSString *operation;
/// 当前操作发起用户的用户 ID
@property (nonatomic, copy) NSString *operatorUserId;
/// 当前操作的目标对象
///
///
/// 当前操作的目标对象,如被当前操作目标用户的用户 ID 或变更后的群主名称等。
@property (nonatomic, copy) NSString *data;
/// 当前操作的消息内容
@property (nonatomic, copy) NSString *message;
/// 初始化群组通知消息
///
/// - Parameter operation: 群组通知的当前操作名
/// - Parameter operatorUserId: 当前操作发起用户的用户 ID
/// - Parameter data: 当前操作的目标对象
/// - Parameter message: 当前操作的消息内容
/// - Parameter extra: 当前操作的附加信息
///
/// - Returns: 群组通知消息对象
///
/// 群组关系由开发者维护,所有的群组操作都由您的服务器自己管理和维护。
/// 所以群组通知的操作名和目标对象、消息内容、扩展信息您均可以自己定制,只要您发送方和接收方针对具体字段内容做好 UI 显示即可。
+ (instancetype)notificationWithOperation:(NSString *)operation
operatorUserId:(NSString *)operatorUserId
data:(NSString *)data
message:(NSString *)message
extra:(NSString *)extra;
@end

View File

@@ -0,0 +1,35 @@
//
// RCGroupReadReceiptInfoV2.h
// RongIMLibCore
//
// Created by 张改红 on 2021/3/9.
// Copyright © 2021 RongCloud. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class RCGroupMessageReaderV2;
@interface RCReadReceiptInfoV4 : NSObject
/// 是否已经发送回执
@property (nonatomic, assign) BOOL hasRespond;
/// 发送回执的用户 ID 列表
@property (nonatomic, strong, nullable) NSArray<RCGroupMessageReaderV2 *> *readerList;
/// 已读人数
@property (nonatomic, assign) int readCount;
/// 群内总人数
@property (nonatomic, assign) int totalCount;
@end
@interface RCGroupReadReceiptInfoV2 : RCReadReceiptInfoV4
@end
NS_ASSUME_NONNULL_END

Some files were not shown because too many files have changed in this diff Show More