//
|
// SceneDelegate.swift
|
// XQMuse
|
//
|
// Created by 无故事王国 on 2024/8/12.
|
//
|
|
import UIKit
|
import SVProgressHUD
|
import JQTools
|
import AuthenticationServices
|
|
class SceneDelegate: UIResponder, UIWindowSceneDelegate, WXApiDelegate{
|
|
var window: UIWindow?
|
|
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
|
guard let windowScene = (scene as? UIWindowScene) else { return }
|
window = UIWindow(windowScene: windowScene)
|
window?.frame = windowScene.coordinateSpace.bounds
|
|
let tabbar = BaseTabBarVC()
|
window?.rootViewController = tabbar
|
window?.makeKeyAndVisible()
|
tabbar.selectedIndex = 0
|
|
|
SVProgressHUD.setContainerView(window)
|
SVProgressHUD.setDefaultStyle(.dark)
|
SVProgressHUD.setDefaultMaskType(.custom) //禁止交互
|
SVProgressHUD.setMinimumDismissTimeInterval(1.5)
|
SVProgressHUD.setMaximumDismissTimeInterval(30.0)
|
|
if #available(iOS 13.0, *) {
|
window?.overrideUserInterfaceStyle = .light
|
}
|
|
if let appleId = UserViewModel.getLoginInfo()?.appleId {
|
//检查Apple登录,授权情况
|
let provider = ASAuthorizationAppleIDProvider()
|
provider.getCredentialState(forUserID: appleId) { state, error in
|
guard error == nil else {return}
|
switch state {
|
case .revoked,.notFound,.transferred:
|
UserViewModel.clearToken()
|
UserViewModel.clearLoginInfo()
|
UserViewModel.clearAvatarInfo()
|
default:break
|
}
|
}
|
|
NotificationCenter.default.rx.notification(ASAuthorizationAppleIDProvider.credentialRevokedNotification).subscribe(onNext: { _ in
|
UserViewModel.clearToken()
|
UserViewModel.clearLoginInfo()
|
UserViewModel.clearAvatarInfo()
|
}).disposed(by: JQ_disposeBag)
|
}
|
}
|
|
func needLogin(){
|
UserViewModel.clearToken()
|
UserViewModel.clearLoginInfo()
|
UserViewModel.clearAvatarInfo()
|
|
NotificationCenter.default.post(name: LoginQuit_Noti, object: nil)
|
|
let loginNav = LoginNav(rootViewController: LoginVC())
|
loginNav.modalPresentationStyle = .fullScreen
|
JQ_currentViewController().present(loginNav, animated: true)
|
}
|
|
//判断是否需要登录
|
func checkisLoginState()->Bool{
|
if UserViewModel.getLoginInfo()?.accessToken.isEmpty ?? true{
|
sceneDelegate?.needLogin()
|
return false
|
}
|
return true
|
}
|
|
func loginSuccess(){
|
NotificationCenter.default.post(name: LoginSuccess_Noti, object: nil)
|
}
|
|
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
|
|
if URLContexts.first?.url.scheme == WeChatAPPID{
|
|
if let code = URLContexts.first?.url.jq_params?["code"]{
|
DispatchQueue.main.async {
|
hiddenHUD()
|
let resp = SendAuthResp()
|
resp.code = code
|
WeChatTools.getAccessToken(resp) { model in
|
if let m = model{
|
WeChatTools.getUserInfo(access_token: m.access_token, openId: m.openid) { userInfoModel in
|
if let u = userInfoModel{
|
if UserViewModel.getToken()?.isEmpty ?? true{
|
Services.loginByWechat(headImgUrl: u.headimgurl, nickname: u.nickname, sex: u.sex, wxOpenId: u.openid).subscribe(onNext: {data in
|
if let model = data.data{
|
sceneDelegate?.loginSuccess()
|
JQ_currentViewController().dismiss(animated:true)
|
UserViewModel.saveLoginInfo(model)
|
|
Services.getUserInfo().subscribe(onNext: {data in
|
if let model = data.data{
|
UserViewModel.saveAvatarInfo(model)
|
}
|
}).disposed(by: JQ_disposeBag)
|
}
|
}).disposed(by: JQ_disposeBag)
|
}else{
|
|
|
// NotificationCenter.default.post(name: BindWechat_Noti, object: nil)
|
// let v = UserViewModel.getAvatarInfo()
|
// v.wxOpenId = u.openid
|
// UserViewModel.saveAvatarInfo(v)
|
}
|
}else{
|
alertError(msg: "获取信息失败")
|
}
|
}
|
}
|
}
|
}
|
}else{
|
WXApi.handleOpen(URLContexts.first!.url, delegate: self)
|
}
|
|
|
}
|
}
|
|
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
|
WXApi.handleOpenUniversalLink(userActivity, delegate: self)
|
}
|
|
func sceneDidDisconnect(_ scene: UIScene) {
|
// Called as the scene is being released by the system.
|
// This occurs shortly after the scene enters the background, or when its session is discarded.
|
// Release any resources associated with this scene that can be re-created the next time the scene connects.
|
// The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
|
}
|
|
func sceneDidBecomeActive(_ scene: UIScene) {
|
// Called when the scene has moved from an inactive state to an active state.
|
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
|
}
|
|
func sceneWillResignActive(_ scene: UIScene) {
|
// Called when the scene will move from an active state to an inactive state.
|
// This may occur due to temporary interruptions (ex. an incoming phone call).
|
}
|
|
func sceneWillEnterForeground(_ scene: UIScene) {
|
// Called as the scene transitions from the background to the foreground.
|
// Use this method to undo the changes made on entering the background.
|
}
|
|
func sceneDidEnterBackground(_ scene: UIScene) {
|
// Called as the scene transitions from the foreground to the background.
|
// Use this method to save data, release shared resources, and store enough scene-specific state information
|
// to restore the scene back to its current state.
|
}
|
|
func onReq(_ req: BaseReq) {
|
|
}
|
|
func onResp(_ resp: BaseResp) {
|
|
}
|
|
}
|