// // SPLoginManager.swift // MoviaBox // // Created by 曾觉新 on 2025/4/8. // import UIKit import SmartCodable class SPLoginManager: NSObject { enum LoginType: String, SmartCaseDefaultable { case apple = "Apple" case faceBook = "Facebook" case google = "Google" case tiktok = "Tiktok" } static let manager = SPLoginManager() private(set) var token: SPTokenModel? private(set) var userInfo: SPUserInfo? ///是否登录 var isLogin: Bool { return !(userInfo?.is_tourist ?? true) } ///是否正在刷新token private(set) var isRefreshingToken = false override init() { super.init() token = UserDefaults.jx_object(forKey: kSPLoginTokenDefaultsKey, class: SPTokenModel.self) as? SPTokenModel userInfo = UserDefaults.jx_object(forKey: kSPLoginUserInfoDefaultsKey, class: SPUserInfo.self) as? SPUserInfo } ///判断登录状态,未登录打开登录页面 func isLoginAndOpenLoginVC() -> Bool { if !isLogin { openLoginVC() } return isLogin } func openLoginVC() { let vc = SPLoginViewController() let nav = SPNavigationController(rootViewController: vc) nav.modalPresentationStyle = .fullScreen SPAPPTool.topViewController()?.present(nav, animated: true) } func setLoginToken(token: SPTokenModel?) { self.token = token UserDefaults.jx_setObject(token, forKey: kSPLoginTokenDefaultsKey) } ///第三方登录 func thirdLogin(type: LoginType, presentingViewController: UIViewController, completer: ((_ isFinish: Bool) -> Void)?) { switch type { case .apple: appleSignLogin { [weak self] model in self?.requestThirdLogin(thirdSignModel: model, completer: completer) } case .faceBook: facebookSignLogin(presentingViewController: presentingViewController) { [weak self] model in self?.requestThirdLogin(thirdSignModel: model, completer: completer) } default: break } } ///退出登录 func logout(completer: ((_ isFinish: Bool) -> Void)?) { SPUserAPI.requestSignout { [weak self] token in guard let self = self else { return } if let token = token { self.setLoginToken(token: token) self.userInfo?.is_tourist = true self.updateUserInfo(completer: nil) completer?(true) NotificationCenter.default.post(name: SPLoginManager.loginStateDidChangeNotification, object: nil) } else { completer?(false) } } } ///删除账号 func deleteAccount(completer: ((_ isFinish: Bool) -> Void)?) { SPUserAPI.requestLogoff { [weak self] isFinish in guard let self = self else { return } if isFinish { self.setLoginToken(token: nil) self.userInfo?.is_tourist = true self.updateUserInfo(completer: nil) completer?(true) NotificationCenter.default.post(name: SPLoginManager.loginStateDidChangeNotification, object: nil) } else { completer?(false) } } } ///更新用户信息 func updateUserInfo(completer: (() -> Void)?) { SPUserAPI.requestUserInfo { [weak self] userInfo in guard let self = self else { return } if let userInfo = userInfo { self.userInfo = userInfo UserDefaults.jx_setObject(userInfo, forKey: kSPLoginUserInfoDefaultsKey) } completer?() } } } extension SPLoginManager { ///游客登录 func requestVisitorLogin(completer: (() -> Void)?) { if isRefreshingToken { completer?() return } isRefreshingToken = true SPNetwork.requestToken { [weak self] token in guard let self = self else { return } self.isRefreshingToken = false completer?() } } ///请求第三方登录 private func requestThirdLogin(thirdSignModel: SPThirdSignModel?, completer: ((_ isFinish: Bool) -> Void)?) { guard let thirdSignModel = thirdSignModel else { completer?(false) return } SPUserAPI.requestThirdLogin(model: thirdSignModel) { [weak self] token in guard let self = self else { return } guard let token = token else { completer?(false) return } self.setLoginToken(token: token) self.userInfo?.is_tourist = false self.updateUserInfo(completer: nil) completer?(true) NotificationCenter.default.post(name: SPLoginManager.loginStateDidChangeNotification, object: nil) } } } extension SPLoginManager { ///登录状态发生变化 @objc static let loginStateDidChangeNotification = NSNotification.Name(rawValue: "SPLoginManager.loginStateDidChangeNotification") }