如需使用本功能,请开通旗舰版套餐。
用户在线状态(ZIMUserOnlineStatus),可分为在线、离线,和登出三种状态。
login
接口登录并保持网络连接的条件下,用户的状态变更为在线状态。logout
接口后,用户的状态变更为登出状态。login
接口登录后,用户杀死 app、锁屏或退后台等行为导致网络断开,用户的状态变更为离线状态。 本文介绍如何订阅、查询用户的在线状态。
如需持续关注某些人的在线状态时,可以调用 subscribeUsersStatus 接口,向参数 userIDs
批量传入目标用户 ID(至多 100 名已注册用户,不得包含订阅者自身),在 config 中传入 subscriptionDuration
(订阅有效时长,在此时段内会持续关注目标用户的在线状态变更),进而添加目标用户在线状态的订阅到当前用户的在线状态订阅表中。
subscriptionDuration
时限内登出并重新登录 ZIM SDK,订阅仍然有效,无需再次调用订阅方法。ZIMUserStatusSubscribeConfig *config = [[ZIMUserStatusSubscribeConfig alloc] init];
config.subscriptionDuration = 60; // 订阅有效时间,单位分钟,可填入的有效时间范围为 1 ~ 43200(即 30 天)
[zim subscribeUsersStatus:@[@"userIdA",@"userIdB"]
config:config
callback:^(NSArray<ZIMErrorUserInfo *> *_Nonnull errorUserList,
ZIMError *_Nonnull errorInfo) {
for(ZIMErrorUserInfo *errorUserInfo in errorUserList){
errorUserInfo.userID; //订阅失败的用户 ID
errorUserInfo.reason; //订阅失败的错误码
}
}];
随后,在 subscriptionDuration
规定的时间内,目标用户的在线状态变更将会通过 ZIMEventHandler 中的 userStatusUpdated 事件回调返回。
如果用户在订阅后重新登录,ZIM SDK 会通过此回调向用户主动通知其订阅的目标用户在其登出期间的最后一次状态变化。
@interface ZIMEventHandlerImpl : NSObject<ZIMEventHandler>
+(ZIMEventHandlerImpl *)getInstance();
@end
@implementation ZIMEventHandlerImpl
- (void)zim:(ZIM *)zim userStatusUpdated:(NSArray<ZIMUserStatus *> *)userStatusList {
for(ZIMUserStatus *userStatus in userStatusList){
userStatus.userID; // 目标用户 ID
userStatus.onlineStatus; // 用户在线状态
userStatus.onlinePlatforms; // 用户在线平台列表
userStatus.lastUpdateTime; // 上次在线状态变更时间
}
}
// 其余回调事件..
@end
ZIMEventHandlerImpl *eventHandlerImpl = [ZIMEventHandlerImpl getInstance];
[zim setEventHandler: eventHandlerImpl];
若无需关注某些用户的在线状态,可调用 unsubscribeUsersStatus 接口,向 userIDs
参数传入目标用户 ID(至多 100 名用户)。
[zim unsubscribeUserStatus:@[@"userIdA",@"userIdB"]
callback:^(NSArray<ZIMErrorUserInfo *> *_Nonnull errorUserList,
ZIMError *_Nonnull errorInfo) {
for(ZIMErrorUserInfo *errorUserInfo in errorUserList){
errorUserInfo.userID; // 取消订阅失败的用户 ID
errorUserInfo.reason; // 取消订阅失败的错误码
}
}];
如仅需获取一次目标用户的在线状态,无需持续关注时,可以调用 queryUsersStatusByUserIDs 接口并传入目标用户的 userIDs(至多 200 名用户,不得包含当前用户)。
[zim queryUsersStatusByUserIDs:userIDs
callback:^(NSArray<ZIMUserStatus *> *_Nonnull userStatusList,
NSArray<ZIMErrorUserInfo *> *_Nonnull errorUserList,
ZIMError *_Nonnull errorInfo) {
for(ZIMUserStatus *userStatus in userStatusList){
userStatus.userID; // 目标用户 ID
userStatus.onlineStatus; // 用户在线状态
userStatus.onlinePlatforms; // 用户在线平台列表
userStatus.lastUpdateTime; //上次在线状态变更时间
}
for(ZIMErrorUserInfo *errorUserInfo in errorUserList){
errorUserInfo.userID; // 查询失败的用户 ID
errorUserInfo.reason; // 查询失败的错误码
}
}];
如果用户希望了解自己订阅了哪些用户的在线状态,可以通过 querySubscribedUserStatusListWithConfig 接口,参数 config.userIDs
传空,即可获取到完整的订阅列表,包含订阅目标用户当前的状态、以及订阅有效时长。
如果用户希望确认是否订阅了某些用户的在线状态,参数 config.userIDs
传入查询目标的 userID 即可。
ZIMSubscribedUserStatusQueryConfig *config = [[ZIMSubscribedUserStatusQueryConfig alloc] init];
// 查询目标用户 ID(单次查询至多包含 200 名用户)
// 当 userIDs 为 空,表示需要获取完整订阅表信息
// 当 userIDs 不为空,表示需要查询目标用户是否在订阅列表中
// 若存在,则结果回调会包含该用户状态信息
// 若不存在,则结果回调不包含相关信息
config.userIDs = @[@"userIdA",@"userIdB"];
[zim
querySubscribedUserStatusListWithConfig:config
callback:^(NSArray<ZIMUserStatusSubscription *>
*_Nonnull userStatusSubscriptionList,
ZIMError *_Nonnull errorInfo) {
}];
如果需了解当前用户在当前设备的在线状态,可通过监听 connectionStateChanged 回调获取用户当前的连接状态(ZIMConnectionState),并根据其判断当前用户的在线状态。
在 ZIMConnectionState 中,ZIMConnectionStateConnected
表示用户在线,ZIMConnectionStateDisconnected
表示用户离线;而剩余的 ZIMConnectionStateConnecting
和 ZIMConnectionStateReconnecting
这两种连接状态,您可以自行根据业务逻辑判断为用户是否在线。
@interface ZIMEventHandlerImpl : NSObject<ZIMEventHandler>
+(ZIMEventHandlerImpl *)getInstance();
@end
@implementation ZIMEventHandlerImpl
- (void)connectionStateChanged:(ZIMConnectionState)state event:(ZIMConnectionEvent)event extendedData:(NSDictionary *)extendedData{
switch (state) {
case ZIMConnectionStateConnected:
// 已连接,您可以映射当前用户状态为在线
break;
case ZIMConnectionStateConnecting:
// 连接中,您可以根据您的业务逻辑,映射当前用户状态为在线或者离线
break;
case ZIMConnectionStateReconnecting:
// 重连中,您可以根据您的业务逻辑,映射当前用户状态为在线或离线
break;
case ZIMConnectionStateDisconnected:
// 已断开,您可以映射当前用户状态为离线
break;
default:
break;
}
}
// 其余回调事件..
@end
ZIMEventHandlerImpl *eventHandlerImpl = [ZIMEventHandlerImpl getInstance];
[zim setEventHandler: eventHandlerImpl];
在多端登录场景下,当用户登录了第二个平台后,可通过监听 userStatusUpdated 回调,从 userStatus.onlinePlatforms
属性了解目前在线的平台,开发者可以借此展示用户在不同平台上的在线状态(例如:显示用户在 iOS 和 Windows 端在线)。
当 userStatusUpdated 回调返回当前用户的 userStatus 信息时,其中的 onlineStatus
将为 unknown
,lastUpdateTime
为 0,并不能真实反馈在线状态。
@interface ZIMEventHandlerImpl : NSObject<ZIMEventHandler>
+(ZIMEventHandlerImpl *)getInstance();
@end
@implementation ZIMEventHandlerImpl
- (void)zim:(ZIM *)zim userStatusUpdated:(NSArray<ZIMUserStatus *> *)userStatusList {
for(ZIMUserStatus *userStatus in userStatusList){
if([userStatus.userID isEqual:myUserID]){
userStatus.onlineStatus; // 如果为当前用户,onlineStatus 将为 unknown
userStatus.onlinePlatforms; // 当前用户的在线平台列表
userStatus.lastUpdateTime; // 如果为当前用户,lastUpdateTime 将为 0
}
}
}
// 其余回调事件..
@end
ZIMEventHandlerImpl *eventHandlerImpl = [ZIMEventHandlerImpl getInstance];
[zim setEventHandler: eventHandlerImpl];
联系我们
文档反馈