Files
OrderScheduling/OrderScheduling/Common/View/AppUpdateTool.swift
2023-09-01 17:39:56 +08:00

128 lines
4.9 KiB
Swift

//
// AppUpdateTool.swift
// OrderScheduling
//
// Created by on 2023/8/21.
//
import Foundation
import StoreKit
import RxSwift
import RxRelay
import RxCocoa
public let APPUPDATE = AppUpdateTool.default
open class AppUpdateTool : NSObject {
public static let `default` = AppUpdateTool()
public let requestAppUpdateRelay = ReplayRelay<FromTypeEnum>.create(bufferSize: 1)
private let disposeBag = DisposeBag()
public let appUpdateView = AppUpdateView()
public enum FromTypeEnum : Int {
case auto = 1
case manual
}
private var ignoreFlag : Bool? {
return UserDefaults.standard.object(forKey: appUpdateIgnore_key) as? Bool
}
func setIgnoreFlag(ignoreFlag:Bool) {
UserDefaults.standard.setValue(ignoreFlag, forKey: appUpdateIgnore_key)
}
public override init() {
super.init()
appUpdateView.updateButton.rx.tap
.subscribe(onNext: {[weak self] _ in
self?.openAppStore(by: UIApplication.shared.dd_keyWindow.rootViewController)
})
.disposed(by: disposeBag)
appUpdateView.ignoreButton.rx.tap
.subscribe(onNext: {[weak self] _ in
ENTRY.dismiss(name: appUpdateEntry) {[weak self] in
self?.setIgnoreFlag(ignoreFlag: true)
}
})
.disposed(by: disposeBag)
Observable.combineLatest(requestAppUpdateRelay, USER.refreshTokenSub)
.observe(on: MainScheduler.instance)
.do(onNext: { (_,_) in
UIApplication.shared.dd_keyWindow.rootViewController?.view.dd_showHUD()
})
.flatMapLatest { (type,_) in
return Observable.zip(RQ.versionCheck(parameters: VersionCheckParameters(version: TOOL.getVersion())).asObservable(), Observable.just(type))
}
.observe(on: MainScheduler.instance)
.do(onNext: { (_,_) in
UIApplication.shared.dd_keyWindow.rootViewController?.view.dd_hideHUD()
})
.observe(on: MainScheduler.instance)
.subscribe(onNext: {[weak self] (response,type) in
if response?.success == true {
if self?.canUpdate(localVersion: TOOL.getVersion(), onlineVersion: response?.data?.appVersion ?? "0") == true {
if type == .auto {
if response?.data?.update.code == .YES || self?.shouldPresentEntry() == true {
if let appUpdateView = self?.appUpdateView {
appUpdateView.isForce(isForce: response?.data?.update.code == .YES ? true : false)
appUpdateView.contentLabel.text = response?.data?.description
ENTRY.showAppUpdateEntry(view: appUpdateView,name: appUpdateEntry)
}
}
}else if type == .manual {
if let appUpdateView = self?.appUpdateView {
appUpdateView.isForce(isForce: response?.data?.update.code == .YES ? true : false)
appUpdateView.contentLabel.text = response?.data?.description
ENTRY.showAppUpdateEntry(view: appUpdateView,name: appUpdateEntry)
}
}
}else{
if type == .manual {
UIApplication.shared.dd_keyWindow.rootViewController?.view.dd_makeToast(isTheNewestVserion)
}
}
}else{
UIApplication.shared.dd_keyWindow.rootViewController?.view.dd_makeToast(response?.msg)
}
})
.disposed(by: disposeBag)
}
func canUpdate(localVersion:String,onlineVersion:String) -> Bool {
let onlineIntVersion = Int(onlineVersion.replacingOccurrences(of: ".", with: "")) ?? 0
let localIntVersion = Int(localVersion.replacingOccurrences(of: ".", with: "")) ?? 0
if onlineIntVersion > localIntVersion {
return true
}
// app
setIgnoreFlag(ignoreFlag: false)
return false
}
func shouldPresentEntry() -> Bool {
if ignoreFlag == true {
return false
}
return true
}
func openAppStore(by from:UIViewController?) {
let vc = SKStoreProductViewController()
vc.delegate = self
vc.loadProduct(withParameters: [SKStoreProductParameterITunesItemIdentifier:AppItunesId])
from?.present(vc, animated: true)
}
}
extension AppUpdateTool : SKStoreProductViewControllerDelegate {
public func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) {
viewController.dismiss(animated: true)
}
}