登录登出
更新时间: 2022/08/29 09:21:26
登录与登出
手动登录
一般 APP 在首次登录、切换帐号登录、注销重登时需要手动登录,调用函数 public static void Login(string appKey, string account, string token, LoginResultDelegate handler = null)
执行登录,需要设置 LoginResultDelegate
委托来获取登录过程的不同状态。正常登录会收到三次回调,分别表示登录的不同过程,登录过程中的不同步骤和返回的错误码参考 枚举 NIMLoginStep
和 ResponseCode
说明。
当登录步骤为 NIMLoginStep.kNIMLoginStepLogin
并且 错误码为 ResponseCode.kNIMResSuccess
时表明登录成功。
所有IM事件和回调都不在主线程,如果需要处理界面元素,需要抛任务到主线程。
- API原型
csharp/// <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)
- 示例
csharpprivate 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 登录后会同步群信息,离线消息,漫游消息,系统通知等数据,所以首次登录前需要提前注册一些全局回调(具体说明请参阅API 文档)。
自动登录
SDK 在网络连接断开后,会监听网络状况,在网络可用时自动执行登录。SDK提供了网络断开和自动登录结果的回调,开发者可以注册这些回调获取结果,在回调函数中根据需要通知用户或者做其他处理。
- API原型
csharp/// <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)
- 示例
csharpprivate 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。
- API原型
csharp/// <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执行结果回调,不需要判断返回的错误码。
- 示例
csharpprivate 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
注册多端登录回调,在登录成功后当有其他端登录或者注销时,会通过此回调接收到通知。在回调函数中能够获取当前同时在线的客户端类型和操作系统。
- API原型
csharp/// <summary>
/// 注册NIM客户端多点登录通知回调.
/// </summary>
/// <param name="handler">多点登录通知的回调函数.</param>
public static void RegMultiSpotLoginNotifyCb(MultiSpotLoginNotifyResultHandler handler)
- 示例
csharpprivate 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提供了回调用于通知被其他端踢下线的事件。
- API原型
csharp/// <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。
- 示例
csharpprivate 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()
主动获取当前用户在线状态,
- API原型
csharp/// <summary>
/// 获取NIM客户端登录状态
/// </summary>
/// <param name="jsonExt"></param>
/// <returns></returns>
public static NIMLoginState GetLoginState(string jsonExt = null)
- 参数说明
登录状态 | 说明 |
---|---|
kNIMLoginStateLogin | 当前账号处于登录状态 |
kNIMLoginStateUnLogin | 当前账号未登录 |