跳到主要内容

多人通话

本文介绍了多人通话的主要功能,包括如何发起多人通话、单人通话转为多人通话等。

注意

因为 CallPlus for iOS 多人通话与一对一通话流程相似,本文仅介绍多人通话与一对一通话有差异的使用方法。我们建议您先按照一对一通话实现完整的通话流程。


发起多人通话

注意

从 CallPlus 2.X 开始,新增 startCallWithUserIds:callType:mediaType:pushConfig:extra: 方法,支持在发起呼叫时通过配置推送属性自定义远程推送标题等属性。支持携带自定义数据。如不需要配置推送属性,可以使用 startCallWithUserIds:callType:mediaType:

如需直接发起多人通话,请在 startCall 方法中传入多个远端用户 ID,并设置通话类型为 RCCallPlusGroupType。媒体类型可为视频或音频。您可以创建最多 16 名视频参与者的多人通话,或最多 32 名音频参与者的多人通话。

该方法内部为异步执行,方法结果在 RCCallPlusResultDelegate 协议的 didStartCallResultCode 方法中获取。被叫用户会通过 RCCallPlusEventDelegate 协议的 didReceivedCall:(RCCallPlusSession *)session extra:(nullable NSString *)extra 方法收到来电通知。

- (void)startGroupCall {
/// 开始呼叫,并携带推送配置
RCCallPlusPushConfig *pushConfig = [[RCCallPlusPushConfig alloc] init];
pushConfig.disablePushTitle = NO;
[[RCCallPlusClient sharedInstance] startCallWithUserIds:@[@"userId1",@"userId2"]
callType:RCCallPlusGroupType
mediaType:RCCallPlusAudioVideoMediaType
pushConfig:pushConfig
extra:@"extraString"];


}


接听多人通话

重要

非兼容性变更:从 CallPlus 2.X 开始,不再提供 CallPlus 1.X 的 didReceivedCall: 回调方法。请改为使用携带 extra 字段的 didReceivedCall:extra: 方法。

注意

被叫用户必须已设置 RCCallPlusEventDelegate 代理,并实现 didReceivedCall:(RCCallPlusSession *)session extra:(nullable NSString *)extra 方法。被叫用户可通过与融云的 IM 连接或者 APNs 的离线推送通知接收来电通知。注意,要通过离线消息推送接收来电通知,App 必须已集成 APNs 推送,详见集成 APNs 推送

被叫用户收到来电通知后,可以选择接听或拒绝来电。应用程序可以通过 RCCallPlusSessioncallId 属性获取通话 ID,可以通过 callType 属性查询通话类型是否为多人通话。

  • 接听来电,使用 [[RCCallPlusClient sharedInstance] acceptWithCallId:callId] 方法,或者 [[RCCallPlusClient sharedInstance] joinCall:callId] 方法。
  • 挂断来电,使用 [[RCCallPlusClient sharedInstance] hangupWithCallId:callId] 方法。

接听方法与挂断方法在 SDK 内部为异步执行,调用结果在 RCCallPlusResultDelegate 的以下代理方法中获取。RCCallPlusCode 为 0 表示成功。

  • 接听电话:didAcceptCallResultCode:(RCCallPlusCode)code callId:(NSString *)callId
  • 加入通话:didJoinCallResultCode:(RCCallPlusCode)code callId:(NSString *)callId
  • 挂断电话:didHangupCallResultCode:(RCCallPlusCode)code callId:(NSString *)callId

邀请他人加入通话

您可以向某些用户发送邀请来让用户进入多人通话。被邀请者可以接受或拒绝您的邀请。

注意

CallPlus 暂不支持取消邀请。

邀请用户

注意

从 CallPlus 2.X 开始,新增 inviteWithUserIds:pushConfig:extra: 方法,支持在邀请时通过配置推送属性自定义远程推送标题等属性。支持携带自定义数据。如不需要配置推送属性,可以使用 inviteWithUserIds:

首先,本地用户需要已进入一个多人通话或一对一通话。要邀请其他用户,使用 inviteWithUserIds: 方法,并传入用户 ID。此方法是异步调用的,应用程序可以通过 RCCallPlusResultDelegate 协议的 didInviteCallResultCode 方法来获取调用结果。如果受邀用户正在呼叫他人的过程中,仍会收到邀请,受邀用户可以选择接听或者挂断该通话。邀请方会在 didInviteCallResultCode 方法的 busylineUsers 参数中返回正在通话中的用户列表。

    /// 邀请用户加入通话,并携带推送配置和自定义数据
RCCallPlusPushConfig *pushConfig = [RCCallPlusPushConfig new];
[[RCCallPlusClient sharedInstance] inviteWithUserIds:@[@"userId1",@"userId2"]
pushConfig:pushConfig
extra:@"extraString"];

成功发送邀请后,受邀用户的设备上将通过 RCCallPlusEventDelegate 代理的 didReceivedCall:(RCCallPlusSession *)session extra:(nullable NSString *)extra 方法收到来电通知,通知他们您已邀请他们加入通话。

如果被邀请者离线,融云服务端可以通过 APNs 的推送通知向被邀请者发送来电通知。App 必须已集成 APNs 推送,详见集成 APNs 推送

获取邀请详情

在通话中发起邀请后,被邀请者、正在通话中的用户、已退出多人通话的用户都将通过 RCCallPlusEventDelegate 协议的 didRemoteUserInvited 方法收到通知,其中携带通话 ID、发起邀请者用户 ID 与所有受邀用户的 ID。

/// 接收远端人员被邀请加入通话通知
/// 如 A 与 B 通话中,A 邀请 C,则 B 会收到此回调
/// @param callId 会话 id
/// @param inviteeUserList 受邀人用户 ID 列表
/// @param inviterUserId 邀请者用户 ID
- (void)didRemoteUserInvited:(NSString *)callId
inviteeUserList:(NSArray *)inviteeUserList
inviterUserId:(NSString *)inviterUserId;

接受或拒绝邀请

当被邀请的用户接受或拒绝邀请时,邀请他们的用户将会收到通知。您可以添加 UI 更新,让邀请者知道他们邀请的用户是接受还是拒绝邀请。

  • 被邀请者接受邀请,可以使用 [[RCCallPlusClient sharedInstance] acceptWithCallId:callId] 方法接听来电,或者 [[RCCallPlusClient sharedInstance] joinCall:callId] 方法加入多人通话。
  • 被邀请者拒绝邀请,可以使用 [[RCCallPlusClient sharedInstance] hangupWithCallId:callId] 方法挂断来电。

接听方法与挂断方法在 SDK 内部为异步执行,调用结果在 RCCallPlusResultDelegate 的以下代理方法中获取。RCCallPlusCode 为 0 表示成功。

  • 接听电话:didAcceptCallResultCode:(RCCallPlusCode)code callId:(NSString *)callId
  • 加入通话:didJoinCallResultCode:(RCCallPlusCode)code callId:(NSString *)callId
  • 挂断电话:didHangupCallResultCode:(RCCallPlusCode)code callId:(NSString *)callId

如果原通话是一对一通话,受邀请者加入后,通话类型将变更为 RCCallPlusGroupType,通话参与者(包括已退出的用户)都会通过 didCallTypeChanged 方法收到通知。


结束通话

注意

从 CallPlus 2.X 开始,新增 hangupWithCallId:pushConfig: 方法,支持在挂断时通过配置推送属性自定义远程推送标题等属性。如不需要配置推送属性,可以使用 hangup

挂断与拒绝接听动作均使用 hangup 方法。应用程序可使用 [[RCCallPlusClient sharedInstance] hangup]; 方法结束当前正在进行中的通话,或者使用 hangupWithCallId: 方法结束指定 callId 的通话。应用程序可通过 RCCallPlusResultDelegate 代理对象的 didHangupCallResultCode:callId: 方法接收 API 的执行结果。

/// 挂断指定 callId 通话,并携带推送配置
RCCallPlusPushConfig *pushConfig = [[RCCallPlusPushConfig alloc] init];
pushConfig.disablePushTitle = NO;
[[RCCallPlusClient sharedInstance] hangupWithCallId:@"callId"
pushConfig:pushConfig];

/// 挂断通话回调
/// @param code 状态码, 0:成功 非0:失败
/// @param callId 通话id
- (void)didHangupCallResultCode:(RCCallPlusCode)code callId:(NSString *)callId {
}

获取未结束的多人通话

用户可能拒绝一个多人通话邀请,或退出一个多人通话,只要该多人通话未结束,用户就可以再次加入。

用户可以使用 getAvailableCallRecordsFromServer 方法向服务端查询本地用户所有曾经参与过(或曾经被邀请过)、且仍在进行中的多人通话。

[[RCCallPlusClient sharedInstance] getAvailableCallRecordsFromServer];

该方法在 SDK 内部为异步执行,应用程序可以在 RCCallPlusResultDelegate 代理的 didGetAvailableCallRecords 方法获取调用结果。

/// 从服务器获取未结束的通话列表结果回调
/// @param records 通话记录集合
/// @param code 状态码, 0:获取成功, 非0:获取失败
- (void)didGetAvailableCallRecords:(NSArray<RCCallPlusCallRecord *> *)records
code:(RCCallPlusCode)code;

获取未结束通话的记录后,通过 RCCallPlusCallRecordcallId 属性获取通话 ID,使用 joinCall 方法传入通话 ID 可加入正在进行中的多人通话。