登录注销逻辑处理
This commit is contained in:
parent
538c5a5a86
commit
9a26c4ac7f
@ -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()
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -9,6 +9,8 @@ import UIKit
|
|||||||
|
|
||||||
///登录的用户信息
|
///登录的用户信息
|
||||||
let kSPLoginTokenDefaultsKey = "kSPLoginTokenDefaultsKey"
|
let kSPLoginTokenDefaultsKey = "kSPLoginTokenDefaultsKey"
|
||||||
|
///登录的用户信息
|
||||||
|
let kSPLoginUserInfoDefaultsKey = "kSPLoginUserInfoDefaultsKey"
|
||||||
|
|
||||||
///首页搜索记录
|
///首页搜索记录
|
||||||
let kSPHomeSearchHistoryDefaultsKey = "kSPHomeSearchHistoryDefaultsKey"
|
let kSPHomeSearchHistoryDefaultsKey = "kSPHomeSearchHistoryDefaultsKey"
|
||||||
|
@ -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 {
|
||||||
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,6 +54,10 @@ class SPWebViewController: SPViewController {
|
|||||||
self.webView.load(request)
|
self.webView.load(request)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func reload() {
|
||||||
|
self.webView.reload()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension SPWebViewController {
|
extension SPWebViewController {
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
///获取播放记录
|
///获取播放记录
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,8 @@ struct SPMineItem {
|
|||||||
case clearCache
|
case clearCache
|
||||||
///注销账户
|
///注销账户
|
||||||
case deleteAccount
|
case deleteAccount
|
||||||
|
///退出登录
|
||||||
|
case logout
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}()
|
}()
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)?) {
|
||||||
|
@ -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)?) {
|
||||||
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -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")
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -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?
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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?
|
||||||
|
@ -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";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user