登录注销逻辑处理

This commit is contained in:
zeng 2025-04-30 11:16:51 +08:00
parent 538c5a5a86
commit 9a26c4ac7f
27 changed files with 334 additions and 83 deletions

View File

@ -16,7 +16,7 @@ extension AppDelegate {
center.requestAuthorization(options: [.badge, .sound, .alert]) { grant, error in center.requestAuthorization(options: [.badge, .sound, .alert]) { grant, error in
if grant { if grant {
SPRewardsAPI.requestUploadOpenNotify(completer: nil) // SPRewardsAPI.requestUploadOpenNotify(completer: nil)
} }
} }
UIApplication.shared.registerForRemoteNotifications() UIApplication.shared.registerForRemoteNotifications()

View File

@ -18,16 +18,17 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
/// ///
registerAPNS() registerAPNS()
SPLoginManager.manager.requestVisitorLogin(completer: nil)
/// ///
// SPNetworkReachabilityManager.manager.startMonitoring() SPNetworkReachabilityManager.manager.startMonitoring()
NotificationCenter.default.addObserver(self, selector: #selector(reachabilityDidChangeNotification), name: SPNetworkReachabilityManager.reachabilityDidChangeNotification, object: nil) 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 return true
} }
@ -48,7 +49,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
@objc private func reachabilityDidChangeNotification() { @objc private func reachabilityDidChangeNotification() {
if SPNetworkReachabilityManager.manager.isReachable == true { if SPNetworkReachabilityManager.manager.isReachable == true {
SPLoginManager.manager.requestVisitorLogin(completer: nil) // SPLoginManager.manager.requestVisitorLogin(completer: nil)
SPLoginManager.manager.updateUserInfo(completer: nil)
} }
} }

View File

@ -22,6 +22,7 @@ class SPViewController: UIViewController, JYPageChildContollerProtocol {
private(set) var isViewDidLoad = false private(set) var isViewDidLoad = false
private(set) var isDidAppear = false private(set) var isDidAppear = false
private(set) var hasViewDidAppear = false
private(set) lazy var bgImageView: UIImageView = { private(set) lazy var bgImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "main_bg_image_01")) let imageView = UIImageView(image: UIImage(named: "main_bg_image_01"))
@ -77,6 +78,7 @@ class SPViewController: UIViewController, JYPageChildContollerProtocol {
override func viewDidAppear(_ animated: Bool) { override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated) super.viewDidAppear(animated)
isDidAppear = true isDidAppear = true
hasViewDidAppear = true
} }
override func viewWillDisappear(_ animated: Bool) { override func viewWillDisappear(_ animated: Bool) {

View File

@ -9,6 +9,8 @@ import UIKit
/// ///
let kSPLoginTokenDefaultsKey = "kSPLoginTokenDefaultsKey" let kSPLoginTokenDefaultsKey = "kSPLoginTokenDefaultsKey"
///
let kSPLoginUserInfoDefaultsKey = "kSPLoginUserInfoDefaultsKey"
/// ///
let kSPHomeSearchHistoryDefaultsKey = "kSPHomeSearchHistoryDefaultsKey" let kSPHomeSearchHistoryDefaultsKey = "kSPHomeSearchHistoryDefaultsKey"

View File

@ -11,7 +11,7 @@ class SPRewardsAPI: NSObject {
/// ///
static func requestUploadOpenNotify(completer: ((_ finish: Bool) -> Void)?) { static func requestUploadOpenNotify(completer: ((_ finish: Bool) -> Void)?) {
let param = SPNetworkParameters(path: "openNotify") let param = SPNetworkParameters(path: "/openNotify")
SPNetwork.request(parameters: param) { (response: SPNetworkResponse<String>) in SPNetwork.request(parameters: param) { (response: SPNetworkResponse<String>) in
if response.code == SPNetworkCodeSucceed { if response.code == SPNetworkCodeSucceed {

View File

@ -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<SPTokenModel>) in
completer?(response.data)
}
}
///退 ///退
static func requestSignout() { static func requestSignout(completer: ((_ token: SPTokenModel?) -> Void)?) {
var param = SPNetworkParameters(path: "customer/signout") var param = SPNetworkParameters(path: "/customer/signout")
param.isLoding = true param.isLoding = true
SPNetwork.request(parameters: param) { (response: SPNetworkResponse<SPUserInfo>) in SPNetwork.request(parameters: param) { (response: SPNetworkResponse<SPTokenModel>) in
if response.code == SPNetworkCodeSucceed { completer?(response.data)
// completer?(true)
} else {
// completer?(false)
}
} }
} }
/// ///
static func requestLogoff(completer: ((_ isFinish: Bool) -> Void)?) { static func requestLogoff(completer: ((_ token: SPTokenModel?) -> Void)?) {
var param = SPNetworkParameters(path: "/customer/logoff") var param = SPNetworkParameters(path: "/customer/logoff")
param.isLoding = true param.isLoding = true
SPNetwork.request(parameters: param) { (response: SPNetworkResponse<SPUserInfo>) in SPNetwork.request(parameters: param) { (response: SPNetworkResponse<SPTokenModel>) in
if response.code == SPNetworkCodeSucceed { completer?(response.data)
completer?(true)
} else {
completer?(false)
}
} }
} }

View File

@ -54,6 +54,10 @@ class SPWebViewController: SPViewController {
self.webView.load(request) self.webView.load(request)
} }
func reload() {
self.webView.reload()
}
} }
extension SPWebViewController { extension SPWebViewController {

View File

@ -74,6 +74,13 @@ class SPHomeViewController: SPHomeChildController {
self.navigationController?.setNavigationBarHidden(true, animated: true) self.navigationController?.setNavigationBarHidden(true, animated: true)
} }
override func viewDidAppear(_ animated: Bool) {
if hasViewDidAppear {
requestPlayHistory()
}
super.viewDidAppear(animated)
}
override func handleHeaderRefresh(_ completer: (() -> Void)?) { override func handleHeaderRefresh(_ completer: (() -> Void)?) {
updateAllData { [weak self] in updateAllData { [weak self] in

View File

@ -121,9 +121,15 @@ extension SPLoginViewController {
} }
private func thirdLogin(type: SPLoginManager.LoginType) { 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 { extension SPLoginViewController {

View File

@ -95,9 +95,10 @@ extension SPDeleteAccountViewController {
} }
@objc private func handleDeleteButton() { @objc private func handleDeleteButton() {
SPUserAPI.requestLogoff { isFinish in SPLoginManager.manager.deleteAccount { isFinish in
if isFinish {
self.navigationController?.popViewController(animated: true)
}
} }
} }

View File

@ -28,6 +28,7 @@ class SPMineViewController: SPViewController {
private lazy var headerView: SPMineHeaderView = { private lazy var headerView: SPMineHeaderView = {
let view = SPMineHeaderView() let view = SPMineHeaderView()
view.frame = CGRect(x: 0, y: 0, width: kSPScreenWidth, height: view.contentHeight) view.frame = CGRect(x: 0, y: 0, width: kSPScreenWidth, height: view.contentHeight)
view.userInfo = SPLoginManager.manager.userInfo
return view return view
}() }()
@ -43,6 +44,7 @@ class SPMineViewController: SPViewController {
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
setBackgroundView(isShowGradient: false) setBackgroundView(isShowGradient: false)
requestData() requestData()
_setupUI() _setupUI()
@ -142,11 +144,8 @@ extension SPMineViewController {
/// ///
private func requestUserInfo() { private func requestUserInfo() {
SPUserAPI.requestUserInfo { [weak self] userInfo in SPLoginManager.manager.updateUserInfo { [weak self] in
guard let self = self else { return } self?.headerView.userInfo = SPLoginManager.manager.userInfo
if let userInfo = userInfo {
self.headerView.userInfo = userInfo
}
} }
} }
/// ///

View File

@ -48,6 +48,11 @@ class SPSettingsViewController: SPViewController {
self.setNavigationNormalStyle() 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() let vc = SPDeleteAccountViewController()
self.navigationController?.pushViewController(vc, animated: true) self.navigationController?.pushViewController(vc, animated: true)
case .logout:
logout()
default: default:
break break
} }
} }
} }
extension SPSettingsViewController { extension SPSettingsViewController {
private func clearCache() { private func clearCache() {
@ -120,15 +126,35 @@ extension SPSettingsViewController {
self.dataArr = self.createDataArr() 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] { private func createDataArr() -> [SPMineItem] {
let cache = SPAppCacheManager.manager.allCache let cache = SPAppCacheManager.manager.allCache
let arr = [ var arr = [
SPMineItem(type: .clearCache, title: "Clear Cache".localized, subtitle: SPAppCacheManager.cacheToString(cache: cache)), SPMineItem(type: .clearCache, title: "Clear Cache".localized, subtitle: SPAppCacheManager.cacheToString(cache: cache)),
SPMineItem(type: .aboutUs, title: "About Us".localized), 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 return arr
} }
} }

View File

@ -41,6 +41,8 @@ struct SPMineItem {
case clearCache case clearCache
/// ///
case deleteAccount case deleteAccount
///退
case logout
} }

View File

@ -43,6 +43,12 @@ class SPMineHeaderView: UIView {
nicknameLabel.text = "Vistor" nicknameLabel.text = "Vistor"
} }
idLabel.text = "ID \(userInfo?.customer_id ?? "")" idLabel.text = "ID \(userInfo?.customer_id ?? "")"
loginButton.isHidden = !(userInfo?.is_tourist ?? true)
memberView.userInfo = self.userInfo
walletView.userInfo = self.userInfo
} }
} }

View File

@ -36,6 +36,7 @@ class SPMineMemberNoView: UIView {
button.layer.borderWidth = 1 button.layer.borderWidth = 1
button.layer.borderColor = UIColor.colorFFD791().cgColor button.layer.borderColor = UIColor.colorFFD791().cgColor
button.backgroundColor = .color262014() button.backgroundColor = .color262014()
button.addTarget(self, action: #selector(handleActivateButton), for: .touchUpInside)
return button 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 { extension SPMineMemberNoView {
private func _setupUI() { private func _setupUI() {
@ -78,7 +87,7 @@ extension SPMineMemberNoView {
iconImageView.snp.makeConstraints { make in iconImageView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(12) make.left.equalToSuperview().offset(12)
make.top.equalToSuperview().offset(15) make.top.equalToSuperview().offset(kSPMainW(25))
} }
titleLabel.snp.makeConstraints { make in titleLabel.snp.makeConstraints { make in
@ -89,13 +98,13 @@ extension SPMineMemberNoView {
activateButton.snp.makeConstraints { make in activateButton.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-18) make.right.equalToSuperview().offset(-18)
make.bottom.equalToSuperview().offset(-14) make.bottom.equalToSuperview().offset(-kSPMainW(14))
make.height.equalTo(28) make.height.equalTo(28)
} }
textLabel1.snp.makeConstraints { make in textLabel1.snp.makeConstraints { make in
make.left.equalToSuperview().offset(12) 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 textLabel2.snp.makeConstraints { make in

View File

@ -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 //MARK: UI
private lazy var bgImageView: UIImageView = { private lazy var bgImageView: UIImageView = {
let imageView = UIImageView() let imageView = UIImageView()
// imageView.image = UIImage(named: "member_bg_image_01") imageView.image = UIImage(named: "member_bg_image_01")
imageView.image = UIImage(named: "member_bg_image_02")
imageView.contentMode = .scaleToFill imageView.contentMode = .scaleToFill
return imageView return imageView
}() }()

View File

@ -13,6 +13,13 @@ class SPMineWalletView: UIView {
return .init(width: kSPScreenWidth, height: 119) 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 //MARK: UI
private lazy var bgView: UIView = { private lazy var bgView: UIView = {
let view = UIView() let view = UIView()
@ -67,7 +74,7 @@ class SPMineWalletView: UIView {
return button return button
}() }()
/// ///
private lazy var complimentaryCoinButton: UIButton = { private lazy var sendCoinButton: UIButton = {
let button = JXButton(type: .custom) let button = JXButton(type: .custom)
button.isUserInteractionEnabled = false button.isUserInteractionEnabled = false
button.setImage(UIImage(named: "coin_icon_02"), for: .normal) button.setImage(UIImage(named: "coin_icon_02"), for: .normal)
@ -81,7 +88,7 @@ class SPMineWalletView: UIView {
override init(frame: CGRect) { override init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
coinButton.setTitle("0", for: .normal) coinButton.setTitle("0", for: .normal)
complimentaryCoinButton.setTitle("0", for: .normal) sendCoinButton.setTitle("0", for: .normal)
_setupUI() _setupUI()
@ -114,7 +121,7 @@ extension SPMineWalletView {
bgView.addSubview(lineView) bgView.addSubview(lineView)
bgView.addSubview(storeButton) bgView.addSubview(storeButton)
bgView.addSubview(coinButton) bgView.addSubview(coinButton)
bgView.addSubview(complimentaryCoinButton) bgView.addSubview(sendCoinButton)
bgView.snp.makeConstraints { make in bgView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(16) make.left.equalToSuperview().offset(16)
@ -155,7 +162,7 @@ extension SPMineWalletView {
make.centerY.equalTo(storeButton) make.centerY.equalTo(storeButton)
} }
complimentaryCoinButton.snp.makeConstraints { make in sendCoinButton.snp.makeConstraints { make in
make.left.equalTo(coinButton.snp.right).offset(10) make.left.equalTo(coinButton.snp.right).offset(10)
make.centerY.equalTo(storeButton) make.centerY.equalTo(storeButton)
} }

View File

@ -53,6 +53,13 @@ class SPCollectListViewController: SPMyListChildViewController {
_setupUI() _setupUI()
} }
override func viewDidAppear(_ animated: Bool) {
if hasViewDidAppear {
requestDataList(page: 1, completer: nil)
}
super.viewDidAppear(animated)
}
override func handleHeaderRefresh(_ completer: (() -> Void)?) { override func handleHeaderRefresh(_ completer: (() -> Void)?) {

View File

@ -53,6 +53,12 @@ class SPPlayHistoryViewController: SPMyListChildViewController {
_setupUI() _setupUI()
} }
override func viewDidAppear(_ animated: Bool) {
if hasViewDidAppear {
requestDataList(page: 1, completer: nil)
}
super.viewDidAppear(animated)
}
override func handleHeaderRefresh(_ completer: (() -> Void)?) { override func handleHeaderRefresh(_ completer: (() -> Void)?) {

View File

@ -14,6 +14,7 @@ class SPRewardsViewController: SPCampaignWebViewController {
super.viewDidLoad() 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()
}
}

View File

@ -32,6 +32,7 @@ class SPWalletViewController: SPViewController {
private lazy var headerView: SPWalletHeaderView = { private lazy var headerView: SPWalletHeaderView = {
let view = SPWalletHeaderView(frame: .init(x: 0, y: 0, width: kSPScreenWidth, height: 152)) let view = SPWalletHeaderView(frame: .init(x: 0, y: 0, width: kSPScreenWidth, height: 152))
view.userInfo = SPLoginManager.manager.userInfo
return view return view
}() }()

View File

@ -9,6 +9,12 @@ import UIKit
class SPWalletHeaderView: UIView { class SPWalletHeaderView: UIView {
var userInfo: SPUserInfo? {
didSet {
contentView.userInfo = userInfo
}
}
//MARK: UI //MARK: UI
private lazy var contentView: SPMineWalletView = { private lazy var contentView: SPMineWalletView = {
let view = SPMineWalletView() let view = SPMineWalletView()

View File

@ -10,10 +10,23 @@ import AuthenticationServices
extension SPLoginManager { 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)?) { func appleSignLogin(completer: ((_ model: SPThirdSignModel?) -> Void)?) {
// self.signAppleHandle = completer self.signAppleHandle = completer
let appleIDProvider = ASAuthorizationAppleIDProvider() let appleIDProvider = ASAuthorizationAppleIDProvider()
let request = appleIDProvider.createRequest() let request = appleIDProvider.createRequest()
@ -36,27 +49,29 @@ extension SPLoginManager: ASAuthorizationControllerDelegate {
let fullName = appleIDCredential.fullName let fullName = appleIDCredential.fullName
let email = appleIDCredential.email let email = appleIDCredential.email
let identityToken = appleIDCredential.identityToken.flatMap { String(data: $0, encoding: .utf8) }
let identityTokenParams = self.jwtDecode(jwtStr: identityToken ?? "")
let model = SPThirdSignModel() let model = SPThirdSignModel()
model.userID = userIdentifier model.platform = .apple
model.givenName = fullName?.givenName model.third_id = userIdentifier
model.familyName = fullName?.familyName model.giving_name = fullName?.givenName
model.name = fullName?.nickname model.family_name = fullName?.familyName
model.email = email model.avator = identityTokenParams?["picture"] as? String
model.email = identityTokenParams?["email"] as? String
spLog(message: userIdentifier) spLog(message: userIdentifier)
spLog(message: fullName) spLog(message: fullName)
spLog(message: email) spLog(message: email)
// if let signAppleHandle = signAppleHandle { signAppleHandle?(model)
// signAppleHandle(model)
// }
} }
} }
func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { 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
}
}

View File

@ -6,18 +6,26 @@
// //
import UIKit import UIKit
import SmartCodable
class SPLoginManager: NSObject { class SPLoginManager: NSObject {
enum LoginType: Int { enum LoginType: String, SmartCaseDefaultable {
case apple case apple = "Apple"
case faceBook case faceBook = "Facebook"
case google = "Google"
case tiktok = "Tiktok"
} }
static let manager = SPLoginManager() static let manager = SPLoginManager()
private(set) var token: SPTokenModel? private(set) var token: SPTokenModel?
private(set) var userInfo: SPUserInfo?
///
var isLogin: Bool {
return !(userInfo?.is_tourist ?? true)
}
///token ///token
private(set) var isRefreshingToken = false private(set) var isRefreshingToken = false
@ -25,15 +33,15 @@ class SPLoginManager: NSObject {
override init() { override init() {
super.init() super.init()
token = UserDefaults.jx_object(forKey: kSPLoginTokenDefaultsKey, class: SPTokenModel.self) as? SPTokenModel 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 { func isLoginAndOpenLoginVC() -> Bool {
// if !isLogin { if !isLogin {
// openLoginVC() openLoginVC()
// } }
// return isLogin return isLogin
return false
} }
func openLoginVC() { 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 { switch type {
case .apple: case .apple:
appleSignLogin { model in appleSignLogin { [weak self] model in
self?.requestThirdLogin(thirdSignModel: model, completer: completer)
} }
default: default:
break 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 self.isRefreshingToken = false
completer?() 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")
}

View File

@ -6,19 +6,23 @@
// //
import UIKit 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 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?
} }

View File

@ -14,20 +14,21 @@ class SPUserInfo: SPModel, SmartCodable, NSSecureCoding {
var id: String? var id: String?
var customer_id: String? var customer_id: String?
var is_guide_vip: String? var is_guide_vip: String?
var is_tourist: String? ///
var is_tourist: Bool?
var family_name: String? var family_name: String?
var giving_name: String? var giving_name: String?
var vip_end_time: String? var vip_end_time: String?
var third_access_id: String? var third_access_id: String?
var is_vip: Bool? var is_vip: Bool?
var coin_left_total: Int? var coin_left_total: Int?
var send_coin_left_total: Int?
var vip_type: String? var vip_type: String?
var email: String? var email: String?
var third_access_platform: String? var third_access_platform: String?
var ip_address: String? var ip_address: String?
var country_code: String? var country_code: String?
var user_level: String? var user_level: String?
var send_coin_left_total: String?
var avator: String? var avator: String?
var sign_in_status: String? var sign_in_status: String?
var registered_days: String? var registered_days: String?

View File

@ -29,6 +29,7 @@
"My list" = "My list"; "My list" = "My list";
"Watch list" = "Watch list"; "Watch list" = "Watch list";
"Recently viewed" = "Recently viewed"; "Recently viewed" = "Recently viewed";
"Affirm" = "Affirm";
"Cancel" = "Cancel"; "Cancel" = "Cancel";
"Select All" = "Select All"; "Select All" = "Select All";
"Delet (%@)" = "Delet (%@)"; "Delet (%@)" = "Delet (%@)";
@ -75,6 +76,8 @@
"Order Records" = "Order Records"; "Order Records" = "Order Records";
"Coin Record" = "Coin Record"; "Coin Record" = "Coin Record";
"VIP Record" = "VIP Record"; "VIP Record" = "VIP Record";
"Signout" = "Signout";
"Confirm logout?" = "Confirm logout?";
"kLoginAgreementText" = "By continuing, you agree to the User Agreement and Privacy Policy"; "kLoginAgreementText" = "By continuing, you agree to the User Agreement and Privacy Policy";