feat: 简化登录模型,移除 nickname/avatar/expiresAt
这个提交包含在:
父节点
e7067d03cb
当前提交
8cf9699441
1
.gitignore
vendored
1
.gitignore
vendored
@ -9,3 +9,4 @@ build/
|
|||||||
.idea/
|
.idea/
|
||||||
*.log
|
*.log
|
||||||
/.build/
|
/.build/
|
||||||
|
/XuqmDemo/.build/
|
||||||
|
|||||||
@ -8,10 +8,8 @@ public final class XuqmSDK: NSObject {
|
|||||||
private(set) var tokenStore: TokenStore?
|
private(set) var tokenStore: TokenStore?
|
||||||
|
|
||||||
public private(set) var currentUserId: String?
|
public private(set) var currentUserId: String?
|
||||||
public var onUserSigExpired: (() -> Void)?
|
|
||||||
|
|
||||||
private var userSig: String?
|
private var userSig: String?
|
||||||
private var userSigTimer: Timer?
|
|
||||||
private var cachedDeviceToken: String?
|
private var cachedDeviceToken: String?
|
||||||
|
|
||||||
private override init() {
|
private override init() {
|
||||||
@ -34,7 +32,6 @@ public final class XuqmSDK: NSObject {
|
|||||||
public func login(userId: String, userSig: String) async {
|
public func login(userId: String, userSig: String) async {
|
||||||
self.currentUserId = userId
|
self.currentUserId = userId
|
||||||
self.userSig = userSig
|
self.userSig = userSig
|
||||||
startUserSigExpirationTimer(userSig: userSig)
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
try await ImSDK.shared.loginWithUserSig(userId, userSig)
|
try await ImSDK.shared.loginWithUserSig(userId, userSig)
|
||||||
@ -52,9 +49,6 @@ public final class XuqmSDK: NSObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public func logout() async {
|
public func logout() async {
|
||||||
userSigTimer?.invalidate()
|
|
||||||
userSigTimer = nil
|
|
||||||
|
|
||||||
ImSDK.shared.disconnect()
|
ImSDK.shared.disconnect()
|
||||||
|
|
||||||
if let userId = currentUserId {
|
if let userId = currentUserId {
|
||||||
@ -81,42 +75,4 @@ public final class XuqmSDK: NSObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func startUserSigExpirationTimer(userSig: String) {
|
|
||||||
userSigTimer?.invalidate()
|
|
||||||
guard let expDate = extractExpirationDate(from: userSig) else { return }
|
|
||||||
let interval = expDate.timeIntervalSinceNow - 300 // 5 minutes before expiry
|
|
||||||
guard interval > 0 else {
|
|
||||||
onUserSigExpired?()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
userSigTimer = Timer.scheduledTimer(
|
|
||||||
timeInterval: interval,
|
|
||||||
target: self,
|
|
||||||
selector: #selector(userSigDidExpire),
|
|
||||||
userInfo: nil,
|
|
||||||
repeats: false
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc private func userSigDidExpire() {
|
|
||||||
onUserSigExpired?()
|
|
||||||
}
|
|
||||||
|
|
||||||
private func extractExpirationDate(from userSig: String) -> Date? {
|
|
||||||
let parts = userSig.split(separator: ".")
|
|
||||||
guard parts.count >= 2 else { return nil }
|
|
||||||
var base64 = String(parts[1])
|
|
||||||
.replacingOccurrences(of: "-", with: "+")
|
|
||||||
.replacingOccurrences(of: "_", with: "/")
|
|
||||||
let padding = 4 - base64.count % 4
|
|
||||||
if padding != 4 {
|
|
||||||
base64 += String(repeating: "=", count: padding)
|
|
||||||
}
|
|
||||||
guard let data = Data(base64Encoded: base64),
|
|
||||||
let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
|
|
||||||
let exp = json["exp"] as? TimeInterval else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return Date(timeIntervalSince1970: exp)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,15 +36,13 @@ public final class ImSDK {
|
|||||||
client?.connect()
|
client?.connect()
|
||||||
}
|
}
|
||||||
|
|
||||||
public func login(userId: String, nickname: String? = nil, avatar: String? = nil) async throws {
|
public func login(userId: String) async throws {
|
||||||
let config = XuqmSDK.shared.requireConfig()
|
let config = XuqmSDK.shared.requireConfig()
|
||||||
|
|
||||||
var items = [
|
let items = [
|
||||||
URLQueryItem(name: "appId", value: config.appId),
|
URLQueryItem(name: "appId", value: config.appId),
|
||||||
URLQueryItem(name: "userId", value: userId),
|
URLQueryItem(name: "userId", value: userId),
|
||||||
]
|
]
|
||||||
if let nickname { items.append(URLQueryItem(name: "nickname", value: nickname)) }
|
|
||||||
if let avatar { items.append(URLQueryItem(name: "avatar", value: avatar)) }
|
|
||||||
|
|
||||||
let res: ImLoginResponse = try await ApiClient.shared.request(
|
let res: ImLoginResponse = try await ApiClient.shared.request(
|
||||||
path: "/api/im/auth/login",
|
path: "/api/im/auth/login",
|
||||||
|
|||||||
正在加载...
在新工单中引用
屏蔽一个用户