# 登录

本章节将介绍如何初始化 JC SDK 并登录。

# 初始化

在主线程调用 JCClient create (opens new window) 接口创建 JCClient (opens new window) 实例对象。传入获取到的 appKey ,即可初始化 JCClient (opens new window)

TIP

由于 JC SDK 功能以模块为基础,且模块实例将被频繁使用,建议使用单例对 JC SDK 中的类进行管理。

//初始化
-(bool)initialize {
    JCClient *client = [JCClient create:@"创建应用获取的 AppKey" callback:self creatParam:nil];
    return client.state == JCClientStateIdle;
}

其中,callback 为 JCClientCallback 协议的代理对象,该协议用于将 client 的状态变化通知给上层。因此需要先指定 callback 的代理对象,然后在该代理对象中实现 JCClientCallback 的方法。

JCClientCallback 中的主要方法如下。

//登陆结果回调
-(void)onLogin:(bool)result reason:(JCClientReason)reason;

//登出回调
-(void)onLogout:(JCClientReason)reason;

//登陆状态变化通知
-(void)onClientStateChange:(JCClientState)state oldState:(JCClientState)oldState;

初始化成功后,JCClientState 状态从 JCClientStateNotInit(未初始化) 变为 JCClientStateIdle(未登录)。

# 发起登录

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

登录接口调用流程如下所示:

../../../../_images/ios_login.jpg

先创建 JCClientLoginParam (opens new window) 实例以调整登录参数,后调用 login (opens new window) 发起登录。

JCClientLoginParam* loginParam = [[JCClientLoginParam alloc] init];
// 发起登录
[client login:userID password:password loginParam:loginParam];

TIP

  1. userID 用户名不能为空,可由英文、数字和 +-_. 组成(特殊字符不能作为第一个字符),大小写不敏感,长度不能超过 64 个字符。

  2. password 密码,不能为空,长度不能超过 128 字符。

  3. 调用该接口返回 true 时只代表调用接口成功,并不代表登录成功。登录的结果会通过 onLogin 回调上报。

  4. 默认登录地址为国内环境 http:cn.router.justalkcloud.com:8080 。如果需要修改为国外环境,需要在登录前通过 JCClient 的 serverAddress 属性设置为 http:intl.router.justalkcloud.com:8080 .

调用发起登录接口成功后,会触发 JCClientCallback 回调中的方法将 client 的状态通知给上层。具体逻辑如下:

首先会触发 JCClientCallback 中的登录状态改变回调 onClientStateChange (opens new window) 。您可以在上层实现 onClientStateChange (opens new window) 方法并处理相关的逻辑。

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

之后会触发 JCClientCallback 中的 onLogin (opens new window) 回调。您可以在上层实现 onLogin (opens new window) 方法并处理相关的逻辑。

-(void)onLogin:(bool)result reason:(JCClientReason)reason {
    if (result) {// 登录成功
        ...
    }
    if (reason == JCClientReasonAuth) {// 账号密码错误
        ...
    }
}

登录成功后,JCClientState 状态从 JCClientStateIdle(未登录)变为 JCClientStateLogined(登录成功)。SDK 会自动保持与服务器的连接状态,直到用户主动调用登出接口,或者因为帐号在其他设备登录导致该设备登出。登录成功/失败原因 参考 JCClientReason (opens new window)

# 登出

登出接口调用流程如下所示:

../../../../_images/ios_logout.jpg

调用 logout (opens new window) 可以发起登出。

[client logout];

登出同样会触发登录状态改变(onClientStateChange)回调,之后将通过 onLogout 回调上报登出结果。

-(void)onLogout:(JCClientReason)reason {
    if (reason == JCClientReasonServerLogout) {// 强制登出
        ...
    }
}

更多登出原因参考:JCClientReason (opens new window)

登出成功后,JCClientState 状态从 JCClientStateLogined(登录成功) 变为 JCClientStateIdle(未登录)。