// // LoginViewModel.swift // QuickLocation // import Foundation import RxSwift import SwiftyUserDefaults import AuthenticationServices #if !targetEnvironment(simulator) import GeYanSdk #endif enum LoginSessionHandler { private static let disposeBag = DisposeBag() static func login(type: String, data: [String: Any]) { DLToast.showLoading() UserService.login(type: type, data: data) .delaySubscription(.seconds(1), scheduler: MainScheduler.instance) .retry(1) .subscribe(onNext: { response in GroupIMService.shared.logout() DLToast.dismiss() guard let model = response.model else { return } NotificationCenter.default.post(name: .invalidatePopupQueue, object: nil) Defaults[\.loginToken] = model.token DLToast.showSuccess(text: "登录成功") { if let userId = model.uid { MQTTService.shared.updateClientID("smartdrive_\(userId)") } NotificationCenter.default.post(name: .RefreshUserConfigNotification, object: nil) if let nav = AppRouter.shared.navigationController, nav.viewControllers.count > 1 { AppRouter.shared.popOrDismiss() } else { AppDelegate.shared.showMainViewController() } } }, onError: { error in DLToast.dismiss() DLToast.showError(text: "登录失败,请重试") }).disposed(by: disposeBag) } } final class LoginViewModel: BaseViewModel { /// 验证码接口返回值 var timestamp: String = "" let oneClickLoginResult = PublishSubject() let loginSuccess = PublishSubject() var onAppleLoginRequest: ((ASAuthorizationController) -> Void)? #if !targetEnvironment(simulator) lazy var gyAuthVM: GyAuthViewModel = { let viewModel = GyAuthViewModel() viewModel.statusBarStyle = .default viewModel.userInterfaceStyle = 0 viewModel.pullAuthVCStyle = .modal viewModel.clickAuthButtonBlock = { return true } return viewModel }() #endif /// 登录 func loginAction(type: String, data: [String : Any]) { LoginSessionHandler.login(type: type, data: data) } func performGuestLogin() { loginSuccess.onNext(()) } #if !targetEnvironment(simulator) func performOneTapLogin(from vc: UIViewController, contentView: OneTapLoginView) { NotificationCenter.default.post(name: .pausePopupQueue, object: nil) let subViews: [UIView] = [ contentView.phoneNumberLabel, contentView.carrierLabel, contentView.loginButton, contentView.checkBox, contentView.agreementTV ] GeYanSdk.oneTapLogin(vc, viewModel: gyAuthVM, contentView: contentView, subViewList: subViews) { [weak self] result in guard let dict = result as? [String: Any], dict["code"] as? Int == 30000, let token = dict["token"] as? String else { return } let opType: String = { switch dict["operatorType"] as? Int { case 1: return "CM" case 2: return "CU" case 3: return "CT" default: return "" } }() self?.loginAction(type: "onekey", data: [ "auth_code": "", "access_code": token, "operator_type": opType ]) } } #endif func performWechatLogin() { NotificationCenter.default.post(name: .pausePopupQueue, object: nil) let req = SendAuthReq() req.scope = "snsapi_userinfo" req.state = "login" WXApi.send(req) } func performAppleLogin() { NotificationCenter.default.post(name: .pausePopupQueue, object: nil) let provider = ASAuthorizationAppleIDProvider() let request = provider.createRequest() request.requestedScopes = [.fullName, .email] let controller = ASAuthorizationController(authorizationRequests: [request]) onAppleLoginRequest?(controller) } }