QSLStatisticsUserTimeManager.swift 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //
  2. // QSLStatisticsUserTimeManager.swift
  3. // QuickSearchLocation
  4. //
  5. // Created by Destiny on 2025/7/30.
  6. //
  7. import Foundation
  8. import UIKit
  9. import GravityEngineSDK
  10. class QSLStatisticsUserTimeManager {
  11. static let shared = QSLStatisticsUserTimeManager()
  12. private let userDefaults = UserDefaults.standard
  13. private var backgroundTaskID: UIBackgroundTaskIdentifier?
  14. private var timer: Timer?
  15. private var sessionStartTime: Date?
  16. // MARK: - 键名常量
  17. private struct Keys {
  18. static let totalUsage = "GETotalUsageTime"
  19. static let lastUploadTime = "GELastUploadTime"
  20. }
  21. // 累计使用时长(秒)
  22. private var totalUsageTime: TimeInterval {
  23. get { userDefaults.double(forKey: Keys.totalUsage) }
  24. set { userDefaults.set(newValue, forKey: Keys.totalUsage) }
  25. }
  26. // MARK: - 生命周期监听
  27. func startTracking() {
  28. NotificationCenter.default.addObserver(self,
  29. selector: #selector(appDidBecomeActive),
  30. name: UIApplication.didBecomeActiveNotification,
  31. object: nil)
  32. NotificationCenter.default.addObserver(self,
  33. selector: #selector(appWillResignActive),
  34. name: UIApplication.willResignActiveNotification,
  35. object: nil)
  36. NotificationCenter.default.addObserver(
  37. self,
  38. selector: #selector(handleTrackResult),
  39. name: Notification.Name("GravityEngineTrackResult"),
  40. object: nil
  41. )
  42. }
  43. @objc func handleTrackResult() {
  44. print("数据商城成功----")
  45. }
  46. @objc private func appDidBecomeActive() {
  47. sessionStartTime = Date()
  48. startPeriodicUpload()
  49. }
  50. @objc private func appWillResignActive() {
  51. saveCurrentSession()
  52. beginBackgroundTask()
  53. }
  54. // MARK: - 数据记录逻辑
  55. private func saveCurrentSession() {
  56. guard let start = sessionStartTime else { return }
  57. totalUsageTime += Date().timeIntervalSince(start)
  58. sessionStartTime = nil
  59. }
  60. // MARK: - 定期上传
  61. private func startPeriodicUpload() {
  62. // 每隔5分钟检查上传(与SDK的上传间隔分开)
  63. timer = Timer.scheduledTimer(withTimeInterval: 300, repeats: true) { [weak self] _ in
  64. self?.uploadUsageData()
  65. }
  66. }
  67. private func uploadUsageData() {
  68. saveCurrentSession()
  69. let properties: [String: Any] = [
  70. "total_usage_seconds": totalUsageTime,
  71. "last_upload_time": Date().timeIntervalSince1970
  72. ]
  73. // 通过GravityEngine上报事件
  74. gravityInstance?.track(QSLGravityConst.usage_collect_accumulatedTime, properties: properties)
  75. print("时长上报成功")
  76. self.totalUsageTime = 0 // 重置累计时长
  77. self.userDefaults.set(Date().timeIntervalSince1970, forKey: Keys.lastUploadTime)
  78. /*GravityEngine.shared.track("app_usage", properties: properties) { success, error in
  79. if success {
  80. print("时长上报成功")
  81. self.totalUsageTime = 0 // 重置累计时长
  82. self.userDefaults.set(Date().timeIntervalSince1970, forKey: Keys.lastUploadTime)
  83. } else {
  84. print("上报失败: \(error?.localizedDescription ?? "")")
  85. }
  86. }*/
  87. }
  88. // MARK: - 后台任务
  89. private func beginBackgroundTask() {
  90. backgroundTaskID = UIApplication.shared.beginBackgroundTask { [weak self] in
  91. self?.endBackgroundTask()
  92. }
  93. }
  94. private func endBackgroundTask() {
  95. if let taskID = backgroundTaskID {
  96. UIApplication.shared.endBackgroundTask(taskID)
  97. backgroundTaskID = .invalid
  98. }
  99. }
  100. }