文档中心
IM 即时通讯
文档中心
体验 App
SDK 中心
API 中心
常见问题
代码市场
进入控制台
立即注册
登录
中文站 English
  • 文档中心
  • 即时通讯
  • 呼叫邀请

呼叫邀请

更新时间:2024-08-06 19:23

功能简介

本文档适用于开发以下平台的应用:iOS、Android、macOS、Windows、Web。

ZIM SDK 提供了呼叫邀请功能,支持主叫向被叫(可为离线状态)发送呼叫邀请、被叫(可为离线状态)接受或拒绝邀请等完整的业务流程控制能力。呼叫邀请分为两种模式,普通模式与进阶模式。

普通模式的呼叫邀请支持用户发起、取消、接受、拒绝和超时未响应。在此基础上,进阶模式的呼叫邀请还允许用户中途邀请他人、退出以及结束呼叫。

“呼叫邀请” 功能仅提供了基本的业务流程控制能力,开发者需要自行实现使用本功能的业务需求(例如,通常应用在聊天工具中,发起语音通话或视频通话邀请等场景中)。

呼叫用户状态说明

呼叫用户状态(ZIMCallUserState),是指用户在呼叫邀请各个环节中的状态。本节主要介绍状态如何流转,以及状态与接口/回调的关系。

状态流转

从呼叫邀请发起到呼叫结束,呼叫用户状态流转如下图所示:

状态 含义 触发事件 适用模式
Inviting
被邀请中。
用户正在被邀请。
  • 普通模式。
  • 进阶模式。
Accepted
已接受邀请。
  • 用户发起呼叫邀请。
  • 用户接受呼叫邀请。
Rejected
已拒绝邀请。
用户拒绝呼叫邀请。
Cancelled
已取消邀请。
  • 用户主动取消呼叫邀请.
  • 被叫尚未应答邀请,而主叫掉线且心跳超时。
Received
已收到邀请。
  • 在线用户收到邀请。
  • 离线用户在超时范围内上线。
Timeout
超时未接受。
被叫用户超时未响应邀请。
Quit
退出。
呼叫实现后,用户退出呼叫。
  • 进阶模式。
Unknown
未知。
请联系 ZEGO 技术支持。

状态与接口/回调的关系

在用户在进行呼叫邀请时,其呼叫状态会影响用户是否可以调用某些接口,或者监听某些事件。

  • 各呼叫状态可调用接口:

    callInvite callCancel callAccept callReject callInvite callQuit callEnd
    Inviting
    与用户呼叫状态无关,只需用户不在呼叫中,即可调用。
    与用户状态无关,只需用户发起邀请后,无人应答即可调用。
    ✔️
    ✔️
    ✖
    ✖
    ✖
    Accepted
    ✖
    ✖
    ✔️
    ✔️
    ✔️
    Rejected
    ✖
    ✖
    ✖
    ✖
    ✖
    Cancelled
    ✖
    ✖
    ✖
    ✖
    ✖
    Received
    ✔️
    ✔️
    ✖
    ✖
    ✖
    Timeout
    ✖
    ✖
    ✖
    ✖
    ✖
    Quit
    ✖
    ✖
    ✖
    ✖
    ✖
    Unknown
    ✖
    ✖
    ✖
    ✖
    ✖
  • 各用户状态可监听事件:

    onCallInvitationReceived onCallInvitationTimeout onCallInvitationCancelled onCallInvitationEnded onCallUserStateChanged
    Inviting
    ✔️
    ✔️
    ✔️
    ✔️
    ✔️
    Accepted
    ✖
    ✖
    ✖
    ✔️
    ✔️
    Rejected
    ✖
    ✖
    ✖
    ✖
    ✖
    Cancelled
    ✖
    ✖
    ✖
    ✖
    ✖
    Received
    ✖
    ✖
    ✔️
    ✔️
    ✔️
    Timeout
    ✖
    ✖
    ✖
    ✖
    ✖
    Quit
    ✖
    ✖
    ✖
    ✖
    ✔️
    Unknown
    ✖
    ✖
    ✖
    ✖
    ✖

前提条件

在实现“呼叫邀请”功能之前,请确保:

  • 已在 ZEGO 控制台 创建项目,获取到了接入 ZIM SDK 服务所需的 AppID、AppSign。ZIM 服务权限不是默认开启的,使用前,请先在 ZEGO 控制台 自助开通 ZIM 服务(详情请参考控制台的 服务配置 - 即时通讯 - 开通服务),若无法开通 ZIM 服务,请联系 ZEGO 技术支持开通。

  • 已集成 ZIM SDK,详情请参考 快速开始 - 实现基本收发消息 的 “2 集成 SDK”。

  • (可选)如需实现呼叫邀请离线推送,请参考下表。

    呼叫邀请离线推送发起端 呼叫邀请离线推送接收端 接收端配置参考文档
    • iOS
    • Android
    • macOS
    • Windows
    • Web
    • 小程序
    • iOS
    • Android
    • 实现离线推送 - iOS
    • 实现离线推送 - Android

普通模式

普通模式下,呼叫邀请的生命周期在全员响应后随即结束(所有被叫接受、拒绝、邀请超时之后)。以下,我们以客户端 A(邀请者)向客户端 B(被邀请者)发起呼叫邀请为例。

1 监听呼叫邀请相关用户的状态变化

开发者可以监听 onCallUserStateChanged 回调,进而收到呼叫邀请相关用户的状态变化。

示例代码如下:

// 监听呼叫邀请相关用户的状态变化
ZIMEventHandler.onCallUserStateChanged = (ZIM zim, ZIMCallUserStateChangeInfo callUserStateChangeInfo, String callID){
    for(ZIMCallUserInfo userInfo in callUserStateChangeInfo.callUserList){

        // 状态发生变化的 userID

        String userID = userInfo.userID;
        // 该用户当前最新的状态
        ZIMCallUserState state = userInfo.state;

        // 透传字段,与用户调用接受、拒绝、退出接口时携带的 extended data 内容一致
        String extendedData = userInfo.extendedData;
    }
};

2 发起呼叫邀请

客户端 A 向客户端 B 发起呼叫邀请时,流程如下:

  1. 客户端 A 注册 onCallInvitationCreated 回调接口,以便接收呼叫邀请已创建的通知;客户端 B 注册 onCallInvitationReceived 回调接口,以便接收客户端 A 的邀请通知。

  2. 客户端 A 通过调用 callInvite 接口,发起呼叫邀请,客户端 B 在收到邀请信息后,可以选择 接受 或者 拒绝。

    若客户端 B 为离线用户:

    • 在 timeout(邀请超时时间)内登录,即可通过 onCallInvitationReceived 收到呼叫邀请通知。
    • 在 timeout 外登录,请调用 queryCallInvitationList 来 查询呼叫邀请列表。

callInvite 说明

Future<ZIMCallInvitationSentResult> callInvite(
    List<String> invitees, ZIMCallInviteConfig config);
参数 类型 是否必填 说明
invitees List<String> 是 被邀请者列表,开发者需要填写被邀请者的 userID。至多邀请 9 名用户。
config ZIMCallInviteConfig 是 发起呼叫邀请操作行为的属性配置。

开发者可以通过 ZIMCallInvitationSentResult 类型的异步返回值,接收发起操作结果的相关通知。

示例代码

  • 发送呼叫邀请

    // 发送呼叫邀请
    List<String> invitees = []; // 被邀请人列表
    invitees.add('1234'); //被邀请人 id
    ZIMCallInviteConfig callInviteConfig = ZIMCallInviteConfig();
    callInviteConfig.timeout = 200; //邀请超时时间,单位为秒,范围1-600
    
    // (可选)需要向离线用户发起呼叫邀请时填写
    ZIMPushConfig pushConfig = ZIMPushConfig();
    pushConfig.title = "your title";
    pushConfig.content = "your content";
    pushConfig.payload = "your payload";
    config.pushConfig = pushConfig;
    
    ZIM
        .getInstance()
        !.callInvite(invitees, callInviteConfig)
        .then((value) => {})
        .catchError((onError) {});
  • 邀请发起者收到呼叫邀请已创建的通知,示例代码如下:

    /** 邀请发起者收到呼叫邀请已创建的通知 */
    ZIMEventHandler.onCallInvitationCreated = (ZIM zim, ZIMCallInvitationCreatedInfo info, String callID){
    
    };
  • 被邀请者收到邀请后的回调通知

    //被邀请者收到邀请后的回调通知
    ZIMEventHandler.onCallInvitationReceived = (zim, info, callID) {
    
    };

3 取消呼叫邀请

客户端 A 向客户端 B 发起呼叫邀请后、又取消邀请时,流程如下:

  1. 客户端 A 发起呼叫邀请后,如果需要取消,可以调用 callCancel 接口,主动选择取消当前邀请。

    在呼叫邀请成功创建后至其超时前,如果没有任何被叫用户接受,主叫用户主动登出或因心跳超时而掉线,也会导致呼叫邀请被取消。

  1. 邀请取消后,客户端 B 会收到 onCallInvitationCancelled 回调接口的相关通知。

callCancel 说明

Future<ZIMCallCancelSentResult> callCancel(
    List<String> invitees, String callID, ZIMCallCancelConfig config);
参数 类型 是否必填 说明
invitees List<String> 是

取消被邀者列表,开发者需要填写被邀请者的 userID。

支持同时取消邀请一个或多个用户。

callID String 是 取消呼叫邀请的 CallID。
config ZIMCallCancelConfig 是 取消呼叫邀请操作行为的属性配置。

取消邀请后,用户可以通过 ZIMCallCancelSentResult 类型的异步返回值,接收取消呼叫邀请的操作结果回调通知。

示例代码

  • 取消呼叫邀请

    // 取消呼叫邀请
    List<String> invitees;  // 被邀请人列表
    invitees.add("421234");       // 被邀请人id
    String callid = "12352435";        // callid
    ZIMCallCancelConfig config = new ZIMCallCancelConfig();
    
    ZIM
        .getInstance()
        !.callCancel(invitees, callID, callCancelConfig)
        .then((value) => {})
        .catchError((onError) {});
  • 被邀请者收到取消邀请后的回调通知

    //被邀请者收到取消邀请后的回调通知
    ZIMEventHandler.onCallInvitationCancelled = (zim, info, callID) {
    
    };

4 接受呼叫邀请

客户端 B 收到客户端 A 的呼叫邀请后,选择接受邀请时,流程如下:

  1. 客户端 B 收到客户端 A 发来的呼叫邀请后,通过调用 callAccept 接口,接受该邀请。
  2. 客户端 B 接受邀请后,客户端 A 可以通过 onCallUserStateChanged 回调接口,收到相关通知。如果是在多人呼叫中,则所有现有呼叫成员都可通过此回调收到相关通知。

callAccept 说明

Future<ZIMCallAcceptanceSentResult> callAccept(
    String callID, ZIMCallAcceptConfig config);
参数 类型 是否必填 说明
callID String 是 接受呼叫邀请的 CallID。
config ZIMCallAcceptConfig 是 接受呼叫邀请操作行为的属性配置。

接受邀请后,用户可以通过 ZIMCallAcceptanceSentResult 类型的异步返回值,接收接受呼叫邀请的操作结果回调通知。

示例代码

  • 接受呼叫邀请

    ZIMCallAcceptConfig callAcceptConfig = ZIMCallAcceptConfig();
    ZIM
        .getInstance()
        !.callAccept(callID, callAcceptConfig)
        .then((value) => {})
        .catchError((onError) {});
  • 呼叫成员收到有用户接受呼叫邀请的通知

    ZIMEventHandler.onCallUserStateChanged = (ZIM zim, ZIMCallUserStateChangeInfo callUserStateChangeInfo, String callID){
        // 所有用户状态为“Inviting”、“Accepted“和“Received”的用户可在此处收到有用户接受呼叫邀请的通知
    };

5 拒绝呼叫邀请

客户端 B 收到客户端 A 的呼叫邀请后,选择拒绝邀请时,流程如下:

  1. 客户端 B 收到客户端 A 发来的呼叫邀请后,通过调用 callReject 接口,拒绝该邀请。
  2. 客户端 B 拒绝邀请后,客户端 A 可以通过 onCallUserStateChanged 回调接口,收到相关通知。如果是在多人呼叫中,则所有现有呼叫成员都可通过此回调收到相关通知。

callReject 说明

Future<ZIMCallRejectionSentResult> callReject(
    String callID, ZIMCallRejectConfig config);
参数 类型 是否必填 说明
callID String 是 拒绝呼叫邀请的 CallID。
config ZIMCallRejectConfig 是 拒绝呼叫邀请操作行为的属性配置。

拒绝邀请后,用户可以通过 ZIMCallRejectionSentResult 类型的异步返回值,接收拒绝呼叫邀请的操作结果回调通知。

示例代码

  • 拒绝呼叫邀请

    String callID = "12352435";        // callID
    ZIMCallRejectConfig rejectConfig = ZIMCallRejectConfig();
    ZIM.getInstance()!.callReject(callID, rejectConfig).then((value) => {}).catchError((onError){});
  • 呼叫成员收到有用户拒绝呼叫邀请的通知

    ZIMEventHandler.onCallUserStateChanged = (ZIM zim, ZIMCallUserStateChangeInfo callUserStateChangeInfo, String callID){
        // 所有用户状态为“Inviting”、“Accepted“和“Received”的用户可在此处收到有用户拒绝呼叫邀请的通知
    };

6 超时未响应呼叫邀请

客户端 B 收到客户端 A 的呼叫邀请后,客户端 B 长时间未响应时,流程如下:

客户端 B 收到客户端 A 发来的呼叫邀请后,如果客户端 B 超时未响应邀请:

  1. 客户端 A(邀请者)通过 onCallUserStateChanged 回调接口,收到邀请超时、客户端未响应的通知。如果是在多人呼叫中,则所有现有呼叫成员都可通过此回调收到相关通知。
  2. 客户端 B(被邀请者)通过 onCallInvitationTimeout 回调接口,收到邀请超时、自己未响应的通知。

示例代码

  • 被邀请者响应超时后,“邀请者”收到的回调通知

    // 被邀请者响应超时后,“邀请者”收到的回调通知
    ZIMEventHandler.onCallUserStateChanged = (ZIM zim, ZIMCallUserStateChangeInfo callUserStateChangeInfo, String callID){
        // 所有用户状态为“Inviting”、“Accepted“和“Received”的用户可在此处收到有用户超时的通知
    };
  • 被邀请者响应超时后,“被邀请者”收到的回调通知

    // 被邀请者响应超时后,“被邀请者”收到的回调通知,超时时间单位:秒
    ZIMEventHandler.onCallInvitationTimeout = (ZIM zim, ZIMCallInvitationTimeoutInfo info, String callID) {
    
    };

进阶模式

如果您想要实现更为丰富的用户状态场景,比如多人呼叫邀请业务场景,可以参考本节内容实现进阶模式的呼叫邀请。

发起进阶模式的呼叫邀请后,呼叫邀请的生命周期延长至用户主动调用 callEnd 接口结束呼叫。在结束呼叫之前,用户还可以实现在呼叫中继续邀请他人以及退出呼叫的功能。

发起进阶模式的呼叫邀请

开发者在调用 callInvite 接口时主动设置模式为进阶模式,,才能发起进阶模式的呼叫邀请。

示例代码:

// 向用户发送呼叫邀请 - 进阶模式

List<String> invitees = ["421234"];  // 被邀请人 ID 列表

ZIMCallInviteConfig config = ZIMCallInviteConfig();
config.timeout = 200; // 邀请超时时间,单位为秒,范围 1-600
//  mode 为呼叫邀请模式,advanced 表示进阶模式。
config.mode = ZIMCallInvitationMode.advanced;

// (可选)需要向离线用户发起呼叫邀请时填写
ZIMPushConfig pushConfig = ZIMPushConfig();
pushConfig.title = "your title";
pushConfig.content = "your content";
pushConfig.payload = "your payload";
config.pushConfig = pushConfig;

ZIM.getInstance()!.callInvite(invitees, config).then((ZIMCallInvitationSentResult result){
    // 此处的 callID 是用户发起呼叫后,SDK 内部生成的 ID,用于唯一标识一次呼叫邀请;之后发起人取消呼叫、被邀请人接受/拒绝呼叫,都会使用此 callID
});

除了发起外,呼叫邀请的进阶模式和普通模式在取消、接受、拒绝和超时未响应上没有差别。

呼叫中邀请

在创建进阶模式呼叫邀请后,用户状态为 Accepted 的用户可以调用 callingInvite 接口向不在本呼叫中的用户发起邀请。但是,同一个呼叫中的参与用户不能超过 10 人(含邀请创建用户)。

示例代码

  • 呼叫中邀请

    // 呼叫中邀请
    List<String> inviteesList = ["A","B"];
    ZIMCallingInviteConfig inviteConfig = ZIMCallingInviteConfig();
    // callID 通过创建进阶模式呼叫邀请的回调获取
    ZIM.getInstance()!.callingInvite(inviteesList, "callID", inviteConfig).then((value) {
        //邀请成功后的业务逻辑
    }).catchError((onError) {
        //根据官网错误码表处理
    });
  • 呼叫成员收到正在邀请其他用户的通知

    ZIMEventHandler.onCallUserStateChanged = (ZIM zim, ZIMCallUserStateChangeInfo callUserStateChangeInfo, String callID){
            // 所有用户状态为“inviting”,"received"和“accept”的用户可在此处收到有用户被呼叫邀请的通知
    };

主动加入呼叫或切换设备

实现进阶模式呼叫邀请后,以下两种情况下,可以调用 callJoin 接口加入呼叫:

  • 没有加入呼叫的用户。
    • 对于呼叫外用户加入成功的场景,该用户的状态将流转为 accepted,此时呼叫中的所有用户收到 onCallUserStateChanged 的通知回调
  • 多端登录用户使用设备 A 发起或接受邀请后,希望让其他设备成为新的主设备。
    • 对于切换设备的场景,呼叫内其他用户无感知。
  • 主设备,是指主动调用发起、接受或加入呼叫接口参与呼叫的设备。
  • 只有主设备能感知呼叫邀请的变化,其他设备只能通过查询呼叫邀请列表来获取呼叫邀请内的数据。

示例代码

// 主动加入呼叫或切换设备

ZIMCallJoinConfig joinConfig = ZIMCallJoinConfig();
joinConfig.extendedData = "extendedData";
ZIM.getInstance()?.callJoin('callID',joinConfig).then((result) => {
    // 加入成功后的业务逻辑
}).catchError((onError){
    // 根据官网错误码表处理错误
});

退出呼叫

实现进阶模式呼叫邀请后,呼叫用户状态为 Accepted 的用户都可调用 callQuit 接口退出呼叫。退出成功后,该用户的用户状态(userState)将流转为 quit,该用户和仍在呼叫中的其他用户都将会收到 onCallUserStateChanged 的通知回调。

  • 退出呼叫

    // 退出呼叫
    ZIMCallQuitConfig config = ZIMCallQuitConfig();
    // callID 通过创建进阶模式呼叫邀请的回调获取
    ZIM.getInstance()!.callQuit("callID", config).then((value) {
        // 退出成功后的业务逻辑
    }).catchError((onError){
        // 退出失败的业务逻辑
    });
  • 呼叫成员收到有用户退出呼叫的通知

    ZIMEventHandler.onCallUserStateChanged = (ZIM zim, ZIMCallUserStateChangeInfo callUserStateChangeInfo, String callID){
            // 退出用户本人和用户状态为 “inviting”, “received” 和 “accept” 的其他用户可在此处收到有用户员退出呼叫的通知
    }; 

结束呼叫

实现进阶模式呼叫邀请后,呼叫用户状态为 Accepted 的用户可调用 callEnd 接口结束呼叫。此后,所有人的用户状态保持不变,该呼叫的状态(callState)变为 end,用户状态为 Iniviting、Accepted 和 Received 的用户将会收到 onCallInvitationEnded 的通知回调。

示例代码

  • 结束呼叫

    // 结束呼叫
    ZIMCallEndConfig config = ZIMCallEndConfig();
    // callID 通过创建进阶模式呼叫邀请的回调获取
    ZIM.getInstance()!.callEnd("callID", config).then((value) {
        // 结束成功后的业务逻辑
    }).catchError((onError){
        // 根据官网错误码表处理错误
    });
  • 呼叫成员收到呼叫结束的通知

    ZIMEventHandler.onCallInvitationEnded = (ZIM zim, ZIMCallInvitationEndedInfo info, String callID) {
    
    };

更多功能

查询呼叫邀请列表

通过调用 queryCallInvitationList 接口,用户可以查询与自己相关的呼叫邀请列表,单次查询上限为 100 条,超过 100 条按照 100 条处理。

// 查询用户自己的呼叫邀请列表 

ZIMCallInvitationQueryConfig queryCallListConfig = ZIMCallInvitationQueryConfig();
queryCallListConfig.count = 20;
queryCallListConfig.nextFlag = 0;

ZIM.getInstance()!.queryCallInvitationList(queryCallListConfig).then((ZIMCallInvitationListQueriedResult result) {
    if(result.nextFlag != 0){
      // 如果 callback 返回的 nextFlag 不为 0,代表没有完成查询所有的呼叫邀请信息。下次查询时可以传入 callback 返回的 nextFlag 继续查询剩余呼叫邀请信息
      queryCallListConfig.nextFlag = result.nextFlag;
    }
}).catchError((onError){
    // 根据官网错误码表处理错误
});
本篇目录
  • 免费试用
  • 提交工单
    咨询集成、功能及报价等问题
    电话咨询
    400 1006 604
    咨询客服
    微信扫码,24h在线

    联系我们

  • 文档反馈