# 登录视频会议

本文主要展示如何初始化 JM SDK 以及登录视频会议。

# SDK 初始化

在使用 SDK 任何方法之前,都应该首先进行 SDK 的初始化。

在程序入口处初始化 SDK,具体接口如下:

/**
 *  @brief 创建 JCClient 实例
 *  @param appKey       用户从 Juphoon Cloud 平台上申请的 AppKey 字符串
 *  @param callback     回调接口,用于接收 JCClient 相关通知
 *  @param extraParams  额外参数,没有则填nil
 *  @return JCClient 对象
 */
+(JCClient*)create:(NSString*)appKey callback:(id<JCClientCallback>)callback extraParams:(NSDictionary*)extraParams;

示例代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 初始化各模块,因为这些模块实例将被频繁使用,建议声明在单例中
    //用户模块
    JCClient *client = [JCClient create:@"your appkey" callback:self extraParams:nil];
    //设备模块
    JCMediaDevice *mediaDevice = [JCMediaDevice create:client callback:self];
    //一对一通话模块
    JCCall *call = [JCCall create:client mediaDevice:mediaDevice callback:self];
    //会议中给个共享涂鸦模块
    JCDoodle *doodle = [JCDoodle create:nil];
    //会议模块
    JCConference *conference = [JCConference create:_client mediaDevice:_mediaDevice doodle:_doodle callback:self];
    //账户模块
    JCAccount *account = [JCAccount create:self];
    return YES;
}

# 登录

完成 SDK 的初始化后即可进行登录集成。

登录涉及 JCClient 类及其回调 JCClientCallback (opens new window) 类,其主要作用是负责登录、登出管理及帐号信息存储。

# 步骤一:进行登录的相关设置

如是否使用代理服务器登录以及服务器地址的设置,方法如下:

/**
 *  @brief 设置配置相关参数
 *  JCClientConfigServer, JCClientConfigHttpsProxy 均需要在 login 之前调用
 *  @param key   参数关键字, 参见 JCClientConstants 中定义
 *  @param value 参数值
 *  @return 返回 true 表示设置成功,false 表示设置失败
 */
-(bool)setConfig:(NSString*)key value:(NSString*)value;

其中的 key 有:

/// appkey
extern NSString* const JCClientConfigAppkey;
/// 服务器
extern NSString* const JCClientConfigServer;
/// 设备标识,用户可以自己传入设备标识
extern NSString* const JCClientConfigDeviceId;
/// https代理, 例如 192.168.1.100:3128
extern NSString* const JCClientConfigHttpsProxy;
/// 区分服务器接口分支(主要针对私有云客户定制接口需求) std表示标准接口。默认std 例如zh 招呼
extern NSString* const JCClientConfigTargetInfo;
/// 设置会议功能成员userId为uid或uri,默认uri。设置为uid传@"1",设置为uri传@"0",在登录前调用。
extern NSString* const JCClientConfigConfUserUid;

# 步骤二:获取相关配置

设置登录相关参数后,可以调用下面的方法获取相关的配置。

/**
 *  @brief 获取配置相关参数
 *  @param key 参数关键字, 参见 JCClientConstants 中定义
 *  @return 成功返回字符串类型具体值, 失败返回 NULL
 */
-(NSString*)getConfig:(NSString*)key;

# 步骤三:调用 login 接口

登录参数设置之后,即可调用 login (opens new window) 接口发起登录操作:

/**
 *  @brief 登录
 *  @param userId   用户名
 *  @param password 密码,免鉴权模式密码可以随意输入,但不能为空
 *  @return 返回 true 表示正常执行调用流程,false 表示调用异常,异常错误通过 JCClientCallback 通知
 *  @warning 目前只支持免鉴权模式,免鉴权模式下当账号不存在时会自动去创建该账号
 *  @warning 用户名为英文、数字和'+' '-' '_' '.',长度不要超过64字符,'-' '_' '.'不能作为第一个字符
 */
-(bool)login:(NSString*)userId password:(NSString*)password;

示例代码:

// 创建 JCClient 实例
JCClient *client = [JCClient create:@"your appkey" callBack:callback extraParams:nil];
// 登录
[client login:@"userId" password:@"your password"];
...

# 步骤四:登录结果回调

登录操作执行之后,登录的结果通过 onLogin (opens new window) 接口监听回调:

/**
 *  @brief 登录结果回调
 *  @param result  true 表示登录成功,false 表示登录失败
 *  @param reason  当 result 为 false 时该值有效
 *  @see JCClientReason
 */
-(void)onLogin:(bool)result reason:(JCClientReason)reason;

其中,JCClientReason (opens new window)

/// 正常
JCClientReasonNone,
/// sdk 未初始化
JCClientReasonSDKNotInit,
/// 无效的参数
JCClientReasonInvalidParam,
/// 函数调用失败
JCClientReasonCallFunctionError,
/// 当前状态无法再次登录
JCClientReasonStateCannotLogin,
/// 超时
JCClientReasonTimeOut,
/// 网络异常
JCClientReasonNetWork,
/// appkey 错误
JCClientReasonAppKey,
/// 账号密码错误
JCClientReasonAuth,
/// 无该用户
JCClientReasonNoUser,
/// 被强制登出
JCClientReasonServerLogout,
/// 其他错误
JCClientReasonOther,

登录成功返回 truefalse 返回失败。

登录成功之后,SDK 会自动保持与服务器的连接状态,直到用户主动调用登出接口,或者因为帐号在其他设备登录导致该设备登出。现有帐号体系中一个用户名只能同时登录在一台设备上。后一个登录的设备登录成功之后,将会把前一个设备踢下线。

# 登出

如果您登出 Juphoon Cloud Platform 平台,则不能进行平台上的各种业务操作。

登出通过下面方法实现:

/**
 *  登出 Juphoon Cloud 平台,登出后不能进行平台上的各种业务
 *  @return 返回 true 表示正常执行调用流程,false 表示调用异常,异常错误通过 JCClientCallback 通知
 */
-(bool)logout;

登出结果通过 onLogout (opens new window) 接口监听回调:

/**
 *  @brief 登出回调
 *  @param reason 登出原因
 *  @see JCClientReason
 */
-(void)onLogout:(JCClientReason)reason;

JCClientReason (opens new window) 通常有:

/// 正常
JCClientReasonNone,
/// sdk 未初始化
JCClientReasonSDKNotInit,
/// 无效的参数
JCClientReasonInvalidParam,
/// 函数调用失败
JCClientReasonCallFunctionError,
/// 当前状态无法再次登录
JCClientReasonStateCannotLogin,
/// 超时
JCClientReasonTimeOut,
/// 网络异常
JCClientReasonNetWork,
/// appkey 错误
JCClientReasonAppKey,
/// 账号密码错误
JCClientReasonAuth,
/// 无该用户
JCClientReasonNoUser,
/// 被强制登出
JCClientReasonServerLogout,
/// 其他错误
JCClientReasonOther,

当登录状态发生改变时,会收到 onClientStateChange (opens new window) 回调:

/**
 *  @brief 登录状态变化通知
 *  @param state    当前状态值
 *  @param oldState 之前状态值
 */
-(void)onClientStateChange:(JCClientState)state oldState:(JCClientState)oldState;

示例代码:

-(void)onClientStateChange:(JCClientState)state oldState:(JCClientState)oldState
{
    if (state == JCClientStateIdle) { // 未登录
       ...
    } else if (state == JCClientStateLogining) { // 登录中
       ...
    } else if (state == JCClientStateLogined) {  // 登录成功
       ...
    } else if (state == JCClientStateLogouting) {  // 登出中
       ...
    }
}

JCClientState (opens new window) 通常有:

// 未初始化
JCClientStateNotInit,
// 未登录
JCClientStateIdle,
// 登录中
JCClientStateLogining,
// 登录成功
JCClientStateLogined,
// 登出中
JCClientStateLogouting,

集成登录后,即可进行相关业务的集成。

SDK 支持前后台模式,可以在应用进入前台或者后台时调用 JCClient 类中的 setForeground 方法进行设置。

/**
 *  @brief 设置是否是前台,当应用进入前台标志为true,进入后台标志为false
 *  @param foreground  true 是前台,false 是后台
 */
-(void)setForeground:(bool)foreground;

# 公有云接入

在登录之前设置服务器地址为公有云地址。

示例代码:

_client = [JCClient create:@"appkey" callback:self extraParams:nil];
[_client setConfig:JCClientConfigTargetInfo value:@"http:cn.router.justalkcloud.com:8080"];
[client login:@"userId" password:@"your password"];

# 销毁SDK

如不需再使用SDK的相关功能,可以强制释放SDK的资源

/**
 * 销毁 JCClient 对象
 */
+ (void)destroy;

调用示例:

- (void)destroy {
    if (_client != nil) {
        [JCClient destroy];
    }
}