// // KMCheckInManager.swift // PDF Reader Pro // // Created by User-Tangchao on 2025/1/2. // import Cocoa let kKMTrailCancelStateDidChange = Notification.Name("KMTrailCancelStateDidChangeNotificationName") @objcMembers class KMCheckInManager: NSObject { static let `default` = KMCheckInManager() // 试用退订 var trailCancel = false { didSet { NotificationCenter.default.post(name: kKMTrailCancelStateDidChange, object: nil) } } private var timer_: Timer? func initLaunchData() { // 启动定时器 轮询签到 var timeInterval: CGFloat = 60 * 60 #if DEBUG timeInterval = 1 * 60 #endif timer_ = Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: true, block: { [weak self] timer in self?.checkIn(refreshData: true, callback: nil) self?.fetchCancelSubscribe(callback: nil) }) } func checkIn(refreshData: Bool, callback: ((Any ...)->Void)?) { let member = KMMemberInfo.shared if member.isLogin == false { return } if member.is_advanced_year_subscribe() == false { return } if member.isCancelSubscribe() { // 已退订 return } // 高级版年订阅 if member.is_trailing() == false { return } let userEmail = member.userEmail if userEmail.isEmpty { return } if hasCheckInForToday(for: userEmail) { // 今天已经签到 return } // 试用中 去签到 KMMemberCenterManager.checkIn { success, resultModel, error in if success { if refreshData { // 刷新用户数据 [刷新试用天数] KMUserInfoVCModel().refreshUserInfo { success, msg,dic in if(success) { self.openCheckInWindow() callback?() } else { callback?() } } } else { self.openCheckInWindow() callback?() } } else { callback?() self.openCheckInWindow() } } } // 弹签到窗口 func openCheckInWindow() { let member = KMMemberInfo.shared if member.isLogin == false { return } let userEmail = member.userEmail if userEmail.isEmpty { return } if hasCheckInForToday(for: userEmail) { // 今天已经签到 return } // 弹签到窗口 if KMCheckInWindowController.shared.needShow() { var dayNum: Int = 0 for vip in KMMemberInfo.shared.activeVips { if vip.levels == "3" && vip.paymentModel == "1" && vip.cycle == 4 { dayNum = vip.trailDays break } } if dayNum == 1 || dayNum == 3 || dayNum == 7 { if fetchDayNumRecord(for: userEmail) != dayNum { // 最后记录的累积天数没有弹 KMCheckInWindowController.shared.openWindow(num: dayNum) } saveRecord(dayNum: dayNum) } } } func advancedYearSubscribeTrailCancelForLocal() -> Bool { #if VERSION_FREE #if VERSION_DMG #else if KMMemberInfo.shared.isLogin { return false } let man = IAPProductsManager.default() if let model = IAPReceiptTool.fetchProductLastestReceipts(with: man?.receiptModel, withProductId: man?.fourDevicesAllAccessPackNew12months_lite?.product?.productIdentifier) { if model.is_trial_period { // 有试用过 var cancelTrail = false for infoM in man?.receiptModel?.pendingRenewalInfoModels ?? [] { if model.product_id == infoM.product_id { cancelTrail = infoM.auto_renew_status == 0 } } if cancelTrail { // 试用退订 return true } } } #endif #endif return false } func fetchCancelSubscribe(callback: ((Any ...)->Void)?) { #if VERSION_FREE // 判断用户是否处于试用后退订 KMMemberCenterManager.judgeTrailCancel { success, resultModel, error in callback?() if success == true { self.trailCancel = resultModel?.result ?? false if self.trailCancel { self.openCancelSubscribeWindow() } } } #endif } // 退订窗口 func openCancelSubscribeWindow() { #if VERSION_DMG if KMDataManager.ud_bool(forKey: kKMAdvancedYearSubscribedOfTrial) == false { // 没有试用过 return } // 高级版年订阅有试用过 let member = KMMemberInfo.shared if member.isLogin == false { return } if member.is_advanced_year_subscribe() && member.vip_payType == 1 { // 高级版年订阅有试用 续订 return } if KMCancelSubscribeSuccessWindowController.shared.needShow() { KMCancelSubscribeSuccessWindowController.shared.openWindow() } #else if KMMemberInfo.shared.isLogin == false && advancedYearSubscribeTrailCancelForLocal() { // 本地权益 高级版年订阅试用退订 if KMMemberInfo.shared.isMemberAllFunction { // 有本地 或 账号权益 return } let winC = KMCancelSubscribeSuccessWindowController.shared if winC.needShow() { if winC.window?.isVisible == true { } else { winC.openWindow() } } return } if KMDataManager.ud_bool(forKey: kKMAdvancedYearSubscribedOfTrial) == false { // 没有试用过 return } // 高级版年订阅有试用过 let member = KMMemberInfo.shared if member.isLogin == false { return } if member.is_advanced_year_subscribe() && member.isCancelSubscribe() == false { // 高级版年订阅有试用 续订 return } let winC = KMCancelSubscribeSuccessWindowController.shared if winC.needShow() { if winC.window?.isVisible == true { } else { winC.openWindow() } } #endif } func hasCheckInForToday(for email: String) -> Bool { let record = fetchRecord(for: email) if record.isEmpty { return false } guard let recordTime = record["time"] as? TimeInterval, recordTime > 0 else { return false } let recordDate = Date(timeIntervalSince1970: recordTime) if recordDate.isToday() { // 今天已经签到 return true } return false } func fetchDayNumRecord(for email: String) -> Int { let record = fetchRecord(for: email) if record.isEmpty { return 0 } let dayNum = record["dayNum"] as? Int return dayNum ?? 0 } // MARK: - Record func saveRecord(dayNum: Int) { let member = KMMemberInfo.shared if member.isLogin == false { return } let userEmail = member.userEmail if userEmail.isEmpty { return } if hasCheckInForToday(for: userEmail) { // 今天已经签到 return } // 暂时没有做数量限制 var dict = KMDataManager.udExtension_object(forKey: "CheckInRecords") as? [String : Any] ?? [:] let time = Date().timeIntervalSince1970 let data = ["email" : userEmail, "time" : time, "dayNum" : dayNum] as [String : Any] dict[userEmail] = data KMDataManager.udExtension_set(dict , forKey: "CheckInRecords") } func fetchRecords() -> [String : Any] { let datas = KMDataManager.udExtension_object(forKey: "CheckInRecords") as? [String : Any] return datas ?? [:] } func fetchRecord(for key: String) -> [String : Any] { let data = fetchRecords()[key] as? [String : Any] return data ?? [:] } }