# 实现视频会议

本文档为您展示通过插件实现视频会议的相关步骤,帮助您在多人会议场景下实现创建/加入会议、会议邀请、退出会议、发送消息等相关能力。

开始之前,请您先做好如下准备工作:

  • iOS 插件下载

  • iOS 插件配置和初始化

    如果您已经做好相关准备工作,即可继续以下的内容。

# 开启会议功能界面

需要使用菊风会议功能,通过以下接口直接跳转到会议功能界面:

/**
 * @brief 进入会议主界面
 * @param vc 需要弹出界面的ViewController
 * @param config 会议配置信息
 * @param callback 回调接口对象
 */
- (void)startConferenceHomeView:(UIViewController *)vc config:(JMConfig *)config callback:(id<JMCallback>)callback;

/**
 * @brief 登录配置类
 */
@interface JMConfig : NSObject

/**
 * SDK信息存储目录,该目录下的log目录为日志目录,可以为空,为空默认在sdk的应用目录下
 */
@property (nonatomic, copy) NSString *infoDir;

/**
 * 用户从 Juphoon Cloud 平台上申请的 AppKey 字符串
 */
@property (nonatomic, copy) NSString *appKey;
    
/**
 * 接入 Juphoon 服务器地址
 */
@property (nonatomic, copy) NSString *server;
    
/**
 * 登录用户名, 注意:用户名为英文数字和'+' '-' '_' '.',长度不要超过64字符,'-' '_' '.'不能作为第一个字符
 */
@property (nonatomic, copy) NSString *userName;

/**
 * 针对会议功能界面,0 提供所有会议功能,1 只提供加入会议功能
 */
@property (nonatomic, assign) int userType;

/**
 * 用户昵称
 */
@property (nonatomic, copy) NSString *nickName;

/**
 * 头像链接
 */
@property (nonatomic, copy) NSString *photoUrl;

/**
 * 头像二进制数据转Base6
 */
@property (nonatomic, copy) NSString *photoBase64;

/**
 * 用户手机号码
 */
@property (nonatomic, copy) NSString *phone;

/**
 * 会议号,加入会议时不能为空,10位会议号加入 Juphoon 会议,否则加入sip会议(思科,保利通会议等)
 */
@property (nonatomic, copy) NSString *confNum;

/**
 * 是否直接通过会议号加入,true跳到会议列表界面后自动加入,false则不自动加入
 */
@property (nonatomic, assign) Boolean isAutoJoin;

/**
 * 是否弹出会议详情框确认入会,(场景用户点击链接进入会议),需要会议号参数
 */
@property (nonatomic, assign) bool isDialogConfInfo;

/**
 * 会议密码,加入会议需要
 */
@property (nonatomic, copy) NSString *confPassword;

/**
 * sip用户加入会议后的昵称
 */
@property (nonatomic, copy) NSString *sipDisplayName;

/**
 * sip会议用户uri
 */
@property (nonatomic, copy) NSString *sipUri;

/**
 * sip会议密码
 */
@property (nonatomic, copy) NSString *sipPassword;

/**
 * sip核心网地址
 */
@property (nonatomic, copy) NSString *sipCoreNetwork;

/**
 * sip会议号长度数组,支持多种长度,比如思科会议是四位,保利通会议是六位
 */
@property (nonatomic, strong) NSArray<NSNumber *> *sipConfNumLength;

/**
 * 屏幕共享插件groupId
 */
@property (nonatomic, copy) NSString *shareGroupId;

/**
 * 屏幕共享插件bundle id
 */
@property (nonatomic, copy) NSString *shareExtension;
/**
 * 文字水印
 */
@property (nonatomic, copy) NSString *watermark;

示例代码:

JMConfig *config = [[JMConfig alloc] init];
config.appKey = @"appKey";
config.server = @"server";
config.userName = @"userName";
[JMManager.shared startConferenceHomeView:self config:config callback:self];

# 选择联系人

当插件内需要选择联系人功能,插件会通过 JMCallBack 接口通知,当收到该回调通知时,App 可以跳转到联系人选择界面。

选完后再通过设置联系人接口,设置选择的联系人。

/**
 * @brief 选择联系人回掉
 * @param contacts 已经在会议中的联系人
 * @param vc 需要选择联系人的界面对象
 */
- (void)onRequestContacts:(UIViewController *)vc contacts:(NSArray<JMContact *> *)contacts;

/**
 * @brief 联系人
 */
@interface JMContact : NSObject

/**
 * 昵称
 */
@property (nonatomic, copy) NSString *nickName;
    
/**
 * 头像链接
 */
@property (nonatomic, copy) NSString *photoUrl;
    
/**
 * 头像base64字符串
 */
@property (nonatomic, copy) NSString *photoBase64;
    
/**
 * 手机号码
 */
@property (nonatomic, copy) NSString *phone;
    
/**
 * 用户名(同登录菊风平台的用户名)
 */
@property (nonatomic, copy) NSString *userName;

/**
 * 是否在会议中,预约的成员未进入会议中false
 */
@property (nonatomic, copy) bool isJoined;

/**
 * 用户类型,0 内部人员,1 外部人员
 */
@property (nonatomic, assign) int userType;

示例代码:

- (void)onRequestContacts:(UIViewController *)vc contacts:(NSArray<JMContact *> *)contacts {
    NSLog(@"contacts:%@,vc:%@",contacts,vc);
}

# 设置联系人

在联系人选择后,通过该接口将选择好的联系人,通知插件。

/**
 * @brief 设置已经选择的联系人
 * @param contacts 联系人列表
 */
- (void)setContacts:(NSArray<JMContacts *> *)contacts;

示例代码:

NSArray *contacts = [NSArray array];
[JMManager.shared setContacts:contacts];

# 会议邀请

在会议中时,用户点击邀请按钮后,会通过 JMCallBack 接口通知,当收到该回调通知时,App可以跳转到邀请成员界面。

/**
 * @brief 邀请成员回调
 * @param vc 邀请按钮所在界面对象
 * @param confInfo 会议信息
 * @param inviter 邀请者信息
 */
- (void)onInviteContacts:(UIViewController *)vc confInfo:(JMConfInfo *)confInfo inviter:(JMInviter *)inviter;

/**
 * @description 邀请人信息
 */

@interface JMInviter : NSObject

/**
 * @brief 邀请人信息
 */
@property (nonatomic, copy) NSString *userName;

/**
 * 邀请人用户昵称
 */
@property (nonatomic, copy) NSString *nickName;


/**
 * @brief 会议信息
 */
@interface JMConfInfo : NSObject

/**
 * 会议号
 */
@property (nonatomic, copy) NSString *confNumber;

/**
 * 会议密码
 */
@property (nonatomic, copy) NSString *password;

/**
 * 会议主题
 */
@property (nonatomic, copy) NSString *title;

/**
 * 会议的创建时间
 */
@property (nonatomic, assign) long long createTime;

/**
 * 预约会议的开始时间
 */
@property (nonatomic, assign) long long startTime;

/**
 * 预约会议的持续时间,单位分
 */
@property (nonatomic, assign)int keepDuration;

/**
 * 创会者用户名
 */
@property (nonatomic, copy) NSString *creatorUserName;

/**
 * 创会者昵称
 */
@property (nonatomic, copy) NSString *creatorNickName;

/**
 * 会议状态 0 预约,1 进行中,2 已经取消,3 已经结束
 */
@property (nonatomic, assign) int state;

/**
 * 会议类型 0 快速会议,1 预约会议
 */
@property (nonatomic, assign) int type;

/**
 * 会议中成员列表
 */
@property (nonatomic, copy) NSArray<JMContact *> *) members;

示例代码:

- (void)onInviteContacts:(UIViewController *)vc confInfo:(JMConfInfo *)confInfo inviter:(JMInviter *)inviter {
    NSLog(@"vc:%@, confInfo:%@, inviter:%@",vc,confInfo,inviter);
}

# 预约会议结果回调

在预约会议界面,用户预约完会议后,会通过 JMCallBack 接口通知。

/**
 * @brief 预约会议结果回掉
 * @param result 预约结果
 * @param confInfo 预约会议信息
 */
- (void)onReserveResult:(bool)result confInfo:(JMConfInfo *)confInfo);

示例代码:

- (void)onReserveResult:(bool)result confInfo:(JMConfInfo *)confInfo) {
    if (result) {
        //预约成功
        //获取会议消息confInfo
    } else {
       //预约失败
    }
}

# 会议邀请获取文本

需要 App 实现 JMCallBack 的 getConfInvite 接口。

/**
 * @brief 获取会议邀请,注意此方法可能为阻塞方法,不要在主线程直接调用
 * @param confInfo 会议信息
 * @param inviter 邀请者信息
 * @return 会议邀请文本
 */
- (NSString *)getConfInvite:(JMConfInfo *)confInfo inviter:(JMInviter *)inviter;

# 获取插件版本号

/**
 * @brief 获取插件版本号
 * @return 插件版本号
 */
- (NSString*)getVision;

示例代码:

[JMManager.shared getVision];

# 判断是否在会议中

/**
 * @brief 是否在会议中
 * @return 是否在会议中
 */
- (bool)isInConf;

示例代码:

[JMManager.shared isInConf];

# 退出会议

/**
 * @brief 退出(离开会议,登出)
 */
- (void)exit;

示例代码:

[JMManager.shared exit];

# 交互时序图

image.png