KMDataManager.swift 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. //
  2. // KMDataManager.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2024/2/23.
  6. //
  7. import Cocoa
  8. // 数据持久化 【UserDefault、本地存储、数据库】
  9. let kDocumentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
  10. let kAppSupportDirectory = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!
  11. let kAppSupportOfBundleIdentifierDirectory = kAppSupportDirectory.appendingPathComponent(MainBundle.bundleIdentifier ?? kBundleIdentifier)
  12. class KMDataManager: NSObject {
  13. // 单例
  14. static let `default` = KMDataManager()
  15. var isTabbingWin = false //多页签提示页是否展示中
  16. var toolbarConfigDataUpdated = false
  17. private let launchAppCountKey_ = "kFirstOpenAppCount"
  18. private let launchAppCountForUpdateKey_ = "kLaunchAppCountForUpdate"
  19. private let launchLastVersionKey_ = "kLaunchLastVersion"
  20. private var appFirstLaunch_ = false
  21. var appFirstLaunch: Bool {
  22. get {
  23. return appFirstLaunch_
  24. }
  25. }
  26. private var appFirstLaunchForUpdate_ = false
  27. var appFirstLaunchForUpdate: Bool {
  28. get {
  29. return appFirstLaunchForUpdate_
  30. }
  31. }
  32. // 启动 App 处理数据
  33. func initLaunchData() {
  34. let appLaunchCnt = Self.ud_integer(forKey: launchAppCountKey_) + 1
  35. Self.ud_set(appLaunchCnt, forKey: launchAppCountKey_)
  36. let launchAppCntForUpdate = Self.ud_integer(forKey: launchAppCountForUpdateKey_) + 1
  37. Self.ud_set(launchAppCntForUpdate, forKey: launchAppCountForUpdateKey_)
  38. let appVersion = KMTools.getAppVersion()
  39. if let launchLastVersion = Self.ud_string(forKey: launchLastVersionKey_) {
  40. let result = SKVersionNumber.compareVersionString(launchLastVersion, toVersionString: appVersion)
  41. if result == .orderedAscending {
  42. appFirstLaunchForUpdate_ = true
  43. Self.ud_set(1, forKey: launchAppCountForUpdateKey_)
  44. // KMWinBackWindowController.shared.clearRecord()
  45. }
  46. } else {
  47. appFirstLaunch_ = true
  48. }
  49. Self.ud_set(appVersion, forKey: launchLastVersionKey_)
  50. }
  51. }
  52. // MARK: - Paths
  53. extension KMDataManager {
  54. class func fetchAppSupportOfBundleIdentifierDirectory(makeIfNecessary: Bool = true) -> URL {
  55. let url = kAppSupportOfBundleIdentifierDirectory
  56. if makeIfNecessary {
  57. if FileManager.default.fileExists(atPath: url.path) == false {
  58. try?FileManager.default.createDirectory(at: url, withIntermediateDirectories: false)
  59. }
  60. }
  61. return url
  62. }
  63. }
  64. // MARK: - UserDefault
  65. extension KMDataManager {
  66. class func ud_object(forKey defaultName: String) -> Any? {
  67. return self.userD_.object(forKey: defaultName)
  68. }
  69. class func ud_set(_ value: Any?, forKey defaultName: String, sync: Bool = true) {
  70. self.userD_.set(value, forKey: defaultName)
  71. if sync {
  72. self.userD_.synchronize()
  73. }
  74. }
  75. class func ud_removeObject(forKey defaultName: String, sync: Bool = true) {
  76. self.userD_.removeObject(forKey: defaultName)
  77. }
  78. class func ud_string(forKey defaultName: String) -> String? {
  79. return self.userD_.string(forKey: defaultName)
  80. }
  81. class func ud_array(forKey defaultName: String) -> [Any]? {
  82. return self.userD_.array(forKey: defaultName)
  83. }
  84. class func ud_dictionary(forKey defaultName: String) -> [String : Any]? {
  85. return self.userD_.dictionary(forKey: defaultName)
  86. }
  87. class func ud_data(forKey defaultName: String) -> Data? {
  88. return self.userD_.data(forKey: defaultName)
  89. }
  90. class func ud_stringArray(forKey defaultName: String) -> [String]? {
  91. return self.userD_.stringArray(forKey: defaultName)
  92. }
  93. class func ud_integer(forKey defaultName: String) -> Int {
  94. return self.userD_.integer(forKey: defaultName)
  95. }
  96. class func ud_float(forKey defaultName: String) -> Float {
  97. return self.userD_.float(forKey: defaultName)
  98. }
  99. class func ud_double(forKey defaultName: String) -> Double {
  100. return self.userD_.double(forKey: defaultName)
  101. }
  102. class func ud_bool(forKey defaultName: String) -> Bool {
  103. return self.userD_.bool(forKey: defaultName)
  104. }
  105. class func ud_url(forKey defaultName: String) -> URL? {
  106. return self.userD_.url(forKey: defaultName)
  107. }
  108. class func ud_set(_ value: Int, forKey defaultName: String, sync: Bool = true) {
  109. self.userD_.set(value, forKey: defaultName)
  110. if sync {
  111. self.userD_.synchronize()
  112. }
  113. }
  114. class func ud_set(_ value: Float, forKey defaultName: String, sync: Bool = true) {
  115. self.userD_.set(value, forKey: defaultName)
  116. if sync {
  117. self.userD_.synchronize()
  118. }
  119. }
  120. class func ud_set(_ value: Double, forKey defaultName: String, sync: Bool = true) {
  121. self.userD_.set(value, forKey: defaultName)
  122. if sync {
  123. self.userD_.synchronize()
  124. }
  125. }
  126. class func ud_set(_ value: Bool, forKey defaultName: String, sync: Bool = true) {
  127. self.userD_.set(value, forKey: defaultName)
  128. if sync {
  129. self.userD_.synchronize()
  130. }
  131. }
  132. class func ud_set(_ url: URL?, forKey defaultName: String, sync: Bool = true) {
  133. self.userD_.set(url, forKey: defaultName)
  134. if sync {
  135. self.userD_.synchronize()
  136. }
  137. }
  138. // 私有
  139. private class var userD_: UserDefaults {
  140. get {
  141. return UserDefaults.standard
  142. }
  143. }
  144. }
  145. // MARK: - UserDefault 的补充
  146. extension KMDataManager {
  147. private static let userD_dirname_key_ = "KMUserDefaultExtension"
  148. private static let userD_filename_key_ = "KMUserDefaultExtension.plist"
  149. // 保存数据 [清空数据时传nil]
  150. class func udExtension_set(_ value: Any?, forKey defaultName: String) {
  151. // 存储文件路径
  152. let dir = self.fetchAppSupportOfBundleIdentifierDirectory().appendingPathComponent(self.userD_dirname_key_)
  153. if FileManager.default.fileExists(atPath: dir.path) == false {
  154. try?FileManager.default.createDirectory(at: dir, withIntermediateDirectories: false)
  155. }
  156. // 存储文件名称
  157. let fileUrl = dir.appendingPathComponent(self.userD_filename_key_)
  158. if FileManager.default.fileExists(atPath: fileUrl.path) == false {
  159. try?FileManager.default.createFile(atPath: fileUrl.path, contents: nil)
  160. }
  161. // 获取原始文件数据
  162. var info = NSMutableDictionary()
  163. if let data = try?NSDictionary(contentsOf: fileUrl, error: ()) {
  164. info.addEntries(from: data as? [AnyHashable : Any] ?? [:])
  165. }
  166. // 保存数据
  167. info.setObject(value as Any, forKey: defaultName as NSCopying)
  168. info.write(to: fileUrl, atomically: true)
  169. }
  170. // 获取数据
  171. class func udExtension_object(forKey defaultName: String) -> Any? {
  172. // 查找文件
  173. let dir = self.fetchAppSupportOfBundleIdentifierDirectory().appendingPathComponent(self.userD_dirname_key_)
  174. let fileUrl = dir.appendingPathComponent(self.userD_filename_key_)
  175. guard let dict = NSDictionary(contentsOfFile: fileUrl.path) else {
  176. return nil
  177. }
  178. // 获取数据
  179. if dict.count == 0 {
  180. return nil
  181. }
  182. return dict[defaultName]
  183. }
  184. }