用户在线状态

更新时间: 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()
    }
  }
}
此文档是否对你有帮助?
有帮助
去反馈
  • 概述
  • 效果展示
  • 前提条件
  • 开启用户状态显示
  • UIKit 实现源码