多端登录与互踢
更新时间: 2024/03/14 16:36:33
您可通过两种方式实现 IM 的多端登录与互踢。
方式1:通过云信控制台配置
当前 NIM SDK 支持通过云信控制台配置四种不同的 IM 多端登录策略:
- 只允许一端登录,Windows、Web、Android、iOS 彼此互踢。
- 桌面端 PC 与 Web 互踢,移动端 Android 和 iOS 互踢,且桌面端与移动端可同时登录
- 各端均可以同时登录在线(最多10个设备同时在线)
- 自定义多端登录配置
通过该方式的配置,可实现自动管控 IM 的多端登录。具体如何配置,请参见多端登录与互踢策略。
方式2:主动将其他端踢下线
API 调用时序
踢方操作
步骤1:注册多端登录监听
调用observeOtherClients
方法注册多端登录状态观察者,监听其他端的登录信息(OnlineClient
)。本端未登录时,如有其他端使用相同的 IM 账号登录或注销,本端会收到通知;登录成功后,当有其他端登录或者注销时,本端也会收到通知。
参数 | 说明 |
---|---|
observer |
观察者,参数为同时登录的其他端信息。 如果有其他端注销,参数为剩余的在线端。 如果没有剩余在线端了,参数为 null。 |
register |
是否注册观察者,注册为 true, 注销为 false |
OnlineClient
接口说明:
返回值 | 方法 | 说明 |
---|---|---|
String | getOs() |
客户端的操作系统信息 |
int | getClientType() |
客户端类型 |
long | getLoginTime() |
登录时间 |
String | getClientIp() |
客户端 IP |
String | getCustomTag() |
登录自定义属性 |
示例代码如下:
javaObserver<List<OnlineClient>> clientsObserver = new Observer<List<OnlineClient>>() {
@Override
public void onEvent(List<OnlineClient> onlineClients) {
if (onlineClients == null || onlineClients.size() == 0) {
return;
}
OnlineClient client = onlineClients.get(0);
switch (client.getClientType()) {
case ClientType.Windows:
// PC端
break;
case ClientType.MAC:
// MAC端
break;
case ClientType.Web:
// Web端
break;
case ClientType.iOS:
// IOS端
break;
case ClientType.Android:
// Android端
break;
default:
break;
}
}
};
NIMClient.getService(AuthServiceObserver.class).observeOtherClients(clientsObserver, true);
步骤2:将其他端踢下线
本端调用kickOtherClient
方法主动将使用相同 IM 账号登录的其他设备端踢下线。
示例代码如下:
javaNIMClient.getService(AuthService.class).kickOtherClient(client).setCallback(new RequestCallback<Void>() {
@Override
public void onSuccess(Void param) {
// 踢出其他端成功
}
@Override
public void onFailed(int code) {
// 踢出其他端失败,返回失败code
}
@Override
public void onException(Throwable exception) {
// 踢出其他端错误
}
});
被踢方操作
被踢的设备端可在登录 IM 前,调用observeOnlineStatus
监听自己的登录状态变化(示例代码见监听登录状态)。收到被踢回调(KICK_BY_OTHER_CLIENT
)后,建议注销登录并切换到登录界面。
此外,在被踢下线后,被踢端还可以调用如下两个方法获取将其踢下线的设备端的客户端类型。
-
调用
AuthService#getKickedClientType
方法获取客户端类型。 -
调用
AuthService#getKickedCustomClientType
方法获取发起踢掉登录的自定义客户端类型。如果当前状态不是被其他端主动踢下线,例如被服务端禁用并踢出 和自动登录监听到 417,则这两个方法的返回值无效。
此文档是否对你有帮助?