用户在线状态
更新时间: 2025/11/14 18:34:12
概述
用户在线状态功能可以让您的应用显示好友的实时在线情况,提升用户互动体验。
- 开启此功能后,在会话列表和通讯录的用户头像上将显示用户的在线状态。当绿圈出现时表示对方在线,灰色圆圈则表示对方当前离线。
- 关闭此功能时,不再显示好友的用户在线状态。
效果展示
前提条件
使用此功能前,您需要在 网易云信控制台 开通 用户在线状态 功能,具体请参考 配置群组功能。
开启用户状态显示
在初始化 IM SDK 之前,将 AppDelegate 的 application(_:didFinishLaunchingWithOptions:) 方法中的 enableOnlineStatus 的默认值改为 true。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 初始化 SDK 前配置 NIM UIKit
IMKitConfigCenter.shared.enableOnlineStatus = true // 启用用户在线状态
// 设置 IM SDK 的配置项
let option = NIMSDKOption()
option.appKey = "your app key"
// 设置 IM SDK V2 的配置项
let v2Option = V2NIMSDKOption()
v2Option.enableV2CloudConversation = false
// 初始化 IM UIKit
IMKitClient.instance.setupIM2(option, v2Option)
return true
}
UIKit 实现源码
IM UIKit 内部实现 用户在线状态 功能的源码如下:
在 NEContactUIKit/NEContactUIKit/Classes/ViewModel 中对应修改源码。源码中示例的是传入好友的 accountId,非好友也可以参考实现。
extension ContactViewModel: NESubscribeListener {
/// 订阅在线状态
open func subscribeOnlineStatus() {
var subscribeList: [String] = []
for section in contactSections {
for contact in section.contacts {
if let accountId = contact.user?.user?.accountId {
if let event = NESubscribeManager.shared.getSubscribeStatus(accountId) {
onlineStatusDic[accountId] = event.statusType == .USER_STATUS_TYPE_LOGIN
} else {
subscribeList.append(accountId)
}
}
}
}
if subscribeList.count > 0 {
NESubscribeManager.shared.subscribeUsersOnlineState(subscribeList) { error in
}
}
}
/// 取消订阅
open func unsubscribeOnlineStatus() {
var subscribeList: [String] = []
for section in contactSections {
for contact in section.contacts {
if let accountId = contact.user?.user?.accountId {
subscribeList.append(accountId)
}
}
}
NESubscribeManager.shared.unSubscribeUsersOnlineState(subscribeList) { error in
}
}
/// 用户状态变更
/// - Parameter data: 用户状态列表
public func onUserStatusChanged(_ data: [V2NIMUserStatus]) {
var needRefresh = false
for d in data {
if NEFriendUserCache.shared.isFriend(d.accountId) {
onlineStatusDic[d.accountId] = d.statusType == .USER_STATUS_TYPE_LOGIN
needRefresh = true
}
}
if needRefresh {
delegate?.reloadTableView()
}
}
}
此文档是否对你有帮助?





