|
|
@@ -40,6 +40,10 @@ var hasLogin: Bool {
|
|
|
class LNAccountManager: NSObject {
|
|
|
static let shared = LNAccountManager()
|
|
|
|
|
|
+ private let onlineHeartbeatInterval: TimeInterval = 5
|
|
|
+ private var onlineHeartbeatTimer: Timer?
|
|
|
+ private var isReportingOnlineHeartbeat = false
|
|
|
+
|
|
|
private(set) var token = LNUserDefaults[.token, ""] {
|
|
|
didSet { LNUserDefaults[.token] = token }
|
|
|
}
|
|
|
@@ -279,12 +283,50 @@ extension LNAccountManager {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+extension LNAccountManager {
|
|
|
+ private func startOnlineHeartbeatTimerIfNeed() {
|
|
|
+ runOnMain { [weak self] in
|
|
|
+ guard let self else { return }
|
|
|
+ guard onlineHeartbeatTimer == nil else { return }
|
|
|
+ let timer = Timer.scheduledTimer(withTimeInterval: onlineHeartbeatInterval, repeats: true)
|
|
|
+ { [weak self] _ in
|
|
|
+ guard let self else { return }
|
|
|
+ guard wasLogin && LNAppConfig.shared.isForeground else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ isReportingOnlineHeartbeat = true
|
|
|
+ LNHttpManager.shared.reportOnlineHeartbeat { [weak self] err in
|
|
|
+ guard let self else { return }
|
|
|
+ isReportingOnlineHeartbeat = false
|
|
|
+ if let err {
|
|
|
+ Log.d("report online heartbeat failed: \(err.errorDesc)")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ RunLoop.main.add(timer, forMode: .common)
|
|
|
+ onlineHeartbeatTimer = timer
|
|
|
+ Log.d("start online heartbeat")
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private func stopOnlineHeartbeatTimer() {
|
|
|
+ runOnMain { [weak self] in
|
|
|
+ guard let self else { return }
|
|
|
+ onlineHeartbeatTimer?.invalidate()
|
|
|
+ onlineHeartbeatTimer = nil
|
|
|
+ Log.d("stop online heartbeat")
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
extension LNAccountManager {
|
|
|
private func notifyUserLogin() {
|
|
|
+ startOnlineHeartbeatTimerIfNeed()
|
|
|
LNEventDeliver.notifyEvent { ($0 as? LNAccountManagerNotify)?.onUserLogin() }
|
|
|
}
|
|
|
|
|
|
private func notifyUserLogout() {
|
|
|
+ stopOnlineHeartbeatTimer()
|
|
|
LNEventDeliver.notifyEvent { ($0 as? LNAccountManagerNotify)?.onUserLogout() }
|
|
|
}
|
|
|
|