登录与登出

登录集成必读

首次登录

SDK 登录后会同步群信息,离线消息,漫游消息,系统通知等数据,所以首次登录前需要 提前注册所需的全局广播类通知的回调 (具体说明请参阅API 文档),以下以注册最近会话变更通知回调为例:

//全局会话列表变更通知函数
void CallbackSessionChange(int rescode, const char *result, int total_unread_counts, const char *json_extension, const void *user_data)
{
    if (rescode == kNIMResSuccess)
    {

    }
    else
    {
        //错误处理
    }
}

void foo()
{
    //注册全局会话列表变更通知函数
    nim_session_reg_change_cb(NULL, &CallbackSessionChange, NULL);    // 会话列表变更通知(nim_session)
}

通过注册以下接口才能正确维护当前账号的状态:

// 帐号被踢通知(nim_client)
void nim_client_reg_kickout_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);        
// 网络连接断开通知(nim_client)
void nim_client_reg_disconnect_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);    
// 多端登录/登出通知
void nim_client_reg_multispot_login_notify_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);

登录

void CallbackLogin(const char* res, const void *user_data)
{
    json_value *value = fcx_null;
    int length = fcx_strlen(g_login_cb_json_params);
    value = json_parse(g_login_cb_json_params, length);
    if (value)
    {
        int code = json_value_find_as_int(value, "err_code");
        int step = json_value_find_as_int(value, "login_step");

        switch (step)
        {
        case kNIMLoginStepLinking:
            break;
        case kNIMLoginStepLogining:
            break;
        case kNIMLoginStepLogin:
            //登录鉴权结果
            break;
        default:
            FCX_DEBUG_ERROR("Unknown login step!");
            break;
        }
    }
    json_value_free(value);
}

void foo()
{
    nim_client_login("app key", "app account", "token", NULL, &CallbackLogin, NULL);
    //app key: 应用标识,不同应用之间的数据(用户,消息,群组等)是完全隔离的。开发自己的应用时,需要替换成自己申请来的app key
    //注意:替换成客户自己的app key之后,请不要对登录密码进行md5加密。
}

自动重新登录

SDK 在网络连接断开后,会监听网络状况,如果网络状况好转,那么SDK 会进行重新登录,登录结果可以在注册的重新登录回调函数中处理。

注意: 自动重新登录的机制可能会失效:

如果重新登录回调函数返回的的错误号既不是kNIMResSuccess,也不是网络错误相关错误号(kNIMResTimeoutError或者kNIMResConnectionError),那么说明自动重新登录的机制已经失效,需要开发者退回到登录界面进行手动重新登录。(详见nim_client_reg_auto_relogin_cb接口说明)

手动重新登录

SDK 在重新登录失败后,可以由用户手动调用重新登录接口nim_client_relogin

登出/退出和清理SDK

在账号已经登录时需要调用接口nim_client_logout进行登出或退出,需要使用相应的Logout类型才能保证SDK功能正常。 登出或退出的过程因为涉及到和服务器的交互以及需要将缓存中的数据持久化到本地,该接口可能需要一些时间才能执行完成。如果需要调用nim_client_cleanup,必须在完全退出(收到退出回调)后执行。

void CallbackLogout(const char* res, const void *user_data)
{
    //nim_client_logout执行完成,可以安全调用nim_client_cleanup
}

void foo()
{
    nim_client_logout(kNIMLogoutAppExit, NULL, &CallbackLogout, NULL);
}

断开连接通知

通过接口nim_client_reg_disconnect_cb来注册连接断开回调函数,断开连接后根据实际需要做后续处理(比如提示用户)。

被踢出通知

通过接口nim_client_reg_kickout_cb来注册被踢出回调函数,当收到此通知时,一般是退出程序然后回到登录窗口,回调函数参数中详细说明了被踢出的原因。

多端登录

通过调用nim_client_reg_multispot_login_notify_cb来注册多端登录通知的回调函数,当用户在某个客户端登录时,其他没有被踢掉的端会触发这个回调函数,并携带当前时间登录的设备列表的数据。登录时如果有其他端也处于登录状态,在登录回调函数中也包含这些设备的信息。

网易云通信内置踢人策略为:移动端(Android,iOS)互踢,桌面端(PC,Web)互踢,移动端和桌面端共存。

如果当前的互踢策略无法满足业务需求的话,可以联系我们取消内置互踢,根据多端登录的回调和当前的设备列表,判断本设备是否需要被踢出。如果需要踢出,直接调用登出接口并在界面上给出相关提示即可。