浏览代码

feat: 增加更新检测逻辑

陈文艺 1 天之前
父节点
当前提交
9f7ae2fbd3

+ 4 - 1
Lanu/Common/Config/LNAppConfig.swift

@@ -156,7 +156,7 @@ extension LNAppConfig {
         }
     }
     
-    private func checkNewVersion() {
+    func checkNewVersion(handler: ((Bool) -> Void)? = nil) {
         let appStoreLookupURL = "https://itunes.apple.com/lookup?bundleId=\(curAppBundleIdentifier)"
         guard let url = URL(string: appStoreLookupURL) else {
             return
@@ -176,6 +176,9 @@ extension LNAppConfig {
                let results = json["results"] as? [[String: Any]],
                let appStoreVersion = results.first?["version"] as? String {
                 hasNewVersion = curAppVersion != appStoreVersion
+                runOnMain {
+                    handler?(self.hasNewVersion)
+                }
             }
         }
         task.resume()

+ 2 - 0
Lanu/Common/Storage/LNUserDefaultsKey.swift

@@ -28,4 +28,6 @@ enum LNUserDefaultsKey: String {
     case joinedRoomId
     
     case remainExchange
+    
+    case updateCheckTime
 }

+ 29 - 18
Lanu/Common/Views/Menu/LNCommonAlertView.swift

@@ -25,17 +25,22 @@ extension LNCommonAlertView {
 class LNCommonAlertView: UIView {
     private let background = UIView()
     private let container = UIView()
+    private let closeButton = UIButton()
+    var showCloseButton = true {
+        didSet {
+            closeButton.isHidden = !showCloseButton
+        }
+    }
     
     private let miniScale = 0.01
     private let animateDuration = 0.15
     
-    let textViews = UIStackView()
+    private let textViews = UIStackView()
+    private let messageView = UIStackView()
+    private let buttonViews = UIStackView()
+    
     let titleLabel = UILabel()
-    let messageView = UIStackView()
     let messageLabel = UILabel()
-    let subMessageLabel = UILabel()
-    
-    let buttonViews = UIStackView()
     
     var touchOutsideCancel = true
     
@@ -46,29 +51,43 @@ class LNCommonAlertView: UIView {
     }
     
     func showConfirm(_ title: String = .init(key: "A00002"),
-                    handler: @escaping () -> Void) {
+                     autoDismiss: Bool = true,
+                     handler: @escaping () -> Void) {
         let button = buildConfirmButton()
         button.setTitle(title, for: .normal)
         button.addAction(UIAction(handler: { [weak self] _ in
             guard let self else { return }
-            dismiss()
+            if autoDismiss {
+                dismiss()
+            }
             handler()
         }), for: .touchUpInside)
         buttonViews.insertArrangedSubview(button, at: 0)
     }
     
     func showCancel(_ title: String = .init(key: "A00003"),
-                   handler: (() -> Void)? = nil) {
+                    autoDismiss: Bool = true,
+                    handler: (() -> Void)? = nil) {
         let button = buildCancelButton()
         button.setTitle(title, for: .normal)
         button.addAction(UIAction(handler: { [weak self] _ in
             guard let self else { return }
-            dismiss()
+            if autoDismiss {
+                dismiss()
+            }
             handler?()
         }), for: .touchUpInside)
         buttonViews.addArrangedSubview(button)
     }
     
+    func showCustomAction(_ view: UIView) {
+        buttonViews.addArrangedSubview(view)
+    }
+    
+    func showCustomMessage(_ view: UIView) {
+        messageView.addArrangedSubview(view)
+    }
+    
     required init?(coder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
     }
@@ -91,8 +110,7 @@ extension LNCommonAlertView {
         
         titleLabel.isHidden = titleLabel.text?.isEmpty != false
         messageLabel.isHidden = messageLabel.text?.isEmpty != false
-        subMessageLabel.isHidden = subMessageLabel.text?.isEmpty != false
-        messageView.isHidden = messageLabel.isHidden && subMessageLabel.isHidden
+        messageView.isHidden = messageLabel.isHidden
         
         layoutIfNeeded()
         
@@ -139,7 +157,6 @@ extension LNCommonAlertView {
             make.width.equalToSuperview().multipliedBy(0.8)
         }
         
-        let closeButton = UIButton()
         closeButton.setImage(.init(systemName: "xmark"), for: .normal)
         closeButton.tintColor = .text_2
         closeButton.addAction(UIAction(handler: { [weak self] _ in
@@ -177,12 +194,6 @@ extension LNCommonAlertView {
         messageLabel.numberOfLines = 0
         messageView.addArrangedSubview(messageLabel)
         
-        subMessageLabel.font = .body_xs
-        subMessageLabel.textColor = .text_4
-        subMessageLabel.textAlignment = .center
-        subMessageLabel.numberOfLines = 0
-        messageView.addArrangedSubview(subMessageLabel)
-        
         buttonViews.axis = .vertical
         buttonViews.spacing = 16
         container.addSubview(buttonViews)

+ 23 - 0
Lanu/Localizable.xcstrings

@@ -8948,6 +8948,29 @@
         }
       }
     },
+    "A00392" : {
+      "extractionState" : "manual",
+      "localizations" : {
+        "en" : {
+          "stringUnit" : {
+            "state" : "translated",
+            "value" : "New version available"
+          }
+        },
+        "id" : {
+          "stringUnit" : {
+            "state" : "translated",
+            "value" : "Versi baru ditemukan"
+          }
+        },
+        "zh-Hans" : {
+          "stringUnit" : {
+            "state" : "translated",
+            "value" : "发现新版本"
+          }
+        }
+      }
+    },
     "B00001" : {
       "extractionState" : "manual",
       "localizations" : {

+ 8 - 0
Lanu/Manager/Config/LNConfigManager.swift

@@ -46,6 +46,14 @@ class LNConfigManager {
             }
         }
     }
+    
+    func getUpdateInfo(queue: DispatchQueue = .main, handler: @escaping (LNForceUpdateConfigResponse?) -> Void) {
+        LNHttpManager.shared.getUpdateInfo { res, err in
+            queue.asyncIfNotGlobal {
+                handler(res)
+            }
+        }
+    }
 }
 
 extension LNConfigManager: LNAccountManagerNotify {

+ 7 - 0
Lanu/Manager/Config/Network/LNConfigResponse.swift

@@ -57,3 +57,10 @@ class LNCountryCodeVO: Decodable {
 class LNCountryCodeListResponse: Decodable {
     var list: [LNCountryCodeVO] = []
 }
+
+@AutoCodable
+class LNForceUpdateConfigResponse: Decodable {
+    var platform: Int = 0
+    var minVersion: String = ""
+    var tip: String = ""
+}

+ 5 - 0
Lanu/Manager/Config/Network/LNHttpManager+Config.swift

@@ -10,6 +10,7 @@ import Foundation
 
 private let kNetPath_Config_Common = "/base/consts/config"
 private let kNetPath_Config_Country = "/base/country/mobile"
+private let kNetPath_Config_Update = "/base/common/app/forceUpdateInfo"
 
 
 extension LNHttpManager {
@@ -20,4 +21,8 @@ extension LNHttpManager {
     func getCountryCodeList(completion: @escaping (LNCountryCodeListResponse?, LNHttpError?) -> Void) {
         post(path: kNetPath_Config_Country, completion: completion)
     }
+    
+    func getUpdateInfo(completion: @escaping (LNForceUpdateConfigResponse?, LNHttpError?) -> Void) {
+        post(path: kNetPath_Config_Update, completion: completion)
+    }
 }

+ 11 - 11
Lanu/Manager/Gift/LNGiftManager.swift

@@ -149,15 +149,15 @@ extension LNGiftManager {
             queue.asyncIfNotGlobal {
                 handler(err == nil)
             }
-            if let err {
-                showToast(err.errorDesc)
-                if case .serverError(let code, _) = err {
+//            if let err {
+//                showToast(err.errorDesc)
+//                if case .serverError(let code, _) = err {
                     runOnMain {
-                        if code == LNOrderErrorCode.NotEnoughMoney.rawValue {
-                            let panel = LNMoneyNotEnoughAlertView()
-                            panel.update(.diamond)
-                            panel.popup()
-                        } else if LNOrderErrorCode.NotEnoughMoneyButCanExchange.rawValue == code {
+//                        if code == LNOrderErrorCode.NotEnoughMoney.rawValue {
+//                            let panel = LNMoneyNotEnoughAlertView()
+//                            panel.update(.diamond)
+//                            panel.popup()
+//                        } else if LNOrderErrorCode.NotEnoughMoneyButCanExchange.rawValue == code {
                             let panel = LNMoneyNotEnoughAlertView()
                             panel.update(.diamond, exchange: .coin)
                             panel.exchangeHandler = {
@@ -165,10 +165,10 @@ extension LNGiftManager {
                                 self.sendGift(params: params, queue: queue, handler: handler)
                             }
                             panel.popup()
-                        }
+//                        }
                     }
-                }
-            }
+//                }
+//            }
             if let res {
                 LNPurchaseManager.shared.updateWallet(diamond: res.diamond, coin: res.goldcoin)
             }

+ 1 - 1
Lanu/Manager/Network/LNHttpManager.swift

@@ -97,7 +97,7 @@ class LNHttpManager {
         sign += api
         commonHeader["api"] = api
         
-        let version = curBuildVersion
+        let version = curAppVersion
         sign += version
         commonHeader["version"] = version
         

+ 25 - 0
Lanu/SceneDelegate.swift

@@ -116,6 +116,31 @@ extension SceneDelegate: LNAccountManagerNotify {
             let viewControllers = Array(nav.viewControllers[0...index])
             nav.setViewControllers(viewControllers, animated: true)
         }
+        
+        LNConfigManager.shared.getUpdateInfo { res in
+            if let res, res.platform == 2, res.minVersion >= curAppVersion {
+                let alert = LNCommonAlertView()
+                alert.showCloseButton = false
+                alert.titleLabel.text = .init(key: "B00058")
+                alert.messageLabel.text = res.tip
+                alert.showConfirm(autoDismiss: false) {
+                    LNAppConfig.shared.jumpToAppStore()
+                }
+                alert.popup()
+            } else if curTime - LNUserDefaults[.updateCheckTime, 0] > 7 * 24 * 3600  {
+                LNAppConfig.shared.checkNewVersion { hasNew in
+                    guard hasNew else { return }
+                    let alert = LNCommonAlertView()
+                    alert.titleLabel.text = .init(key: "A00392")
+                    alert.showConfirm {
+                        LNAppConfig.shared.jumpToAppStore()
+                    }
+                    alert.showCancel()
+                    alert.popup()
+                    LNUserDefaults[.updateCheckTime] = curTime
+                }
+            }
+        }
     }
 }
 

+ 8 - 2
Lanu/Views/Wallet/LNMoneyNotEnoughAlertView.swift

@@ -11,7 +11,8 @@ import SnapKit
 
 
 class LNMoneyNotEnoughAlertView: LNCommonAlertView {
-    private var exchangeType:LNCurrencyType?
+    private let subMessageLabel = UILabel()
+    private var exchangeType: LNCurrencyType?
     private let remainButton = UIButton()
     var exchangeHandler: (() -> Void)?
     
@@ -24,6 +25,11 @@ class LNMoneyNotEnoughAlertView: LNCommonAlertView {
             messageLabel.attributedText = buildRemainString(exchangeType: exchange)
             
             if let rate = exchangeType.rate {
+                subMessageLabel.textAlignment = .center
+                subMessageLabel.numberOfLines = 0
+                subMessageLabel.font = .body_xs
+                subMessageLabel.textColor = .text_4
+                showCustomMessage(subMessageLabel)
                 subMessageLabel.attributedText = buildExchangeString(from: currency, fromValue: "1", exchange: exchange, exchangeValue: rate.toDisplay)
             }
             
@@ -47,7 +53,7 @@ class LNMoneyNotEnoughAlertView: LNCommonAlertView {
                 guard let remainButton else { return }
                 remainButton.isSelected.toggle()
             }), for: .touchUpInside)
-            buttonViews.addArrangedSubview(remainButton)
+            showCustomAction(remainButton)
         } else {
             titleLabel.text = .init(key: "B00131", currency.name(lowcase: true))
             showConfirm { [weak self] in