KMLightMemberManager.swift 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. //
  2. // KMLightMemberManager.swift
  3. // PDF Master
  4. //
  5. // Created by lizhe on 2023/2/22.
  6. //
  7. import Cocoa
  8. let USER_LOGINSTATE_NOTIFICATION = "kUserLoginStateNotification" //用户登录状态改变通知
  9. let USER_INFO_CHANGE_NOTIFICATION = "kUserInfoChangeNotification" //用户信息改变通知
  10. let ADVANCED_NOTIFICATION = "kAdvancedContentViewShowNotification" //用户高级引导显示
  11. @objc enum KMLightMemberUserState: Int, CaseIterable {
  12. case unknown = 0//,"unknown"
  13. case login = 1//"login" //登录
  14. case logOut = 2//"logOut" //登出
  15. case cancellation = 3//"cancellation" //注销
  16. }
  17. @objcMembers class KMLightMemberManager: NSObject {
  18. static let manager = KMLightMemberManager()
  19. var config: KMLightMemberConfig = KMLightMemberConfig()
  20. var info: KMLightMemberUserInfo = KMLightMemberUserInfo()
  21. var token: KMLightMemberToken = KMLightMemberToken()
  22. var userState: KMLightMemberUserState = .unknown //用户状态
  23. var purchaseState: KMPurchaseManagerState { //订阅状态
  24. get {
  25. return KMPurchaseManager.manager.state
  26. }
  27. }
  28. //定时器
  29. // var timer: Timer = Timer()
  30. /**
  31. 是否显示高级功能视图
  32. */
  33. var canShowAdvancedView: Bool = true {
  34. didSet {
  35. NotificationCenter.default.post(name: NSNotification.Name(rawValue: ADVANCED_NOTIFICATION), object: nil)
  36. }
  37. }
  38. // {
  39. // get {
  40. // if UserDefaults.standard.object(forKey: "kAdvancedContentViewShow") != nil {
  41. // return false
  42. // } else {
  43. // return true
  44. // }
  45. // }
  46. //
  47. // set {
  48. // UserDefaults.standard.set("kAdvancedContentViewShow", forKey: "kAdvancedContentViewShow")
  49. // UserDefaults.standard.synchronize()
  50. // NotificationCenter.default.post(name: NSNotification.Name(rawValue: ADVANCED_NOTIFICATION), object: nil)
  51. // }
  52. // }
  53. override init() {
  54. super.init()
  55. self.reloadUserInfo()
  56. }
  57. func logOut() {
  58. DispatchQueue.main.async {
  59. self.userState = .logOut
  60. KMLightMemberCache.cache.clean()
  61. self.reloadUserInfo()
  62. NotificationCenter.default.post(name: NSNotification.Name(rawValue: USER_LOGINSTATE_NOTIFICATION), object: nil, userInfo: nil)
  63. }
  64. }
  65. func logIn() {
  66. self.userState = .login
  67. self.reloadUserInfo()
  68. NotificationCenter.default.post(name: NSNotification.Name(rawValue: USER_LOGINSTATE_NOTIFICATION), object: nil, userInfo: nil)
  69. }
  70. func cancellation() {
  71. self.userState = .cancellation
  72. self.reloadUserInfo()
  73. NotificationCenter.default.post(name: NSNotification.Name(rawValue: USER_LOGINSTATE_NOTIFICATION), object: nil, userInfo: nil)
  74. }
  75. }
  76. //MARK: - 数据
  77. extension KMLightMemberManager {
  78. /**
  79. 刷新本地用户数据
  80. */
  81. func reloadUserInfo() {
  82. //获取用户信息
  83. let userInfo = KMLightMemberCache.cache.readData(type: .info)
  84. if userInfo.count != 0 {
  85. KMLightMemberUserInfo.parseData(data: userInfo, needSave: false) { [unowned self] data in
  86. self.info = data
  87. }
  88. } else {
  89. self.info = KMLightMemberUserInfo()
  90. }
  91. let token = KMLightMemberCache.cache.readData(type: .token)
  92. if token.count != 0 {
  93. KMLightMemberToken.parseData(data: token) { [unowned self] data in
  94. self.token = data
  95. }
  96. } else {
  97. self.token = KMLightMemberToken()
  98. }
  99. NotificationCenter.default.post(name: NSNotification.Name(rawValue: USER_INFO_CHANGE_NOTIFICATION), object: nil, userInfo: nil)
  100. }
  101. /**
  102. 刷新本地用户数据
  103. */
  104. func updateNetworkingUserInfo(completion: @escaping (_ isDidLogout: Bool) -> Void) {
  105. KMRequestServerManager.manager.getUserInfo { [unowned self] success, data, error, isLocal in
  106. if success {
  107. self.reloadUserInfo()
  108. completion(false)
  109. } else {
  110. if error?.code == 304 {
  111. KMLightMemberManager.manager.logOut()
  112. completion(true)
  113. }
  114. completion(false)
  115. }
  116. }
  117. }
  118. /**
  119. token是否生效
  120. */
  121. func isTokenValid() async -> Bool {
  122. var result = false
  123. if self.isLogin() {
  124. do {
  125. let (success, error) = try await KMRequestServerManager.manager.getUserInfo2()
  126. // Thread.sleep(forTimeInterval: 20.0)
  127. if success {
  128. result = true
  129. } else {
  130. if error.code == 304 {
  131. KMLightMemberManager.manager.logOut()
  132. result = false
  133. } else {
  134. result = true
  135. }
  136. }
  137. return result
  138. } catch {
  139. return result
  140. }
  141. }
  142. return result
  143. }
  144. }
  145. //MARK: - 快捷方法
  146. extension KMLightMemberManager {
  147. //是否已经登录
  148. func isLogin() -> Bool {
  149. var result: Bool = false
  150. if token.access_token != "" {
  151. result = true
  152. }
  153. return result
  154. }
  155. //是否已经注销
  156. func isLogOff() -> Bool {
  157. var result: Bool = false
  158. return result
  159. }
  160. //是否能使用高级功能
  161. func canUseAdvanced(needNetworking: Bool = false) async -> Bool {
  162. var result: Bool = false
  163. var tokenValid = true
  164. if needNetworking {
  165. tokenValid = await self.isTokenValid()
  166. }
  167. KMPrint(tokenValid)
  168. if tokenValid && info.isInFreeUseTime {
  169. result = true
  170. }
  171. return result
  172. }
  173. //是否能使用付费功能
  174. func canPayFunction(needNetworking: Bool = false) async -> Bool {
  175. var result: Bool = false
  176. //先确认可以使用高级功能,再确认是否已经订阅
  177. if await self.canUseAdvanced(needNetworking: needNetworking) && (self.purchaseState == .subscription || self.purchaseState == .trial) {
  178. result = true
  179. }
  180. return result
  181. }
  182. }
  183. //MARK: 登录注册界面弹出逻辑
  184. /*
  185. 弹出策略:
  186. 每日首次进入阅读页,自动弹出【注册弹窗】;关闭弹窗后,当日不再弹出,次日零点重置
  187. 注意:首次进入阅读页之前,通过其他方式弹出过【注册弹窗】,则进入阅读页不再主动弹出
  188. **/
  189. extension KMLightMemberManager {
  190. //检查是否需要弹起注册登录框
  191. func checkPopupRegister() -> Bool {
  192. var needPop = false
  193. self.resetRegisterPopupStatus()
  194. var info: [String : Any] = [:]
  195. if (UserDefaults.standard.value(forKey: "CheckPopupRegistration") == nil) {
  196. } else {
  197. info = (UserDefaults.standard.value(forKey: "CheckPopupRegistration") as! [String : Any])
  198. }
  199. let isPopupShownToday = info["isPopupShownToday"] as? Bool ?? false
  200. var lastPopupDate = info["lastPopupDate"] as? Date
  201. // 检查是否已经弹出过注册弹窗
  202. if (!isPopupShownToday) {
  203. // 获取当前日期
  204. let currentDate = Date()
  205. // 检查上次弹窗显示的日期是否为空,或者不是当天
  206. if lastPopupDate == nil || (lastPopupDate != nil &&
  207. !Calendar.current.isDate(lastPopupDate!, inSameDayAs: currentDate)) {
  208. // 更新上次弹窗显示的日期为当前日期
  209. lastPopupDate = currentDate
  210. info.updateValue(lastPopupDate!, forKey: "lastPopupDate")
  211. info.updateValue(true, forKey: "isPopupShownToday")
  212. UserDefaults.standard.set(info, forKey: "CheckPopupRegistration")
  213. UserDefaults.standard.synchronize()
  214. needPop = true
  215. }
  216. }
  217. return needPop
  218. }
  219. func updatePopupShownToday(isPop: Bool) {
  220. var info: [String : Any] = [:]
  221. if (UserDefaults.standard.value(forKey: "CheckPopupRegistration") == nil) {
  222. } else {
  223. info = (UserDefaults.standard.value(forKey: "CheckPopupRegistration") as! [String : Any])
  224. }
  225. info.updateValue(isPop, forKey: "isPopupShownToday")
  226. UserDefaults.standard.set(info, forKey: "CheckPopupRegistration")
  227. UserDefaults.standard.synchronize()
  228. }
  229. func resetRegisterPopupStatus() {
  230. var info: [String : Any] = [:]
  231. if (UserDefaults.standard.value(forKey: "CheckPopupRegistration") == nil) {
  232. } else {
  233. info = (UserDefaults.standard.value(forKey: "CheckPopupRegistration") as! [String : Any])
  234. }
  235. var isPopupShownToday = info["isPopupShownToday"]
  236. let lastPopupDate = info["lastPopupDate"] as? Date
  237. // 获取当前日期和时间
  238. let currentDate = Date()
  239. // 获取当前日历
  240. let calendar = Calendar.current
  241. // 获取当天的午夜时间
  242. let midnight = calendar.startOfDay(for: currentDate)
  243. // 检查上次弹窗显示的日期是否早于当天的午夜时间
  244. if let lastPopupDate = lastPopupDate, lastPopupDate < midnight {
  245. // 重置弹窗状态
  246. isPopupShownToday = false
  247. info.updateValue(isPopupShownToday!, forKey: "isPopupShownToday")
  248. // info.updateValue(NSDate(), forKey: "lastPopupDate")
  249. UserDefaults.standard.set(info, forKey: "CheckPopupRegistration")
  250. UserDefaults.standard.synchronize()
  251. }
  252. }
  253. }