jsdw_ios/QuickLocation/Section/Group/GroupIMService.swift

98 lines
3.0 KiB
Swift

//
// GroupIMService.swift
// QuickLocation
//
// Created by on 2026/6/4.
//
import Foundation
import OpenIMSDK
final class GroupIMService {
static let shared = GroupIMService()
private var isLogined = false
private init() {}
// MARK: - Init SDK
func initSDK() {
let config = OIMInitConfig()
config.apiAddr = URLManager.shared.openIM_API
config.wsAddr = URLManager.shared.openIM_WS
config.platform = .iPhone
OIMManager.manager.initSDK(with: config,
onConnecting: {},
onConnectFailure: { _, _ in },
onConnectSuccess: {},
onKickedOffline: {},
onUserTokenExpired: {},
onUserTokenInvalid: { _ in })
}
// MARK: - Login
func login(completion: @escaping (Bool) -> Void) {
guard !isLogined, let token = AppContextManager.shared.imToken else {
completion(true)
return
}
let userId = AppContextManager.shared.userId
guard !userId.isEmpty, !token.isEmpty else {
completion(false)
return
}
OIMManager.manager.login(userId, token: token) { [weak self] _ in
self?.isLogined = true
completion(true)
} onFailure: { code, msg in
print("OpenIM login failed: \(code) \(msg ?? "")")
completion(false)
}
}
// MARK: - Get Joined Groups
func getJoinedGroups(completion: @escaping ([OIMGroupInfo]) -> Void) {
OIMManager.manager.getJoinedGroupListWith(onSuccess: { groups in
completion(groups ?? [])
}, onFailure: { code, msg in
print("getJoinedGroupList failed: \(code) \(msg ?? "")")
completion([])
})
}
// MARK: - Conversation List (for unread count & last msg time)
func getConversationList(completion: @escaping ([OIMConversationInfo]) -> Void) {
OIMManager.manager.getAllConversationListWith(onSuccess: { list in
completion(list ?? [])
}, onFailure: { code, msg in
completion([])
})
}
// MARK: - Conversation Listener
private var conversationListener: ConversationListenerProxy?
func setConversationListener(_ handler: @escaping ([OIMConversationInfo]) -> Void) {
conversationListener = ConversationListenerProxy(handler: handler)
OIMManager.callbacker.addConversationListener(listener: conversationListener!)
}
}
// MARK: - ConversationListenerProxy
private class ConversationListenerProxy: NSObject, OIMConversationListener {
private let handler: ([OIMConversationInfo]) -> Void
init(handler: @escaping ([OIMConversationInfo]) -> Void) {
self.handler = handler
}
func onConversationChanged(_ conversations: [OIMConversationInfo]) {
handler(conversations)
}
func onNewConversation(_ conversations: [OIMConversationInfo]) {
handler(conversations)
}
}