用户在线状态订阅 (Presence)
趣小界支持实时展示好友/聊天对象的在线状态及当前在线终端(如 iOS、Android、Web、macOS)。QXJIMSDK 提供了完整的订阅、取消订阅、批量查询以及实时变更事件流 userStatusEvents。
断线重连自动续订保障
QXJIMClient 内部维护了当前已订阅的 subscribedUserIDs 集合。当设备网络闪断并重新连接 WebSocket 成功(.connected)时,SDK 会自动在后台重新向服务器发起订阅请求,业务层无需手动编写重连恢复逻辑。
1. 数据模型 (IMUserOnlineStatus)
public struct IMUserOnlineStatus: Codable, Sendable, Equatable, Identifiable {
public var userID: String
public var status: Int32? // 1 = 在线 (Online), 0 = 离线 (Offline)
public var platformIDs: [Int32]? // 当前在线的平台 ID 数组
/// 便捷属性:是否在线
public var isOnline: Bool
/// 便捷属性:当前在线的平台枚举列表(如 [.iOS, .web])
public var onlinePlatforms: [IMPlatform]
}
2. 订阅与监听在线状态
// 1. 订阅指定用户的在线状态(调用后会立即返回这些用户当前的在线状态)
let currentStatuses = try await QXJIMClient.shared.subscribeUsersStatus(
userIDs: ["u_10002", "u_10003"]
)
for status in currentStatuses {
print("用户 \(status.userID) 当前是否在线: \(status.isOnline), 在线设备: \(status.onlinePlatforms)")
}
// 2. 实时监听已订阅用户的上下线变化
Task {
for await statusChange in QXJIMClient.shared.userStatusEvents.stream() {
print("用户 \(statusChange.userID) 状态变更为: \(statusChange.isOnline ? "在线" : "离线")")
}
}
3. 取消订阅与主动查询
// 当用户离开好友列表或聊天窗口时,取消订阅不再需要关注的用户
try await QXJIMClient.shared.unsubscribeUsersStatus(userIDs: ["u_10002"])
// 获取当前所有已订阅用户的最新在线状态
let allSubscribed = try await QXJIMClient.shared.getSubscribeUsersStatus()
// 一次性查询指定用户的在线状态
let queried = try await QXJIMClient.shared.getUserStatus(userIDs: ["u_10005"])