登录与登出

手动登录

一般 APP 在首次登录、切换帐号登录、注销重登时需要手动登录,调用函数 public static void Login(string appKey, string account, string token, LoginResultDelegate handler = null) 执行登录,需要设置 LoginResultDelegate 委托来获取登录过程的不同状态。正常登录会收到三次回调,分别表示登录的不同过程,登录过程中的不同步骤和返回的错误码参考 枚举 NIMLoginStepResponseCode说明。 当登录步骤为 NIMLoginStep.kNIMLoginStepLogin 并且 错误码为 ResponseCode.kNIMResSuccess 时表明登录成功。

/// <summary>
/// NIM客户端登录
/// </summary>
/// <param name="appKey">The app key.</param>
/// <param name="account">The account.</param>
/// <param name="token">令牌 (在后台绑定的登录token).</param>
/// <param name="handler">登录流程的回调函数</param>
public static void Login(string appKey, string account, string token, LoginResultDelegate handler = null)
private void DoLogin()
{
    NIM.ClientAPI.Login("YOUR APPKEY", "ACCOUNT", "PASSWORD", HandleLoginResult);

}

private void HandleLoginResult(NIM.NIMLoginResult result)
{
    //处理登录结果
    switch(result.LoginStep)
    {
        case NIMLoginStep.kNIMLoginStepLinking:
        //建立连接
        break;
        case NIMLoginStep.kNIMLoginStepLink:
        //连接到服务器
        break;
        case NIMLoginStep.kNIMLoginStepLogin:
        //登录验证
            if (result.Code == NIM.ResponseCode.kNIMResSuccess)
            {
                //登录成功
            }
            else
            {
                //登录失败,根据result.Code检查登录失败原因
            }
        break;
    }
}

自动登录

SDK 在网络连接断开后,会监听网络状况,在网络可用时自动执行登录。SDK提供了网络断开和自动登录结果的回调,开发者可以注册这些回调获取结果,在回调函数中根据需要通知用户或者做其他处理。

/// <summary>
/// 注册NIM客户端自动重连回调。重连失败时,如果不是网络错误引起的(网络相关的错误号为kNIMResTimeoutError和kNIMResConnectionError),而是服务器返回了非kNIMResSuccess的错误号,则说明重连的机制已经失效,需要APP层调用Logout执行注销操作并退回到登录界面后进行重新登录.
/// </summary>
/// <param name="jsonExtension">json扩展参数(备用,目前不需要)</param>
/// <param name="handler">自动重连的回调函数
/// 如果返回错误号kNIMResExist,说明无法继续重连,App层必须调用Logout退出到登录界面,以便用户重新进行登录.
/// </param>
public static void RegAutoReloginCb(LoginResultDelegate handler, string jsonExtension = null)

/// <summary>
///  注册NIM客户端掉线回调.
/// </summary>
/// <param name="handler">掉线的回调函数.</param>
public static void RegDisconnectedCb(Action handler)
private void RegisterAutoLoginCallback()
{
    NIM.ClientAPI.RegDisconnectedCb(OnDisconnected);
    NIM.ClientAPI.RegAutoReloginCb(OnAutoRelogin);
}

private void OnDisconnected()
{
    UnityEngine.Debug.Log("网络连接断开,已掉线");
}

private void OnAutoRelogin(NIMLoginResult result)
{
    UnityEngine.Debug.Log(string.Format("自动重连:{0}", result.Serialize()));
}

登出

应用层登出/注销自己的账号时需要调用 SDK 的登出操作 NIM.ClientAPI.Logout, 该操作会通知云信服务器进行 APNS 推送信息的解绑操作, 避免用户已登出但推送依然发送到当前设备的情况发生。在调用 Logout 时需要设置正确的 NIMLogoutType 参数。

注意:在退出程序时需要执行NIM.ClintAPI.Cleanup释放资源,该函数需要在Logout函数的回调中执行,确保Logout执行完成才能调用Cleanup。

/// <summary>
/// NIM客户端注销/退出
/// </summary>
/// <param name="logoutType">Logout操作类型</param>
/// <param name="delegate">注销/退出的回调函数.</param>
public static void Logout(NIMLogoutType logoutType, LogoutResultDelegate logoutDelegate)
logoutType 使用场景
kNIMLogoutChangeAccout 注销/切换帐号,不退出程序
kNIMLogoutKickout 被其他端登录的账号踢下线
kNIMLogoutAppExit 退出程序

logoutDelegate: Logout执行结果回调,不需要判断返回的错误码。

private void DoLogout()
{
    NIM.ClientAPI.Logout(NIM.NIMLogoutType.kNIMLogoutChangeAccout, OnAppLogoutCompleted);
}

private void OnAppLogoutCompleted(NIMLogoutResult result)
{
    UnityEngine.Debug.Log("switch account logout end:" + result.ToString());
    //如果需要执行Cleanup,需要确保Logout已执行完成
    //NIM.ClientAPI.Cleanup()
}

多端登录

调用NIM.ClientAPI.RegMultiSpotLoginNotifyCb注册多端登录回调,在登录成功后当有其他端登录或者注销时,会通过此回调接收到通知。在回调函数中能够获取当前同时在线的客户端类型和操作系统。

/// <summary>
/// 注册NIM客户端多点登录通知回调.
/// </summary>
/// <param name="handler">多点登录通知的回调函数.</param>
public static void RegMultiSpotLoginNotifyCb(MultiSpotLoginNotifyResultHandler handler)
private void DoRegisgerMultiLoginNotify()
{
    NIM.ClientAPI.RegMultiSpotLoginNotifyCb(OnMultiLogin);
}
private void OnMultiLogin(NIMMultiSpotLoginNotifyResult result)
{
    //result.OtherClients 包含客户端信息列表
    if(result.NotifyType == kNIMMultiSpotNotifyTypeImIn)
    {
        //其他端登录
    }
    else if(result.NotifyType == kNIMMultiSpotNotifyTypeImOut)
    {
        //其他端退出
    }
}

互踢

云信内置踢人策略为:移动端(Android,iOS)互踢,桌面端(PC,Web)互踢,移动端和桌面端共存(可以调用NIM.ClientAPI.KickOtherClients主动踢下共存的其他端)。 如果当前的互踢策略无法满足业务需求的话,可以联系我们取消内置互踢,根据多端登录的回调和当前的设备列表,判断本设备是否需要被踢出。SDK提供了回调用于通知被其他端踢下线的事件。

/// <summary>
/// 将本帐号的其他端踢下线.通过注册RegKickOtherClientCb回调得到结果
/// </summary>
/// <param name="devices">设备标识</param>
public static void KickOtherClients(NIMKickoutOtherDeviceInfo devices)
/// <summary>
/// 注册NIM客户端将本帐号的其他端踢下线结果回调.
/// </summary>
/// <param name="handler">操作结果的回调函数.</param>
public static void RegKickOtherClientCb(KickOtherClientResultHandler handler)
/// <summary>
/// 注册NIM客户端被踢回调.
/// </summary>
/// <param name="handler">被踢回调</param>
public static void RegKickoutCb(KickoutResultHandler handler)

KickOtherClients函数中设备标识devices参数为已登录的其他设备ID列表,在登录结果回调和多端登录回调中包含了同时已登录的其他设备信息,该信息中包含设备ID。

private void RegisterKickoutCallback()
{
    //注册被踢下线回调
    NIM.ClientAPI.RegKickoutCb(OnKickedoutCallback);
}
private void OnKickedoutCallback(NIMKickoutResult result)
{
    UnityEngine.Debug.Log("OnKickedoutCallback");
    var tip = string.Format("账号被踢:{0},{1}", result.ClientType, result.KickReason);
    UnityEngine.Debug.Log(tip);
}

//将其他端踢下线
private void DoKickOtherClients(NIMKickoutOtherDeviceInfo info)
{
    NIM.ClientAPI.RegKickOtherClientCb(OnKickOtherClients);
    NIM.ClientAPI.KickOtherClients(info);
}
private void OnKickOtherClients(NIMKickOtherResult result)
{
    string s = string.Empty;
    foreach (var d in result.DeviceIDs)
        s += (d + " ; ");
    UnityEngine.Debug.Log(string.Format("操作结果:{0},{1}", result.ResCode, s));
}

登录状态

开发者通过调用NIM.ClientAPI.GetLoginState()主动获取当前用户在线状态,

/// <summary>
/// 获取NIM客户端登录状态
/// </summary>
/// <param name="jsonExt"></param>
/// <returns></returns>
public static NIMLoginState GetLoginState(string jsonExt = null)
登录状态 说明
kNIMLoginStateLogin 当前账号处于登录状态
kNIMLoginStateUnLogin 当前账号未登录