182 lines
5.6 KiB
Swift
182 lines
5.6 KiB
Swift
//
|
||
// 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)?) {
|
||
SPStatAPI.requestLeaveApp()
|
||
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)
|
||
SPStatAPI.requestEnterApp()
|
||
SPStatAPI.requestStatOnLine()
|
||
completer?(true)
|
||
NotificationCenter.default.post(name: SPLoginManager.loginStateDidChangeNotification, object: nil)
|
||
} else {
|
||
completer?(false)
|
||
}
|
||
}
|
||
}
|
||
|
||
///删除账号
|
||
func deleteAccount(completer: ((_ isFinish: Bool) -> Void)?) {
|
||
SPStatAPI.requestLeaveApp()
|
||
|
||
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)
|
||
SPStatAPI.requestEnterApp()
|
||
SPStatAPI.requestStatOnLine()
|
||
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
|
||
}
|
||
SPStatAPI.requestLeaveApp()
|
||
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)
|
||
SPStatAPI.requestEnterApp()
|
||
SPStatAPI.requestStatOnLine()
|
||
completer?(true)
|
||
NotificationCenter.default.post(name: SPLoginManager.loginStateDidChangeNotification, object: nil)
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
extension SPLoginManager {
|
||
|
||
///登录状态发生变化
|
||
@objc static let loginStateDidChangeNotification = NSNotification.Name(rawValue: "SPLoginManager.loginStateDidChangeNotification")
|
||
|
||
}
|