Skip to main content

Group Join Management

This document guides developers on using RC's iOS IMLib SDK to implement group join management features including actively joining groups, inviting users to join groups, users accepting or rejecting group invitations, and administrators approving or rejecting join requests.

tip

This feature is supported starting from version 5.12.0.

Enabling the Service

Before using this feature, you must enable the profile hosting service by submitting a ticket.

Group Join Management

Group join management includes: actively joining groups, inviting users to join groups, users accepting or rejecting group invitations, and administrators approving or rejecting join requests.

tip

For group join permission configuration, refer to [Group Management]. For group permission queries, refer to [Group Query].

Actively Join Group

You can call the joinGroup method to actively join a group.

The result is affected by the group's join permission ([joinPermission]) parameter:

  • When join permission is "Requires group owner/administrator approval":
    • After successful API call, processCode returns RC_GROUP_JOIN_GROUP_NEED_MANAGER_ACCEPT (25424), indicating pending owner/administrator approval. Both the requester and group owner/administrator will receive the [onGroupApplicationEvent] callback.
  • When join permission is "No approval required":
    • After successful API call, processCode returns RC_SUCCESS (0), indicating successful group join. Both the requester and all group members will receive the onGroupOperation callback with operation type RCGroupOperationJoin.

Sample Code

[[RCCoreClient sharedCoreClient] joinGroup:@"groupId" success:^(RCErrorCode processCode) {
// Join success
} error:^(RCErrorCode errorCode) {
// Join failed
}];

Invite Users to Join Group

This feature is affected by group invite role permission [invitePermission]. Only users with permission can call inviteUsersToGroup to invite others to join.

API Prototype

- (void)inviteUsersToGroup:(NSString *)groupId
userIds:(NSArray<NSString *> *)userIds
success:(void (^)(RCErrorCode processCode))successBlock
error:(void (^)(RCErrorCode errorCode))errorBlock;

Parameter Description

ParameterTypeDescription
groupIdNSStringThe group's targetId.
userIdsNSArrayList of user IDs to invite (max 30 per request).
successBlockBlockSuccess callback.
errorBlockBlockFailure callback.

Sample Code

// User IDs to invite
NSArray *userIds = @[@"userId1", @"userId2"];

[[RCCoreClient sharedCoreClient] inviteUsersToGroup:@"groupId" userIds:userIds success:^(RCErrorCode processCode) {
// Invite success
} error:^(RCErrorCode errorCode) {
// Invite failed
}];

Group invitation behavior is affected by three factors:

  1. Join Permission ([joinPermission]): Whether owner/administrator approval is required.
  2. Inviter Role ([role]): Whether inviter is owner/administrator or regular member.
  3. Invitee Handling Permission ([inviteHandlePermission]): Whether invitee consent is required.
Specific Rules
tip

The table below assumes group invite permission ([invitePermission]) is set to RCGroupOperationPermissionEveryone, meaning all members can invite others.

You can configure different permissions based on actual requirements.

Join PermissionInviter RoleInvitee ApprovalEvent Flow
Requires owner/admin approvalRegular memberRequiredFlow A
Not requiredFlow B
Owner/AdministratorRequiredFlow C
Not requiredFlow D
No owner/admin approval requiredAll rolesRequiredFlow C
Not requiredFlow D
Event Flows
Flow A

Permission description:

  • Regular member invites others, requires owner/admin approval, requires invitee approval.
  1. After invitation, success callback returns RC_GROUP_JOIN_GROUP_NEED_MANAGER_ACCEPT (25424), indicating pending owner/admin approval. Inviter and owner/admin receive onGroupApplicationEvent callback.
  2. After owner/admin calls acceptGroupApplication, inviter, owner/admin, and invitee receive onGroupApplicationEvent callback.
  3. After invitee calls acceptGroupInvite, inviter, owner/admin, and invitee receive onGroupApplicationEvent callback. All group members receive onGroupOperation callback with operation type RCGroupOperationJoin.
Flow B

Permission description:

  • Regular member invites others, requires owner/admin approval, no invitee approval required.
  1. After invitation, success callback returns RC_GROUP_JOIN_GROUP_NEED_MANAGER_ACCEPT (25424), indicating pending owner/admin approval. Inviter and owner/admin receive onGroupApplicationEvent callback.
  2. After owner/admin calls acceptGroupApplication, invitee joins successfully. Inviter and owner/admin receive onGroupApplicationEvent callback. All group members receive onGroupOperation callback with operation type RCGroupOperationJoin.
Flow C

Permission description:

  • Any role (owner, admin or regular member) invites others, no owner/admin approval required, requires invitee approval.
  1. After invitation, success callback returns RC_GROUP_NEED_INVITEE_ACCEPT (25427), indicating pending invitee approval. Inviter and invitee receive onGroupApplicationEvent callback.

  2. After invitee calls acceptGroupInvite, inviter and invitee receive onGroupApplicationEvent callback. All group members receive onGroupOperation callback with operation type RCGroupOperationJoin.

  3. After invitation, the success callback returns RC_GROUP_NEED_INVITEE_ACCEPT (25427), indicating pending invitee approval. Inviter and invitee receive onGroupApplicationEvent callback.

  4. After invitee calls acceptGroupInvite, inviter and invitee receive onGroupApplicationEvent callback. All group members receive onGroupOperation callback with operation type RCGroupOperationJoin.

Process D

Permission description:

  • Owner/admin invites others, requires owner/admin approval, no invitee approval needed.
  • Any user (owner, admin, or regular member) invites others, no owner/admin approval required, no invitee approval needed.
  1. After invitation, the success callback returns RC_SUCCESS (0), indicating successful invitation. Invitee directly joins the group, all members receive onGroupOperation callback with operation type RCGroupOperationJoin.

Handling Group Invitations

Accepting Group Invitation

Users can call acceptGroupInvite to accept group invitations.

Interface Prototype

- (void)acceptGroupInvite:(NSString *)groupId
inviterId:(NSString *)inviterId
success:(void (^)(void))successBlock
error:(void (^)(RCErrorCode errorCode))errorBlock;

Parameters

ParameterTypeDescription
groupIdNSStringGroup targetId.
inviterIdNSStringInviter userId.
successBlockBlockSuccess callback.
errorBlockBlockFailure callback.
Sample Code
// Group ID
NSString *groupId = @"groupId";
// Inviter ID
NSString *inviterId = @"inviterId";

[[RCCoreClient sharedCoreClient] acceptGroupInvite:groupId inviterId:inviterId success:^{
// Success
} error:^(RCErrorCode errorCode) {
// Failure
}];

Rejecting Group Invitation

Users can call refuseGroupInvite to reject group invitations.

Interface Prototype

- (void)refuseGroupInvite:(NSString *)groupId
inviterId:(NSString *)inviterId
reason:(nullable NSString *)reason
success:(void (^)(void))successBlock
error:(void (^)(RCErrorCode errorCode))errorBlock;

Parameters

ParameterTypeDescription
groupIdNSStringGroup targetId.
inviterIdNSStringInviter userId.
reasonNSStringOptional rejection reason (max 128 characters).
successBlockBlockSuccess callback.
errorBlockBlockFailure callback.
Sample Code
// Group ID
NSString *groupId = @"groupId";
// Inviter ID
NSString *inviterId = @"inviterId";
// Reason (optional)
NSString *reason = @"reason";

[[RCCoreClient sharedCoreClient] refuseGroupInvite:groupId inviterId:inviterId reason:reason success:^{
// Success
} error:^(RCErrorCode errorCode) {
// Failure
}];

Handling Join Requests (Owner/Admin)

Group applications expire after 7 days. RC servers store application data for up to 7 days.

Approving Join Request

Owners/admins can call acceptGroupApplication to approve join requests.

  • For user-initiated requests: Pass applicantId, set inviterId to nil or @"".
  • For invitation requests: Pass both applicantId and inviterId.

Interface Prototype

- (void)acceptGroupApplication:(NSString *)groupId
inviterId:(nullable NSString *)inviterId
applicantId:(NSString *)applicantId
success:(void (^)(RCErrorCode processCode))successBlock
error:(void (^)(RCErrorCode errorCode))errorBlock;

Parameters

ParameterTypeDescription
groupIdNSStringGroup targetId.
inviterIdNSStringOptional inviter userId (required for invitation requests).
applicantIdNSStringApplicant userId.
successBlockBlockSuccess callback.
errorBlockBlockFailure callback.
Sample Code
// Group ID
NSString *groupId = @"groupId";
// Inviter ID (required for invitation requests)
NSString *inviterId = @"inviterId";
// Applicant ID
NSString *applicantId = @"applicantId";

[[RCCoreClient sharedCoreClient] acceptGroupApplication:groupId inviterId:inviterId applicantId:applicantId success:^(RCErrorCode processCode) {
// Success
} error:^(RCErrorCode errorCode) {
// Failure
}];

The processCode in callback depends on group's invitee handling permission ([inviteHandlePermission]):

  • When invitee approval required: Returns RC_GROUP_NEED_INVITEE_ACCEPT (25427). Invitee receives onGroupApplicationEvent callback.
  • When no invitee approval needed: Returns RC_SUCCESS (0). All members receive onGroupOperation callback for join event.

Rejecting Join Request

Owners/admins can call refuseGroupApplication to reject join requests.

  • For user-initiated requests: Pass applicantId, set inviterId to nil or @"".
  • For invitation requests: Pass both applicantId and inviterId.

Interface Prototype

- (void)refuseGroupApplication:(NSString *)groupId

#### Interface Prototype
```objc
- (void)refuseGroupApplication:(NSString *)groupId
inviterId:(nullable NSString *)inviterId
applicantId:(NSString *)applicantId
reason:(nullable NSString *)reason
success:(void (^)(void))successBlock
error:(void (^)(RCErrorCode errorCode))errorBlock;

Parameter Description

ParameterTypeDescription
groupIdNSStringThe targetId of the group.
inviterIdNSStringThe inviter's userId (optional). Required for invitation requests; leave empty for user-initiated join requests.
applicantIdNSStringThe userId of the user requesting to join the group.
reasonNSStringReason for rejection.
successBlockBlockSuccess callback.
errorBlockBlockFailure callback.
Example Code
// Group ID
NSString *groupId = @"groupId";
// Applicant ID
NSString *applicantId = @"applicantId";
// Inviter ID (required for invitation requests, nil or @"" for user-initiated requests)
NSString *inviterId = @"inviterId";
// Rejection reason (optional)
NSString *reason = @"reason";

[[RCCoreClient sharedCoreClient] refuseGroupApplication:groupId inviterId:inviterId applicantId:applicantId reason:reason success:^{
// Rejection successful
} error:^(RCErrorCode errorCode) {
// Rejection failed
}];

Paginated Group Application List

Call getGroupApplications to retrieve group applications in paginated format. Group applications expire after 7 days. RC servers store application data for up to 7 days; applications must be resubmitted after expiration.

Interface Prototype

- (void)getGroupApplications:(RCPagingQueryOption *)option
directions:(NSArray<NSNumber *> *)directions
status:(NSArray<NSNumber *> *)status
success:(void (^)(RCPagingQueryResult<RCGroupApplicationInfo *> *result))successBlock
error:(void (^)(RCErrorCode errorCode))errorBlock;

Parameter Description

ParameterTypeDescription
optionRCPagingQueryOptionQuery options including page token (optional, returns first page if empty), items per page (max 200), and sort order (default descending)
directionsNSArray<NSNumber *>Application direction [RCGroupApplicationDirection] array
statusNSArray<NSNumber *>Status type [RCGroupApplicationStatus] array
successBlockBlockSuccess callback returning [RCGroupApplicationInfo] array (total count not supported)
errorBlockBlockFailure callback

Example Code

- (void)getGroupApplications:(NSString *)pageToken {
// Query options
RCPagingQueryOption *option = [[RCPagingQueryOption alloc] init];
// Page token (nil for first page)
option.pageToken = pageToken;
// Items per page
option.count = 20;
// Default NO for descending by operation time, YES for ascending
option.order = NO;
// Application direction
NSArray<NSNumber *> *directions = @[@(RCGroupApplicationDirectionInvitationReceived)];
// Status type
NSArray<NSNumber *> *status = @[@(RCGroupApplicationStatusManagerUnHandled)];

[[RCCoreClient sharedCoreClient] getGroupApplications:option directions:directions status:status success:^(RCPagingQueryResult<RCGroupApplicationInfo *> * _Nonnull result) {
// Retrieval successful
if (result.pageToken.length > 0) {
// Continue fetching next page when pageToken exists
[self getGroupApplications:result.pageToken];
} else {
// No more data available
}
} error:^(RCErrorCode errorCode) {
// Retrieval failed
}];
}