多人通话
本文介绍了 CallPlus 多人通话的主要功能,包括如何发起多人通话、单人通话转为多人通话等。
因为 CallPlus for iOS 多人通话与一对一通话流程相似,本文仅介绍多人通话与一对一通话有差异的使用方法。我们建议您先按照一对一通话实现完整的通话流程。
发起多人通话
从 CallPlus 2.X 开始,新增 startCallWithUserIds:callType:mediaType:pushConfig:extra: 方法,支持在发起呼叫时通过配置推送属性自定义推送标题等属性。支持携带自定义数据。如不需要配置推送属性,可以使用 startCallWithUserIds:callType:mediaType:。
如果您需要直接发起多人通话,请在 startCallWithUserIds:callType:mediaType:pushConfig:extra: 方法中传入多个远端用户 ID,并设置通话类型为 RCCallPlusGroupType
。媒体类型可为视频或音频。您可以创建最多 16 名视频参与者的多人通话,或最多 32 名音频参与者的多人通话。
发起多人通话的方法为异步方法,执行结果在 RCCallPlusResultDelegate 协议的 didStartCallResultCode:callId:busylineUsers: 方法中获取。被叫用户会通过 RCCallPlusEventDelegate 协议的 didReceivedCall:extra: 方法收到来电通知。
接口原型
/// 发起呼叫
- (void)startCallWithUserIds:(NSArray<NSString *> *)userIds
callType:(RCCallPlusType)callType
mediaType:(RCCallPlusMediaType)mediaType
pushConfig:(nullable RCCallPlusPushConfig *)pushConfig
extra:(nullable NSString *)extra;
参数说明
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
userIds | NSArray<NSString *> | 是 | 被叫用户 ID 列表,多人呼叫时传入多个用户 ID |
callType | RCCallPlusType | 是 | 通话类型,多人通话时传入 RCCallPlusGroupType |
mediaType | RCCallPlusMediaType | 是 | 媒体类型(音频、视频) |
pushConfig | [RCCallPlusPushConfig] | 否 | 推送配置 |
extra | NSString | 否 | 附加信息,透传给被呼叫方 |
示例代码
- (void)startGroupCall {
/// 创建推送配置
RCCallPlusPushConfig *pushConfig = [[RCCallPlusPushConfig alloc] init];
pushConfig.disablePushTitle = NO; // 启用推送标题
/// 发起多人音视频通话
[[RCCallPlusClient sharedInstance] startCallWithUserIds:@[@"userId1",@"userId2"]
callType:RCCallPlusGroupType
mediaType:RCCallPlusAudioVideoMediaType
pushConfig:pushConfig
extra:@"extraString"];
}
/// 发起呼叫结果回调
- (void)didStartCallResultCode:(RCCallPlusCode)code
callId:(nullable NSString *)callId
busylineUsers:(nullable NSArray<RCCallPlusUser *> *)busylineUsers {
if (code == 0) {
// 发起通话成功
}
}
接听多人通话
- 非兼容性变更:从 CallPlus 2.X 开始,不再提供 CallPlus 1.X 的
didReceivedCall:
回调方法。请改为使用携带 extra 字段的 didReceivedCall:extra: 方法。 - 被叫用户必须在连接 IM 之前设置 RCCallPlusEventDelegate 代理,并实现 didReceivedCall:extra: 方法。被叫用户可通过与融云的 IM 连接或者 APNs 的离线推送通知接收来电通知。注意,要通过离线推送接收来电通知,App 必须已集成 APNs 推送,详见集成 APNs 推送。
被叫用户收到来电通知后,可以选择接听或拒绝来电。您可以通过 RCCallPlusSession 的 callId
属性获取通话 ID,可以通过 callType
属性查询通话类型是否为多人通话。
- 接听来电,请使用 acceptWithCallId:pushConfig: 方法,或者 joinCall: 方法。
- 挂断来电,请使用 hangupWithCallId:pushConfig: 方法。
接听方法与挂断方法为异步方法,执行结果在 RCCallPlusResultDelegate
的以下代理方法中获取。RCCallPlusCode
为 0 表示成功。
- 接听电话:didAcceptCallResultCode:callId:
- 加入通话:didJoinCallResultCode:callId:
- 挂断电话:didHangupCallResultCode:callId:
接口原型
/// 接听通话
- (void)acceptWithCallId:(NSString *)callId
pushConfig:(nullable RCCallPlusPushConfig *)pushConfig;
/// 加入进行中的群组通话
- (void)joinCall:(NSString *)callId;
/// 挂断通话
- (void)hangupWithCallId:(NSString *)callId
pushConfig:(nullable RCCallPlusPushConfig *)pushConfig;
参数说明
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
callId | NSString | 是 | 通话 ID |
pushConfig | [RCCallPlusPushConfig] | 否 | 推送配置 |
示例代码
/// 被叫用户/被邀请用户接收到通话呼叫通知
- (void)didReceivedCall:(RCCallPlusSession *)session
extra:(nullable NSString *)extra {
// 接听来电
[[RCCallPlusClient sharedInstance] acceptWithCallId:session.callId pushConfig:nil];
// 或者加入通话
// [[RCCallPlusClient sharedInstance] joinCall:session.callId];
// 或者挂断来电
// [[RCCallPlusClient sharedInstance] hangupWithCallId:session.callId pushConfig:nil];
}
/// 接听电话结果回调
- (void)didAcceptCallResultCode:(RCCallPlusCode)code callId:(NSString *)callId {
if (code == 0) {
// 接听成功
}
}
/// 加入通话结果回调
- (void)didJoinCallResultCode:(RCCallPlusCode)code callId:(NSString *)callId {
if (code == 0) {
// 加入成功
}
}
/// 挂断电话结果回调
- (void)didHangupCallResultCode:(RCCallPlusCode)code
callId:(nullable NSString *)callId {
if (code == 0) {
// 挂断成功
}
}
邀请他人加入通话
您可以向某些用户发送邀请来让用户进入多人通话。被邀请者可以接受或拒绝您的邀请。
CallPlus 暂不支持取消邀请。
邀请用户
如果想要邀请其他用户加入通话,邀请者需要已进入一个多人通话或一对一通话。之后使用 inviteWithUserIds:pushConfig:extra: 方法,传入被邀请用户的 ID。此方法为异步方法,邀请者可以通过 RCCallPlusResultDelegate 协议的 didInviteCallResultCode:callId:userIds:busylineUsers: 方法来获取执行结果。如果受邀用户正在呼叫他人的过程中,仍会收到邀请,受邀用户可以选择接听或者挂断该通话。邀请方会在 didInviteCallResultCode:callId:userIds:busylineUsers: 方法的 busylineUsers
参数中返回正在通话中的用户列表。
成功发送邀请后,受邀用户的设备上将通过 RCCallPlusEventDelegate 代理的 didReceivedCall:extra: 方法收到来电通知,通知他们您已邀请他们加入通话。
- 从 CallPlus 2.X 开始,新增 inviteWithUserIds:pushConfig:extra: 方法,支持在邀请时通过配置推送属性自定义推送标题等属性。支持携带自定义数据。如不需要配置推送属性,可以使用 inviteWithUserIds:。
- 如果被邀请者离线,融云服务端可以通过 APNs 推送通知向被邀请者发送来电通知。App 必须已集成 APNs 推送,详见集成 APNs 推送。
接口原型
/// 邀请通话
- (void)inviteWithUserIds:(NSArray<NSString *> *)userIds
pushConfig:(nullable RCCallPlusPushConfig *)pushConfig
extra:(nullable NSString *)extra;
参数说明
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
userIds | NSArray<NSString *> | 是 | 被邀请用户 ID 列表 |
pushConfig | [RCCallPlusPushConfig] | 否 | 推送配置 |
extra | NSString | 否 | 附加信息,透传给被邀请用户 |
示例代码
- (void)inviteUsersToCall {
/// 创建推送配置
RCCallPlusPushConfig *pushConfig = [RCCallPlusPushConfig new];
/// 邀请用户加入通话,并携带推送配置和自定义数据
[[RCCallPlusClient sharedInstance] inviteWithUserIds:@[@"userId1",@"userId2"]
pushConfig:pushConfig
extra:@"extraString"];
}
/// 邀请结果回调
- (void)didInviteCallResultCode:(RCCallPlusCode)code
callId:(NSString *)callId
userIds:(NSArray<NSString *> *)userIds
busylineUsers:(NSArray<RCCallPlusUser *> *)busylineUsers {
if (code == 0) {
// 邀请成功
}
}
获取邀请详情
在通话中发起邀请后,被邀请者、正在通话中的用户、已退出多人通话的用户都将通过 RCCallPlusEventDelegate 协议的 didRemoteUserInvited:inviteeUserList:inviterUserId: 方法收到通知,其中携带通话 callId、发起邀请者用户 ID 与所有受邀用户的 ID。
/// 远端用户被邀请通知
- (void)didRemoteUserInvited:(NSString *)callId
inviteeUserList:(NSArray<NSString *> *)inviteeUserList
inviterUserId:(NSString *)inviterUserId;
接受或拒绝邀请
当被邀请的用户接受或拒绝邀请时,邀请他们的用户将会收到通知。您可以添加 UI 更新,让邀请者知道 他们邀请的用户是接受还是拒绝邀请。
被邀请者可以:
- 接受邀请:使用 acceptWithCallId:pushConfig: 方法接听来电,或者 joinCall: 方法加入多人通话
- 拒绝邀请:使用 hangupWithCallId:pushConfig: 方法挂断来电
接口使用方法请参考上文接听多人通话部分。
如果原通话是一对一通话,受邀请者加入后,通话类型将变更为 RCCallPlusGroupType
,通话参与者(包括已退出的用户)都会通过 didCallTypeChanged:callType: 方法收到通知。
结束通话
从 CallPlus 2.X 开始,新增 hangupWithCallId:pushConfig: 方法,支持在挂断时通过配置推送属性自定义推送标题等属性。如不需要配置推送属性,可以使用 hangup。
挂断与拒绝接听动作均使用 hangup
方法。应用程序可使用 hangup
方法结束当前正在进行中的通话,或者使用 hangupWithCallId:pushConfig: 方法结束指定 callId
的通话。
接口原型
/// 挂断当前通话
- (void)hangup;
/// 挂断通话
- (void)hangupWithCallId:(NSString *)callId
pushConfig:(nullable RCCallPlusPushConfig *)pushConfig;
参数说明
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
callId | NSString | 是 | 通话唯一标识 |
pushConfig | [RCCallPlusPushConfig] | 否 | 推送配置 |
示例代码
应用程序可通过 RCCallPlusResultDelegate 代理对象的 didHangupCallResultCode:callId: 方法接收挂断通话 API 的执行结果。
- (void)endCall {
/// 创建推送配置
RCCallPlusPushConfig *pushConfig = [[RCCallPlusPushConfig alloc] init];
pushConfig.disablePushTitle = NO; // 启用推送标题
/// 挂断指定 callId 的通话
[[RCCallPlusClient sharedInstance] hangupWithCallId:@"callId"
pushConfig:pushConfig];
}
/// 挂断通话回调
- (void)didHangupCallResultCode:(RCCallPlusCode)code callId:(NSString *)callId {
if (code == 0) {
// 挂断成功
}
}
获取未结束的多人通话
用户可能拒绝一个多人通话邀请,或退出一个多人通话,只要该多人通话未结束,用户就可以再次加入。
用户可以使用 getAvailableCallRecordsFromServer 方法向服务端查询本地用户所有曾经参与过(或曾经被邀请过)、且仍在进行中的多人通话。该方法在 SDK 内部为异步执行,应用程序可以在 RCCallPlusResultDelegate
代理的 didGetAvailableCallRecords:code: 方法获取调用结果。
接口原型
/// 从服务器获取当前用户未结束的通话记录
- (void)getAvailableCallRecordsFromServer;
示例代码
- (void)getAvailableCalls {
[[RCCallPlusClient sharedInstance] getAvailableCallRecordsFromServer];
}
/// 从服务器获取当前用户未结束的通话记录结果回调
- (void)didGetAvailableCallRecords:(NSArray<RCCallPlusCallRecord *> *)records
code:(RCCallPlusCode)code {
if (code == 0) {
// 获取成功,处理通话记录
}
}
获取未结束通话的记录后,通过 RCCallPlusCallRecord
中 callId
属性获取通话 ID,使用 joinCall
方法传入通话 ID 即可加入正在进行中的多人通话。