From 9a26c4ac7f272dbe1087ccccff299aa0232dfd9e Mon Sep 17 00:00:00 2001 From: zeng Date: Wed, 30 Apr 2025 11:16:51 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=B3=A8=E9=94=80=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppDelegate/AppDelegate+OpenApp.swift | 2 +- MoviaBox/AppDelegate/AppDelegate.swift | 10 +- .../Base/Controller/SPViewController.swift | 2 + MoviaBox/Base/Define/SPUserDefaultsKey.swift | 2 + .../Base/Networking/API/SPRewardsAPI.swift | 2 +- MoviaBox/Base/Networking/API/SPUserAPI.swift | 35 +++--- .../Base/WebView/SPWebViewController.swift | 4 + .../Controller/SPHomeViewController.swift | 7 ++ .../Controller/SPLoginViewController.swift | 10 +- .../SPDeleteAccountViewController.swift | 7 +- .../Controller/SPMineViewController.swift | 9 +- .../Controller/SPSettingsViewController.swift | 34 +++++- MoviaBox/Class/Mine/Model/SPMineItem.swift | 2 + .../Class/Mine/View/SPMineHeaderView.swift | 6 + .../Class/Mine/View/SPMineMemberNoView.swift | 15 ++- .../Class/Mine/View/SPMineMemberView.swift | 18 ++- .../Class/Mine/View/SPMineWalletView.swift | 15 ++- .../SPCollectListViewController.swift | 7 ++ .../SPPlayHistoryViewController.swift | 6 + .../Controller/SPRewardsViewController.swift | 10 +- .../Controller/SPWalletViewController.swift | 1 + .../Wallet/View/SPWalletHeaderView.swift | 6 + .../Libs/Login/SPLoginManager+Apple.swift | 70 ++++++++++-- MoviaBox/Libs/Login/SPLoginManager.swift | 107 +++++++++++++++--- MoviaBox/Libs/Login/SPThirdSignModel.swift | 22 ++-- MoviaBox/Libs/User/SPUserInfo.swift | 5 +- MoviaBox/Source/en.lproj/Localizable.strings | 3 + 27 files changed, 334 insertions(+), 83 deletions(-) diff --git a/MoviaBox/AppDelegate/AppDelegate+OpenApp.swift b/MoviaBox/AppDelegate/AppDelegate+OpenApp.swift index 882556c..624f758 100644 --- a/MoviaBox/AppDelegate/AppDelegate+OpenApp.swift +++ b/MoviaBox/AppDelegate/AppDelegate+OpenApp.swift @@ -16,7 +16,7 @@ extension AppDelegate { center.requestAuthorization(options: [.badge, .sound, .alert]) { grant, error in if grant { - SPRewardsAPI.requestUploadOpenNotify(completer: nil) +// SPRewardsAPI.requestUploadOpenNotify(completer: nil) } } UIApplication.shared.registerForRemoteNotifications() diff --git a/MoviaBox/AppDelegate/AppDelegate.swift b/MoviaBox/AppDelegate/AppDelegate.swift index 8f5edb2..265b993 100644 --- a/MoviaBox/AppDelegate/AppDelegate.swift +++ b/MoviaBox/AppDelegate/AppDelegate.swift @@ -18,16 +18,17 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ///注册消息通知 registerAPNS() - SPLoginManager.manager.requestVisitorLogin(completer: nil) ///开启网络监控 -// SPNetworkReachabilityManager.manager.startMonitoring() + SPNetworkReachabilityManager.manager.startMonitoring() NotificationCenter.default.addObserver(self, selector: #selector(reachabilityDidChangeNotification), name: SPNetworkReachabilityManager.reachabilityDidChangeNotification, object: nil) - SPNetworkReachabilityManager.manager.startMonitoring() +// SPLoginManager.manager.requestVisitorLogin(completer: nil) + SPLoginManager.manager.updateUserInfo(completer: nil) + return true } @@ -48,7 +49,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { @objc private func reachabilityDidChangeNotification() { if SPNetworkReachabilityManager.manager.isReachable == true { - SPLoginManager.manager.requestVisitorLogin(completer: nil) +// SPLoginManager.manager.requestVisitorLogin(completer: nil) + SPLoginManager.manager.updateUserInfo(completer: nil) } } diff --git a/MoviaBox/Base/Controller/SPViewController.swift b/MoviaBox/Base/Controller/SPViewController.swift index 9568981..62dfc39 100644 --- a/MoviaBox/Base/Controller/SPViewController.swift +++ b/MoviaBox/Base/Controller/SPViewController.swift @@ -22,6 +22,7 @@ class SPViewController: UIViewController, JYPageChildContollerProtocol { private(set) var isViewDidLoad = false private(set) var isDidAppear = false + private(set) var hasViewDidAppear = false private(set) lazy var bgImageView: UIImageView = { let imageView = UIImageView(image: UIImage(named: "main_bg_image_01")) @@ -77,6 +78,7 @@ class SPViewController: UIViewController, JYPageChildContollerProtocol { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) isDidAppear = true + hasViewDidAppear = true } override func viewWillDisappear(_ animated: Bool) { diff --git a/MoviaBox/Base/Define/SPUserDefaultsKey.swift b/MoviaBox/Base/Define/SPUserDefaultsKey.swift index 9ae771d..c06ac19 100644 --- a/MoviaBox/Base/Define/SPUserDefaultsKey.swift +++ b/MoviaBox/Base/Define/SPUserDefaultsKey.swift @@ -9,6 +9,8 @@ import UIKit ///登录的用户信息 let kSPLoginTokenDefaultsKey = "kSPLoginTokenDefaultsKey" +///登录的用户信息 +let kSPLoginUserInfoDefaultsKey = "kSPLoginUserInfoDefaultsKey" ///首页搜索记录 let kSPHomeSearchHistoryDefaultsKey = "kSPHomeSearchHistoryDefaultsKey" diff --git a/MoviaBox/Base/Networking/API/SPRewardsAPI.swift b/MoviaBox/Base/Networking/API/SPRewardsAPI.swift index fe48dc5..b3c17f8 100644 --- a/MoviaBox/Base/Networking/API/SPRewardsAPI.swift +++ b/MoviaBox/Base/Networking/API/SPRewardsAPI.swift @@ -11,7 +11,7 @@ class SPRewardsAPI: NSObject { ///开启通知领金币 static func requestUploadOpenNotify(completer: ((_ finish: Bool) -> Void)?) { - let param = SPNetworkParameters(path: "openNotify") + let param = SPNetworkParameters(path: "/openNotify") SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in if response.code == SPNetworkCodeSucceed { diff --git a/MoviaBox/Base/Networking/API/SPUserAPI.swift b/MoviaBox/Base/Networking/API/SPUserAPI.swift index ed53265..9770ecf 100644 --- a/MoviaBox/Base/Networking/API/SPUserAPI.swift +++ b/MoviaBox/Base/Networking/API/SPUserAPI.swift @@ -20,34 +20,35 @@ class SPUserAPI: NSObject { } } - ///用户登录 - + ///第三方用户登录 + static func requestThirdLogin(model: SPThirdSignModel, completer: ((_ token: SPTokenModel?) -> Void)?) { + + var param = SPNetworkParameters(path: "/customer/login") + param.parameters = model.toDictionary() + + SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in + completer?(response.data) + } + + } ///退出登录 - static func requestSignout() { - var param = SPNetworkParameters(path: "customer/signout") + static func requestSignout(completer: ((_ token: SPTokenModel?) -> Void)?) { + var param = SPNetworkParameters(path: "/customer/signout") param.isLoding = true - SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in - if response.code == SPNetworkCodeSucceed { -// completer?(true) - } else { -// completer?(false) - } + SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in + completer?(response.data) } } ///注销账户 - static func requestLogoff(completer: ((_ isFinish: Bool) -> Void)?) { + static func requestLogoff(completer: ((_ token: SPTokenModel?) -> Void)?) { var param = SPNetworkParameters(path: "/customer/logoff") param.isLoding = true - SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in - if response.code == SPNetworkCodeSucceed { - completer?(true) - } else { - completer?(false) - } + SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in + completer?(response.data) } } diff --git a/MoviaBox/Base/WebView/SPWebViewController.swift b/MoviaBox/Base/WebView/SPWebViewController.swift index a00dbaa..274a40a 100644 --- a/MoviaBox/Base/WebView/SPWebViewController.swift +++ b/MoviaBox/Base/WebView/SPWebViewController.swift @@ -53,6 +53,10 @@ class SPWebViewController: SPViewController { self.webView.load(request) } + + func reload() { + self.webView.reload() + } } diff --git a/MoviaBox/Class/Home/Controller/SPHomeViewController.swift b/MoviaBox/Class/Home/Controller/SPHomeViewController.swift index 1f7140f..9ef122f 100644 --- a/MoviaBox/Class/Home/Controller/SPHomeViewController.swift +++ b/MoviaBox/Class/Home/Controller/SPHomeViewController.swift @@ -74,6 +74,13 @@ class SPHomeViewController: SPHomeChildController { self.navigationController?.setNavigationBarHidden(true, animated: true) } + override func viewDidAppear(_ animated: Bool) { + if hasViewDidAppear { + requestPlayHistory() + } + super.viewDidAppear(animated) + } + override func handleHeaderRefresh(_ completer: (() -> Void)?) { updateAllData { [weak self] in diff --git a/MoviaBox/Class/Login/Controller/SPLoginViewController.swift b/MoviaBox/Class/Login/Controller/SPLoginViewController.swift index 655cce5..2faf494 100644 --- a/MoviaBox/Class/Login/Controller/SPLoginViewController.swift +++ b/MoviaBox/Class/Login/Controller/SPLoginViewController.swift @@ -121,9 +121,15 @@ extension SPLoginViewController { } private func thirdLogin(type: SPLoginManager.LoginType) { - SPLoginManager.manager.thirdLogin(type: type, presentingViewController: self) + SPHUD.show() + SPLoginManager.manager.thirdLogin(type: type, presentingViewController: self) { [weak self] isFinish in + SPHUD.dismiss() + guard let self = self else { return } + if isFinish { + self.dismiss(animated: true) + } + } } - } extension SPLoginViewController { diff --git a/MoviaBox/Class/Mine/Controller/SPDeleteAccountViewController.swift b/MoviaBox/Class/Mine/Controller/SPDeleteAccountViewController.swift index c763c61..01c6905 100644 --- a/MoviaBox/Class/Mine/Controller/SPDeleteAccountViewController.swift +++ b/MoviaBox/Class/Mine/Controller/SPDeleteAccountViewController.swift @@ -95,9 +95,10 @@ extension SPDeleteAccountViewController { } @objc private func handleDeleteButton() { - SPUserAPI.requestLogoff { isFinish in - - + SPLoginManager.manager.deleteAccount { isFinish in + if isFinish { + self.navigationController?.popViewController(animated: true) + } } } diff --git a/MoviaBox/Class/Mine/Controller/SPMineViewController.swift b/MoviaBox/Class/Mine/Controller/SPMineViewController.swift index c2330d3..b98b8cf 100644 --- a/MoviaBox/Class/Mine/Controller/SPMineViewController.swift +++ b/MoviaBox/Class/Mine/Controller/SPMineViewController.swift @@ -28,6 +28,7 @@ class SPMineViewController: SPViewController { private lazy var headerView: SPMineHeaderView = { let view = SPMineHeaderView() view.frame = CGRect(x: 0, y: 0, width: kSPScreenWidth, height: view.contentHeight) + view.userInfo = SPLoginManager.manager.userInfo return view }() @@ -43,6 +44,7 @@ class SPMineViewController: SPViewController { override func viewDidLoad() { super.viewDidLoad() setBackgroundView(isShowGradient: false) + requestData() _setupUI() @@ -142,11 +144,8 @@ extension SPMineViewController { ///获取用户信息 private func requestUserInfo() { - SPUserAPI.requestUserInfo { [weak self] userInfo in - guard let self = self else { return } - if let userInfo = userInfo { - self.headerView.userInfo = userInfo - } + SPLoginManager.manager.updateUserInfo { [weak self] in + self?.headerView.userInfo = SPLoginManager.manager.userInfo } } ///获取播放记录 diff --git a/MoviaBox/Class/Mine/Controller/SPSettingsViewController.swift b/MoviaBox/Class/Mine/Controller/SPSettingsViewController.swift index b3ae676..ee99ea8 100644 --- a/MoviaBox/Class/Mine/Controller/SPSettingsViewController.swift +++ b/MoviaBox/Class/Mine/Controller/SPSettingsViewController.swift @@ -48,6 +48,11 @@ class SPSettingsViewController: SPViewController { self.setNavigationNormalStyle() } + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + self.dataArr = self.createDataArr() + } + } @@ -103,15 +108,16 @@ extension SPSettingsViewController: UITableViewDelegate, UITableViewDataSource { let vc = SPDeleteAccountViewController() self.navigationController?.pushViewController(vc, animated: true) + case .logout: + logout() + default: break } } - } - extension SPSettingsViewController { private func clearCache() { @@ -120,15 +126,35 @@ extension SPSettingsViewController { self.dataArr = self.createDataArr() } } + ///退出登录 + private func logout() { + let alert = UIAlertController(title: nil, message: "Confirm logout?".localized, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "Affirm".localized, style: .default, handler: { _ in + SPLoginManager.manager.logout { [weak self] isFinish in + guard let self = self else { return } + self.dataArr = self.createDataArr() + } + })) + + alert.addAction(UIAlertAction(title: "Cancel".localized, style: .cancel)) + + self.present(alert, animated: true) + } private func createDataArr() -> [SPMineItem] { let cache = SPAppCacheManager.manager.allCache - let arr = [ + var arr = [ SPMineItem(type: .clearCache, title: "Clear Cache".localized, subtitle: SPAppCacheManager.cacheToString(cache: cache)), SPMineItem(type: .aboutUs, title: "About Us".localized), - SPMineItem(type: .deleteAccount, title: "Delete Account".localized), ] + + if SPLoginManager.manager.isLogin { + arr.append(SPMineItem(type: .deleteAccount, title: "Delete Account".localized)) + arr.append(SPMineItem(type: .logout, title: "Signout".localized)) + } + + return arr } } diff --git a/MoviaBox/Class/Mine/Model/SPMineItem.swift b/MoviaBox/Class/Mine/Model/SPMineItem.swift index 17654e1..d25f3c4 100644 --- a/MoviaBox/Class/Mine/Model/SPMineItem.swift +++ b/MoviaBox/Class/Mine/Model/SPMineItem.swift @@ -41,6 +41,8 @@ struct SPMineItem { case clearCache ///注销账户 case deleteAccount + ///退出登录 + case logout } diff --git a/MoviaBox/Class/Mine/View/SPMineHeaderView.swift b/MoviaBox/Class/Mine/View/SPMineHeaderView.swift index e8ab207..d581ef7 100644 --- a/MoviaBox/Class/Mine/View/SPMineHeaderView.swift +++ b/MoviaBox/Class/Mine/View/SPMineHeaderView.swift @@ -43,6 +43,12 @@ class SPMineHeaderView: UIView { nicknameLabel.text = "Vistor" } idLabel.text = "ID \(userInfo?.customer_id ?? "")" + + loginButton.isHidden = !(userInfo?.is_tourist ?? true) + + memberView.userInfo = self.userInfo + + walletView.userInfo = self.userInfo } } diff --git a/MoviaBox/Class/Mine/View/SPMineMemberNoView.swift b/MoviaBox/Class/Mine/View/SPMineMemberNoView.swift index a231df6..f8370a4 100644 --- a/MoviaBox/Class/Mine/View/SPMineMemberNoView.swift +++ b/MoviaBox/Class/Mine/View/SPMineMemberNoView.swift @@ -36,6 +36,7 @@ class SPMineMemberNoView: UIView { button.layer.borderWidth = 1 button.layer.borderColor = UIColor.colorFFD791().cgColor button.backgroundColor = .color262014() + button.addTarget(self, action: #selector(handleActivateButton), for: .touchUpInside) return button }() @@ -67,6 +68,14 @@ class SPMineMemberNoView: UIView { } +extension SPMineMemberNoView { + + @objc private func handleActivateButton() { + let vc = SPStoreViewController() + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } +} + extension SPMineMemberNoView { private func _setupUI() { @@ -78,7 +87,7 @@ extension SPMineMemberNoView { iconImageView.snp.makeConstraints { make in make.left.equalToSuperview().offset(12) - make.top.equalToSuperview().offset(15) + make.top.equalToSuperview().offset(kSPMainW(25)) } titleLabel.snp.makeConstraints { make in @@ -89,13 +98,13 @@ extension SPMineMemberNoView { activateButton.snp.makeConstraints { make in make.right.equalToSuperview().offset(-18) - make.bottom.equalToSuperview().offset(-14) + make.bottom.equalToSuperview().offset(-kSPMainW(14)) make.height.equalTo(28) } textLabel1.snp.makeConstraints { make in make.left.equalToSuperview().offset(12) - make.bottom.equalTo(textLabel2.snp.top).offset(-kSPMainW(5)) + make.bottom.equalTo(textLabel2.snp.top).offset(-kSPMainW(8)) } textLabel2.snp.makeConstraints { make in diff --git a/MoviaBox/Class/Mine/View/SPMineMemberView.swift b/MoviaBox/Class/Mine/View/SPMineMemberView.swift index fce8ffa..2ac41b8 100644 --- a/MoviaBox/Class/Mine/View/SPMineMemberView.swift +++ b/MoviaBox/Class/Mine/View/SPMineMemberView.swift @@ -25,11 +25,25 @@ class SPMineMemberView: UIView { } } + var userInfo: SPUserInfo? { + didSet { + if userInfo?.is_vip == true { + yesView.isHidden = false + noView.isHidden = true + bgImageView.image = UIImage(named: "member_bg_image_02") + } else { + yesView.isHidden = true + noView.isHidden = false + bgImageView.image = UIImage(named: "member_bg_image_01") + } + invalidateIntrinsicContentSize() + } + } + //MARK: UI属性 private lazy var bgImageView: UIImageView = { let imageView = UIImageView() -// imageView.image = UIImage(named: "member_bg_image_01") - imageView.image = UIImage(named: "member_bg_image_02") + imageView.image = UIImage(named: "member_bg_image_01") imageView.contentMode = .scaleToFill return imageView }() diff --git a/MoviaBox/Class/Mine/View/SPMineWalletView.swift b/MoviaBox/Class/Mine/View/SPMineWalletView.swift index 0213a0c..f0b8d5b 100644 --- a/MoviaBox/Class/Mine/View/SPMineWalletView.swift +++ b/MoviaBox/Class/Mine/View/SPMineWalletView.swift @@ -13,6 +13,13 @@ class SPMineWalletView: UIView { return .init(width: kSPScreenWidth, height: 119) } + var userInfo: SPUserInfo? { + didSet { + coinButton.setTitle("\(userInfo?.coin_left_total ?? 0)", for: .normal) + sendCoinButton.setTitle("\(userInfo?.send_coin_left_total ?? 0)", for: .normal) + } + } + //MARK: UI属性 private lazy var bgView: UIView = { let view = UIView() @@ -67,7 +74,7 @@ class SPMineWalletView: UIView { return button }() ///赠送的金币 - private lazy var complimentaryCoinButton: UIButton = { + private lazy var sendCoinButton: UIButton = { let button = JXButton(type: .custom) button.isUserInteractionEnabled = false button.setImage(UIImage(named: "coin_icon_02"), for: .normal) @@ -81,7 +88,7 @@ class SPMineWalletView: UIView { override init(frame: CGRect) { super.init(frame: frame) coinButton.setTitle("0", for: .normal) - complimentaryCoinButton.setTitle("0", for: .normal) + sendCoinButton.setTitle("0", for: .normal) _setupUI() @@ -114,7 +121,7 @@ extension SPMineWalletView { bgView.addSubview(lineView) bgView.addSubview(storeButton) bgView.addSubview(coinButton) - bgView.addSubview(complimentaryCoinButton) + bgView.addSubview(sendCoinButton) bgView.snp.makeConstraints { make in make.left.equalToSuperview().offset(16) @@ -155,7 +162,7 @@ extension SPMineWalletView { make.centerY.equalTo(storeButton) } - complimentaryCoinButton.snp.makeConstraints { make in + sendCoinButton.snp.makeConstraints { make in make.left.equalTo(coinButton.snp.right).offset(10) make.centerY.equalTo(storeButton) } diff --git a/MoviaBox/Class/MyList/Controller/SPCollectListViewController.swift b/MoviaBox/Class/MyList/Controller/SPCollectListViewController.swift index 4390f1d..efbaca2 100644 --- a/MoviaBox/Class/MyList/Controller/SPCollectListViewController.swift +++ b/MoviaBox/Class/MyList/Controller/SPCollectListViewController.swift @@ -53,6 +53,13 @@ class SPCollectListViewController: SPMyListChildViewController { _setupUI() } + override func viewDidAppear(_ animated: Bool) { + if hasViewDidAppear { + requestDataList(page: 1, completer: nil) + } + super.viewDidAppear(animated) + + } override func handleHeaderRefresh(_ completer: (() -> Void)?) { diff --git a/MoviaBox/Class/MyList/Controller/SPPlayHistoryViewController.swift b/MoviaBox/Class/MyList/Controller/SPPlayHistoryViewController.swift index 6ca2607..0334948 100644 --- a/MoviaBox/Class/MyList/Controller/SPPlayHistoryViewController.swift +++ b/MoviaBox/Class/MyList/Controller/SPPlayHistoryViewController.swift @@ -53,6 +53,12 @@ class SPPlayHistoryViewController: SPMyListChildViewController { _setupUI() } + override func viewDidAppear(_ animated: Bool) { + if hasViewDidAppear { + requestDataList(page: 1, completer: nil) + } + super.viewDidAppear(animated) + } override func handleHeaderRefresh(_ completer: (() -> Void)?) { diff --git a/MoviaBox/Class/Rewards/Controller/SPRewardsViewController.swift b/MoviaBox/Class/Rewards/Controller/SPRewardsViewController.swift index bbd1f22..7d03844 100644 --- a/MoviaBox/Class/Rewards/Controller/SPRewardsViewController.swift +++ b/MoviaBox/Class/Rewards/Controller/SPRewardsViewController.swift @@ -13,7 +13,8 @@ class SPRewardsViewController: SPCampaignWebViewController { self.urlStr = SPRewardsWebUrl super.viewDidLoad() - + + NotificationCenter.default.addObserver(self, selector: #selector(loginStateDidChangeNotification), name: SPLoginManager.loginStateDidChangeNotification, object: nil) } @@ -21,3 +22,10 @@ class SPRewardsViewController: SPCampaignWebViewController { } + +extension SPRewardsViewController { + + @objc private func loginStateDidChangeNotification() { + self.reload() + } +} diff --git a/MoviaBox/Class/Wallet/Controller/SPWalletViewController.swift b/MoviaBox/Class/Wallet/Controller/SPWalletViewController.swift index 7c21c69..c51654d 100644 --- a/MoviaBox/Class/Wallet/Controller/SPWalletViewController.swift +++ b/MoviaBox/Class/Wallet/Controller/SPWalletViewController.swift @@ -32,6 +32,7 @@ class SPWalletViewController: SPViewController { private lazy var headerView: SPWalletHeaderView = { let view = SPWalletHeaderView(frame: .init(x: 0, y: 0, width: kSPScreenWidth, height: 152)) + view.userInfo = SPLoginManager.manager.userInfo return view }() diff --git a/MoviaBox/Class/Wallet/View/SPWalletHeaderView.swift b/MoviaBox/Class/Wallet/View/SPWalletHeaderView.swift index e38cd5d..8aafa4c 100644 --- a/MoviaBox/Class/Wallet/View/SPWalletHeaderView.swift +++ b/MoviaBox/Class/Wallet/View/SPWalletHeaderView.swift @@ -8,6 +8,12 @@ import UIKit class SPWalletHeaderView: UIView { + + var userInfo: SPUserInfo? { + didSet { + contentView.userInfo = userInfo + } + } //MARK: UI属性 private lazy var contentView: SPMineWalletView = { diff --git a/MoviaBox/Libs/Login/SPLoginManager+Apple.swift b/MoviaBox/Libs/Login/SPLoginManager+Apple.swift index 8d0f2fb..5863a49 100644 --- a/MoviaBox/Libs/Login/SPLoginManager+Apple.swift +++ b/MoviaBox/Libs/Login/SPLoginManager+Apple.swift @@ -10,10 +10,23 @@ import AuthenticationServices extension SPLoginManager { + private struct AssociatedKeys { + static var signAppleHandle: Int? + } + + private var signAppleHandle: ((_ model: SPThirdSignModel?) -> Void)? { + set { + objc_setAssociatedObject(self, &AssociatedKeys.signAppleHandle, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC) + } + get { + return objc_getAssociatedObject(self, &AssociatedKeys.signAppleHandle) as? ((_ model: SPThirdSignModel?) -> Void) + } + } + ///苹果登录 func appleSignLogin(completer: ((_ model: SPThirdSignModel?) -> Void)?) { - // self.signAppleHandle = completer + self.signAppleHandle = completer let appleIDProvider = ASAuthorizationAppleIDProvider() let request = appleIDProvider.createRequest() @@ -36,27 +49,29 @@ extension SPLoginManager: ASAuthorizationControllerDelegate { let fullName = appleIDCredential.fullName let email = appleIDCredential.email + let identityToken = appleIDCredential.identityToken.flatMap { String(data: $0, encoding: .utf8) } + let identityTokenParams = self.jwtDecode(jwtStr: identityToken ?? "") + + let model = SPThirdSignModel() - model.userID = userIdentifier - model.givenName = fullName?.givenName - model.familyName = fullName?.familyName - model.name = fullName?.nickname - model.email = email + model.platform = .apple + model.third_id = userIdentifier + model.giving_name = fullName?.givenName + model.family_name = fullName?.familyName + model.avator = identityTokenParams?["picture"] as? String + model.email = identityTokenParams?["email"] as? String + spLog(message: userIdentifier) spLog(message: fullName) spLog(message: email) -// if let signAppleHandle = signAppleHandle { -// signAppleHandle(model) -// } + signAppleHandle?(model) } } func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { -// if let signAppleHandle = signAppleHandle { -// signAppleHandle(nil) -// } + signAppleHandle?(nil) } } @@ -68,3 +83,34 @@ extension SPLoginManager: ASAuthorizationControllerPresentationContextProviding } } + +extension SPLoginManager { + + private func jwtDecode(jwtStr: String) -> [String: Any]? { + let segments = jwtStr.components(separatedBy: ".") + guard segments.count > 1 else { return nil } + + var base64String = segments[1] + + // 处理 Base64 补齐 + let requiredLength = 4 * Int(ceil(Double(base64String.count) / 4.0)) + let paddingLength = requiredLength - base64String.count + if paddingLength > 0 { + base64String += String(repeating: "=", count: paddingLength) + } + + // 替换 URL 安全字符 + base64String = base64String.replacingOccurrences(of: "-", with: "+") + base64String = base64String.replacingOccurrences(of: "_", with: "/") + + // 解码 Base64 数据 + guard let data = Data(base64Encoded: base64String), + let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []), + let payload = jsonObject as? [String: Any] else { + return nil + } + + return payload + } + +} diff --git a/MoviaBox/Libs/Login/SPLoginManager.swift b/MoviaBox/Libs/Login/SPLoginManager.swift index 18d16b4..748059b 100644 --- a/MoviaBox/Libs/Login/SPLoginManager.swift +++ b/MoviaBox/Libs/Login/SPLoginManager.swift @@ -6,18 +6,26 @@ // import UIKit +import SmartCodable class SPLoginManager: NSObject { - enum LoginType: Int { - case apple - case faceBook - + 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 @@ -25,15 +33,15 @@ class SPLoginManager: NSObject { 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 - return false + if !isLogin { + openLoginVC() + } + return isLogin } func openLoginVC() { @@ -50,16 +58,60 @@ class SPLoginManager: NSObject { } ///第三方登录 - func thirdLogin(type: LoginType, presentingViewController: UIViewController) { - + func thirdLogin(type: LoginType, presentingViewController: UIViewController, completer: ((_ isFinish: Bool) -> Void)?) { switch type { case .apple: - appleSignLogin { model in - + appleSignLogin { [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] 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 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?() + } } @@ -79,7 +131,36 @@ extension SPLoginManager { 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") + +} diff --git a/MoviaBox/Libs/Login/SPThirdSignModel.swift b/MoviaBox/Libs/Login/SPThirdSignModel.swift index d9db228..6f3cac3 100644 --- a/MoviaBox/Libs/Login/SPThirdSignModel.swift +++ b/MoviaBox/Libs/Login/SPThirdSignModel.swift @@ -6,19 +6,23 @@ // import UIKit +import SmartCodable -class SPThirdSignModel: NSObject { +class SPThirdSignModel: SPModel, SmartCodable { - var token: String? - var userID: String? + var third_id: String? var email: String? - var name: String? - //姓 - var familyName: String? - //名 - var givenName: String? - var avatar: String? +// var token: String? +// var name: String? + //姓 + var family_name: String? + //名 + var giving_name: String? + + var avator: String? + + var platform: SPLoginManager.LoginType? } diff --git a/MoviaBox/Libs/User/SPUserInfo.swift b/MoviaBox/Libs/User/SPUserInfo.swift index 9c80be8..3884280 100644 --- a/MoviaBox/Libs/User/SPUserInfo.swift +++ b/MoviaBox/Libs/User/SPUserInfo.swift @@ -14,20 +14,21 @@ class SPUserInfo: SPModel, SmartCodable, NSSecureCoding { var id: String? var customer_id: String? var is_guide_vip: String? - var is_tourist: String? + ///是否为游客登录 + var is_tourist: Bool? var family_name: String? var giving_name: String? var vip_end_time: String? var third_access_id: String? var is_vip: Bool? var coin_left_total: Int? + var send_coin_left_total: Int? var vip_type: String? var email: String? var third_access_platform: String? var ip_address: String? var country_code: String? var user_level: String? - var send_coin_left_total: String? var avator: String? var sign_in_status: String? var registered_days: String? diff --git a/MoviaBox/Source/en.lproj/Localizable.strings b/MoviaBox/Source/en.lproj/Localizable.strings index 1f903da..b3f5258 100644 --- a/MoviaBox/Source/en.lproj/Localizable.strings +++ b/MoviaBox/Source/en.lproj/Localizable.strings @@ -29,6 +29,7 @@ "My list" = "My list"; "Watch list" = "Watch list"; "Recently viewed" = "Recently viewed"; +"Affirm" = "Affirm"; "Cancel" = "Cancel"; "Select All" = "Select All"; "Delet (%@)" = "Delet (%@)"; @@ -75,6 +76,8 @@ "Order Records" = "Order Records"; "Coin Record" = "Coin Record"; "VIP Record" = "VIP Record"; +"Signout" = "Signout"; +"Confirm logout?" = "Confirm logout?"; "kLoginAgreementText" = "By continuing, you agree to the User Agreement and Privacy Policy";