ZIM SDK 支持配置自定义多端登录,即用户同一个账号可在多个平台上同时登录,满足用户的会话、消息、群组等数据互通。
多端登录可支持在 Windows、Mac、Linux、Android、iOS、iPad、Web、小程序等八个平台上配置,其中支持在 Windows、Mac、Linux、Android、iOS、iPad 平台配置多设备登录,最多不超过 2 台设备,在 Web 平台配置多实例登录,最多不超过 5 个登录实例。
以下为 ZIM SDK 支持的三种登录策略,即单平台登录、双平台登录以及多平台登录:
登录策略 | 具体说明 |
---|---|
单平台登录(默认) |
仅支持用户同时在 1 个平台上登录帐号。如果在其他平台上登录帐号,原平台上的账号会被退出。 |
双平台登录 |
支持用户在 Windows、Mac、Linux、Android、iOS 和 iPad 的其中 1 个平台上登录帐号,并同时保持帐号在 Web 平台在线。 |
多平台登录 |
是指支持用户同时在 Windows、Mac、Linux、Android、iOS、iPad、Web、小程序多平台登录帐号,支持以下配置:
|
在实现“多端登录”功能之前,请确保:
联系 ZEGO 技术支持,开通多端登录服务,配置多端登录之后,即可在多端调用 loginWithUserID 登录 ZIM SDK,实现流程与单端登录无异。如何登录,详情请参考 实现基本消息收发 的“登录 ZIM“。
当登录设备已达到策略规定的上限时,如果在新设备登录帐号,原设备中最早登录的帐号会被踢下线,并通过 connectionStateChanged 回调得知 event 为 KickedOut
。例如:登录策略规定最多只能在 3 台设备上登录,已在设备 A、B、C(按登录时间排序)登录,如果在设备 D 上登录帐号,则设备 A 上的帐号会被踢下线。
当帐号被踢下线后,建议调用 logout 接口登出 ZIM 服务,用户界面切换为登录界面。
配置多端登录后,以下功能的代码也需要做相应调整。
ZIM SDK 为多端登录用户提供了用户信息同步的功能。当用户在一端通过 updateUserName、updateUserAvatarUrl、updateUserExtendedData 接口更新了自己的信息后,其他在线客户端可通过 userInfoUpdated 事件监听用户信息被修改。
- (void)zim:(ZIM *)zim userInfoUpdated:(ZIMUserFullInfo *)info{
// 可以在 info 中获取:用户 ID,用户名,用户头像,用户额外字段
NSString *userID = info.baseInfo.userID;
NSString *userName = info.baseInfo.userName;
NSString *userAvatarUrl = info.userAvatarUrl;
NSString *userExtendedData = info.extendedData;
}
当用户在一端通过 deleteConversation 接口删除服务端会话后(即 isAlsoDeleteServerConversation 为 true),其他在线客户端可通过 conversationChanged 事件监听会话被删除。
- (void)zim:(ZIM *)zim
conversationChanged:(NSArray<ZIMConversationChangeInfo *> *)conversationChangeInfoList{
for(ZIMConversationChangeInfo *convInfo in conversationChangeInfoList){
if(convInfo.event == ZIMConversationEventDeleted){
// 会话被删除
}
}
}
当用户在一端通过 deleteAllConversations 接口删除全部服务端会话后(即 isAlsoDeleteServerConversation 为 true),其他客户端可通过 conversationsAllDeleted 事件监听全部会话被删除。
- (void)zim:(ZIM *)zim
conversationsAllDeleted:(ZIMConversationsAllDeletedInfo *)info{
// 其他端删除了全部会话
}
当用户在一端通过 clearConversationTotalUnreadMessageCount 清除全部会话未读时,其他客户端可通过 conversationTotalUnreadMessageCountUpdated 事件监听所有会话的未读都被清零的通知。
- (void)zim:(ZIM *)zim
conversationTotalUnreadMessageCountUpdated:(unsigned int)totalUnreadMessageCount{
// 其他端清除全部会话未读后,本端该通知 totalUnreadMessageCount 的值将为 0
}
当用户登录新设备后,SDK 不会自动将旧设备中的已有消息同步到新设备上,用户需要主动调用 queryHistoryMessageByConversationID 接口,才能获取存储于 ZIM 服务端的消息,详情请参考 获取历史消息。对于存储于旧设备的本地消息,则无法获取。
当用户在一端通过 deleteMessages、deleteAllMessageByConversationID、deleteAllConversationMessagesWithConfig 接口删除会话的服务端消息后(即 isAlsoDeleteServerMessage 为 true),其他在线客户端可通过 messageDeleted 事件监听消息被删除。
事件通知处理示例
- (void)zim:(ZIM *)zim messageDeleted:(ZIMMessageDeletedInfo *)deletedInfo{
if (deletedInfo.messageDeleteType == ZIMMessageDeleteTypeMessageListDeleted)
{
// 某个会话中的多条消息被删除
for (ZIMMessage *message in messageList) {
// 遍历每一条被删除的消息
}
} else if (deletedInfo.messageDeleteType ==
ZIMMessageDeleteTypeConversationAllMessagesDeleted)
{
// 某个会话当前所有消息被删除
} else if (deletedInfo.messageDeleteType ==
ZIMMessageDeleteTypeAllConversationMessagesDeleted)
{
// 所有会话的所有消息被删除
}
}
当用户在一端通过 sendMessageReceiptsRead、sendConversationMessageReceiptRead 接口设置消息回执已读后,其他客户端可通过 messageReceiptChanged、conversationMessageReceiptChanged 事件监听本帐号已设置消息回执为已读。
事件通知处理示例
- (void)zim:(ZIM *)zim messageReceiptChanged:(NSArray<ZIMMessageReceiptInfo *> *)infos{
for(ZIMMessageReceiptInfo *info in infos){
if (info.isSelfOperated) {
// 用户自己设置的消息回执已读
}
}
}
- (void)zim:(ZIM *)zim conversationMessageReceiptChanged:(NSArray<ZIMMessageReceiptInfo *> *)infos{
for (ZIMMessageReceiptInfo *info in infos) {
if (info.isSelfOperated) {
// 用户自己设置的消息回执已读
}
}
}
房间模块相关接口和事件不支持多端登录。用户在 A 设备加入房间后,然后在 B 设备再加入相同的房间后,会把 A 设备踢出房间,A 设备会通过 roomStateChanged 事件通知收到 event
为 ZIMRoomEventKickedOutByOtherDevice
。
事件通知处理示例
- (void)zim:(ZIM *)zim
roomStateChanged:(ZIMRoomState)state
event:(ZIMRoomEvent)event
extendedData:(NSDictionary *)extendedData
roomID:(NSString *)roomID{
if (state == ZIMConnectionStateDisconnected &&
event == ZIMRoomEventKickedOutByOtherDevice) {
// 多端登录加入房间,被踢出房间
}
}
在开通多端登录服务后,ZIM SDK 会自动在多端设备之间同步群组相关数据。
当用户同时登录设备 A 和 B,用户收到呼叫邀请,在设备 A 上接受邀请(调用 callAcceptWithCallID)或者拒绝邀请(调用 callRejectWithCallID) 后:
ZIMCallUserStateAccepted
还是 ZIMCallUserStateRejected
,关闭邀请弹窗,实现其他业务操作各个设备能收到该呼叫内的用户状态变更事件 callUserStateChanged 如下表所示:
callUserState | 设备 A | 设备 B |
---|---|---|
Inviting | ✔️ | ✔️ |
Received | ✔️ | ✔️ |
Accepted | ✔️ | ✔️ |
Rejected | ✔️ | ✔️ |
Timeout | ✖ | ✖ |
Cancelled | ✖ | ✖ |
Quit | ✔️ | ✖ |
NSString *selfUserId = @"user_id";
NSString *currentCallId = @"call_id";
ZIMCallAcceptConfig *acceptConfig = [[ZIMCallAcceptConfig alloc] init];
acceptConfig.extendedData = @"extra_1";
ZIMCallRejectConfig *rejectConfig = [[ZIMCallRejectConfig alloc] init];
rejectConfig.extendedData = @"extra_1";
// 设备 A 接受邀请
[[ZIM getInstance] callAcceptWithCallID:currentCallId config:acceptConfig callback:^(NSString * _Nonnull callID, ZIMError * _Nonnull errorInfo) {
// 关闭呼叫等待操作的弹框。
}];
// 设备 A 拒绝邀请
[[ZIM getInstance] callRejectWithCallID:currentCallId config:rejectConfig callback:^(NSString * _Nonnull callID, ZIMError * _Nonnull errorInfo) {
// 关闭呼叫等待操作的弹框。
}];
// 设备 B 监听 callUserStateChanged
- (void)zim:(ZIM *)zim
callUserStateChanged:(ZIMCallUserStateChangeInfo *)info
callID:(NSString *)callID{
for(ZIMCallUserInfo *userInfo in info.callUserList){
if(userInfo.userID == selfUserId && (userInfo.state == ZIMCallUserStateAccepted || userInfo.state == ZIMCallUserStateRejected)){
// 其他在线设备已经接受或者拒绝呼叫,关闭呼叫等待操作的弹框
}
}
}
联系我们
文档反馈