Browse Source

Merge remote-tracking branch 'origin/dev' into feat/1v1_call

* origin/dev:
  fix: 修复编译错误
  feat: 如果体现入口配置为空或者 0 ,则表示不限制
  fix: 修复提现多语言图片没生效的问题
  feat: 补充金豆刷新余额的场景
  feat: 补充访客为空时的缺省界面展示逻辑
  feat: 补充金豆提现功能
  fix: 修复个人页底部菜单界面底部镂空的问题
  fix: 修复在手机输入页面进行其他方式登录后,没有返回首页的问题
  feat: 补充正式环境的 APNs 推送配置
  feat: 调整技能示例图的展示方式
  fix: 修复 IM 离线推送的配置问题,以及补充官方消息跳转逻辑支持 deeplink 逻辑
  feat: 补充清理缓存的弹窗
  fix: 修复官方消息跳转界面没展示的问题
  fix: 接入腾讯 IM 离线推送
  fix: 修复 IM 页面顶部信息展示异常的问题
  feat: 修改兴趣的时候,需要重新加载首页

# Conflicts:
#	Lanu/Localizable.xcstrings
#	Lanu/Manager/IM/LNIMManager.swift
#	Podfile.lock
陈文艺 2 months ago
parent
commit
4bcc5a2158
36 changed files with 248 additions and 25 deletions
  1. 4 10
      Lanu.xcodeproj/project.pbxproj
  2. 10 0
      Lanu/AppDelegate.swift
  3. 22 0
      Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_cn.imageset/Contents.json
  4. BIN
      Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_cn.imageset/ic_bean_value_bg_cn@2x.png
  5. BIN
      Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_cn.imageset/ic_bean_value_bg_cn@3x.png
  6. 25 0
      Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_en.imageset/Contents.json
  7. BIN
      Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_en.imageset/ic_bean_value_bg@2x.png
  8. BIN
      Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_en.imageset/ic_bean_value_bg@3x.png
  9. 22 0
      Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_id.imageset/Contents.json
  10. BIN
      Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_id.imageset/ic_bean_value_bg_id@2x.png
  11. BIN
      Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_id.imageset/ic_bean_value_bg_id@3x.png
  12. 1 1
      Lanu/Common/Config/LNAppConfig.swift
  13. 4 0
      Lanu/Common/Config/String+Urls.swift
  14. 1 1
      Lanu/Common/Views/Base/LNViewController.swift
  15. 4 0
      Lanu/Info.plist
  16. 2 0
      Lanu/Lanu-Bridging-Header.h
  17. 23 0
      Lanu/Localizable.xcstrings
  18. 12 1
      Lanu/Manager/Config/LNConfigManager.swift
  19. 6 0
      Lanu/Manager/Config/Network/LNConfigResponse.swift
  20. 13 0
      Lanu/Manager/IM/LNIMManager.swift
  21. 3 0
      Lanu/Manager/Profile/LNProfileManager.swift
  22. 13 0
      Lanu/SceneDelegate.swift
  23. 13 0
      Lanu/Views/Game/OrderCenter/Visitors/LNVisitorsViewController.swift
  24. 13 2
      Lanu/Views/Game/Skill/LNSkillBottomMenuView.swift
  25. 5 1
      Lanu/Views/Game/Skill/LNSkillDetailViewController.swift
  26. 2 0
      Lanu/Views/IM/Chat/LNIMChatViewController.swift
  27. 3 0
      Lanu/Views/IM/Notify/Cell/LNIMOfficialMessageCell.swift
  28. 0 4
      Lanu/Views/Login/Phone/LNLoginCaptchaInputViewController.swift
  29. 1 1
      Lanu/Views/Profile/Profile/LNProfileBottomMenu.swift
  30. 1 1
      Lanu/Views/Profile/Profile/LNProfileViewController.swift
  31. 7 1
      Lanu/Views/Settings/LNAboutViewController.swift
  32. 8 1
      Lanu/Views/Settings/LNSettingsViewController.swift
  33. 24 0
      Lanu/Views/Wallet/Bean/LNBeanViewController.swift
  34. 4 0
      Lanu/Views/Web/LNWebViewController.swift
  35. 1 0
      Podfile
  36. 1 1
      Podfile.lock

+ 4 - 10
Lanu.xcodeproj/project.pbxproj

@@ -345,6 +345,8 @@
 		};
 		FBB67E232EC48B440070E686 /* ThirdParty */ = {
 			isa = PBXFileSystemSynchronizedRootGroup;
+			exceptions = (
+			);
 			path = ThirdParty;
 			sourceTree = "<group>";
 		};
@@ -499,14 +501,10 @@
 			inputFileListPaths = (
 				"${PODS_ROOT}/Target Support Files/Pods-Gami/Pods-Gami-resources-${CONFIGURATION}-input-files.xcfilelist",
 			);
-			inputPaths = (
-			);
 			name = "[CP] Copy Pods Resources";
 			outputFileListPaths = (
 				"${PODS_ROOT}/Target Support Files/Pods-Gami/Pods-Gami-resources-${CONFIGURATION}-output-files.xcfilelist",
 			);
-			outputPaths = (
-			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Gami/Pods-Gami-resources.sh\"\n";
@@ -542,14 +540,10 @@
 			inputFileListPaths = (
 				"${PODS_ROOT}/Target Support Files/Pods-Gami/Pods-Gami-frameworks-${CONFIGURATION}-input-files.xcfilelist",
 			);
-			inputPaths = (
-			);
 			name = "[CP] Embed Pods Frameworks";
 			outputFileListPaths = (
 				"${PODS_ROOT}/Target Support Files/Pods-Gami/Pods-Gami-frameworks-${CONFIGURATION}-output-files.xcfilelist",
 			);
-			outputPaths = (
-			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Gami/Pods-Gami-frameworks.sh\"\n";
@@ -577,7 +571,7 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = Lanu/Lanu.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 33;
+				CURRENT_PROJECT_VERSION = 34;
 				DEVELOPMENT_TEAM = 5H8D98R72W;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -626,7 +620,7 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = Lanu/Lanu.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 33;
+				CURRENT_PROJECT_VERSION = 34;
 				DEVELOPMENT_TEAM = 5H8D98R72W;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;

+ 10 - 0
Lanu/AppDelegate.swift

@@ -55,6 +55,16 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     }
 }
 
+extension AppDelegate {
+    @objc func businessID() -> Int32 {
+        LNIMManager.shared.offlinePushAppId
+    }
+    
+    @objc func onRemoteNotificationReceived(_ notice: String?) -> Bool {
+        false
+    }
+}
+
 extension AppDelegate {
     private func reportLanguage() {
         LNProfileManager.shared.reportCurrentLanguage(code: LNAppConfig.shared.curLang.languageCode) { _ in }

+ 22 - 0
Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_cn.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "ic_bean_value_bg_cn@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "ic_bean_value_bg_cn@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_cn.imageset/ic_bean_value_bg_cn@2x.png


BIN
Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_cn.imageset/ic_bean_value_bg_cn@3x.png


+ 25 - 0
Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_en.imageset/Contents.json

@@ -0,0 +1,25 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "ic_bean_value_bg@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "ic_bean_value_bg@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "localizable" : true
+  }
+}

BIN
Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_en.imageset/ic_bean_value_bg@2x.png


BIN
Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_en.imageset/ic_bean_value_bg@3x.png


+ 22 - 0
Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_id.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "ic_bean_value_bg_id@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "ic_bean_value_bg_id@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_id.imageset/ic_bean_value_bg_id@2x.png


BIN
Lanu/Assets.xcassets/Wallet/ic_bean_value_bg_id.imageset/ic_bean_value_bg_id@3x.png


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

@@ -99,7 +99,7 @@ class LNAppConfig {
     var languageBundleMap: [LNAppLanguage: Bundle] = {
         LNAppLanguage.available.reduce(into: [LNAppLanguage: Bundle](), { result, language in
             let bundle = if let path = Bundle.main.path(forResource: language.bundleName, ofType: "lproj"),
-                  let bundle = Bundle(path: path) {
+                            let bundle = Bundle(path: path) {
                 bundle
             } else {
                 Bundle.main

+ 4 - 0
Lanu/Common/Config/String+Urls.swift

@@ -9,6 +9,10 @@ import Foundation
 
 
 extension String {
+    var isDeeplink: Bool {
+        lowercased().starts(with: LNDeeplinkUrls.appScheme)
+    }
+    
     static var webUrlHost: String {
         LNAppConfig.shared.curEnv == .test ? "https://test-web.gami.vip" : "https://web.gami.vip"
     }

+ 1 - 1
Lanu/Common/Views/Base/LNViewController.swift

@@ -48,7 +48,7 @@ class LNViewController: UIViewController {
             }
         }), for: .touchUpInside)
         backButton.snp.makeConstraints { make in
-            make.width.height.equalTo(44)
+            make.width.height.equalTo(24)
         }
         navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
         

+ 4 - 0
Lanu/Info.plist

@@ -62,6 +62,10 @@
 			</array>
 		</dict>
 	</dict>
+	<key>UIBackgroundModes</key>
+	<array>
+		<string>remote-notification</string>
+	</array>
 	<key>UIDesignRequiresCompatibility</key>
 	<true/>
 </dict>

+ 2 - 0
Lanu/Lanu-Bridging-Header.h

@@ -4,4 +4,6 @@
 
 #import <SDWebImage/SDWebImage.h>
 
+#import "TIMPush/TIMPush.h"
+
 @import ImSDK_Plus;

+ 23 - 0
Lanu/Localizable.xcstrings

@@ -9112,6 +9112,29 @@
         }
       }
     },
+    "B00110" : {
+      "extractionState" : "manual",
+      "localizations" : {
+        "en" : {
+          "stringUnit" : {
+            "state" : "translated",
+            "value" : "Your image cache will be cleared, and your chat history will not be cleared"
+          }
+        },
+        "id" : {
+          "stringUnit" : {
+            "state" : "translated",
+            "value" : "Cache gambar Anda akan dihapus, dan riwayat obrolan Anda tidak akan dihapus"
+          }
+        },
+        "zh-Hans" : {
+          "stringUnit" : {
+            "state" : "translated",
+            "value" : "图片缓存将被清空,聊天记录不会被清除"
+          }
+        }
+      }
+    },
     "C00001" : {
       "extractionState" : "manual",
       "localizations" : {

+ 12 - 1
Lanu/Manager/Config/LNConfigManager.swift

@@ -10,7 +10,18 @@ import Foundation
 
 class LNConfigManager {
     static let shared = LNConfigManager()
-    private(set) var commonConfig: LNConfigResponse = LNConfigResponse()
+    private(set) var commonConfig = LNConfigResponse()
+    
+    var isBeanAvailable: Bool {
+        guard let version = commonConfig.appReviewSpecialVersionConfig?.ios else { return false }
+        if version.isEmpty { return true }
+        
+        guard let iVersion = Int(version) else { return false }
+        if iVersion == 0 { return true }
+        
+        guard let curVersion = Int(curBuildVersion) else { return false }
+        return curVersion < iVersion
+    }
     
     private init() {
         LNEventDeliver.addObserver(self)

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

@@ -29,11 +29,17 @@ class LNLanguageConstsVO: Decodable {
     var name: String = ""
 }
 
+@AutoCodable
+class LNAppVersionConfigVO: Decodable {
+    var ios: String = ""
+}
+
 @AutoCodable
 class LNConfigResponse: Decodable {
     var commonCoinExchangeConsts: [LNCurrenyExchangeConstsVO] = []
     var commonAreaConsts: [LNCommonAreaConstsVO] = []
     var commonLanguageConsts: [LNLanguageConstsVO] = []
+    var appReviewSpecialVersionConfig: LNAppVersionConfigVO?
     
     init() { }
 }

+ 13 - 0
Lanu/Manager/IM/LNIMManager.swift

@@ -62,6 +62,17 @@ class LNIMManager: NSObject {
             80000456
         }
     }
+    var offlinePushAppId: Int32 {
+        if LNAppConfig.shared.curEnv == .test {
+            //#if DEBUG
+            //        17229 // 本地调试使用这个
+            //#else
+            17249 // 打包 ipa 只能用这个
+            //#endif
+        } else {
+            15845
+        }
+    }
     
     static var shared = LNIMManager()
     
@@ -344,6 +355,7 @@ extension LNIMManager: LNAccountManagerNotify {
         let loginSuccessBlock = { [weak self] in
             guard let self else { return }
             reloadConversationList()
+            TIMPushManager.registerPush(Self.appId, appKey: "") { _ in } fail: { _, _ in }
         }
         
         getIMSignToken { token in
@@ -365,6 +377,7 @@ extension LNIMManager: LNAccountManagerNotify {
     
     func onUserLogout() {
         V2TIMManager.sharedInstance().logout(succ: nil)
+        TIMPushManager.unRegisterPush { } fail: { _, _ in }
         TUICallEngine.destroyInstance()
         
         Self.shared = LNIMManager()

+ 3 - 0
Lanu/Manager/Profile/LNProfileManager.swift

@@ -74,6 +74,9 @@ extension LNProfileManager {
                 showToast(err.errorDesc)
             } else {
                 reloadMyProfile()
+                if config.interest != nil {
+                    LNGameMateManager.shared.getGameTypeList { _ in }
+                }
             }
             queue.asyncIfNotGlobal {
                 handler(err == nil)

+ 13 - 0
Lanu/SceneDelegate.swift

@@ -103,6 +103,19 @@ extension SceneDelegate: LNAccountManagerNotify {
     func onUserLogout() {
         window?.rootViewController = LNNavigationController(rootViewController: LNMainViewController())
     }
+    
+    func onUserLogin() {
+        guard let nav = window?.rootViewController as? UINavigationController else {
+            return
+        }
+        
+        if let index = nav.viewControllers.lastIndex(where: {
+            !($0 is LNLoginPhoneInputViewController
+              || $0 is LNLoginCaptchaInputViewController) }) {
+            let viewControllers = Array(nav.viewControllers[0...index])
+            nav.setViewControllers(viewControllers, animated: true)
+        }
+    }
 }
 
 extension SceneDelegate {

+ 13 - 0
Lanu/Views/Game/OrderCenter/Visitors/LNVisitorsViewController.swift

@@ -21,6 +21,7 @@ extension UIView {
 
 
 class LNVisitorsViewController: LNViewController {
+    private let emptyView = LNNoMoreDataView()
     private let permissionView = LNIMNotificationPermissionView()
     private let tableView = UITableView()
     
@@ -53,6 +54,12 @@ extension LNVisitorsViewController {
             }
             nextTag = next
             
+            if visitors.isEmpty {
+                emptyView.showNoData(icon: .icNoDataRelationEmpty)
+            } else {
+                emptyView.hide()
+            }
+            
             tableView.reloadData()
             
             self.tableView.mj_header?.endRefreshing()
@@ -85,6 +92,12 @@ extension LNVisitorsViewController {
         title = .init(key: "B00091")
         view.backgroundColor = .primary_1
         
+        view.addSubview(emptyView)
+        emptyView.snp.makeConstraints { make in
+            make.centerX.equalToSuperview()
+            make.centerY.equalToSuperview().multipliedBy(0.6)
+        }
+        
         let stackView = UIStackView()
         stackView.axis = .vertical
         view.addSubview(stackView)

+ 13 - 2
Lanu/Views/Game/Skill/LNSkillBottomMenuView.swift

@@ -17,7 +17,18 @@ class LNSkillBottomMenuView: UIView {
     
     private var curDetail: LNGameMateSkillDetailVO?
     
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        
+        setupViews()
+    }
+    
+    required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
     func update(_ detail: LNGameMateSkillDetailVO) {
+        isHidden = false
         priceLabel.text = detail.price.toDisplay
         unitLabel.text = "/\(detail.unit)"
         
@@ -27,7 +38,7 @@ class LNSkillBottomMenuView: UIView {
                 addSubview(editView)
                 editView.snp.makeConstraints { make in
                     make.leading.equalToSuperview().inset(16)
-                    make.bottom.equalToSuperview().offset(-4)
+                    make.bottom.equalToSuperview().offset(commonBottomInset)
                     make.top.equalToSuperview().offset(16)
                 }
                 
@@ -43,7 +54,7 @@ class LNSkillBottomMenuView: UIView {
                 addSubview(orderView)
                 orderView.snp.makeConstraints { make in
                     make.leading.equalToSuperview().inset(16)
-                    make.bottom.equalToSuperview().offset(-4)
+                    make.bottom.equalToSuperview().offset(commonBottomInset)
                     make.top.equalToSuperview().offset(16)
                 }
                 

+ 5 - 1
Lanu/Views/Game/Skill/LNSkillDetailViewController.swift

@@ -209,7 +209,11 @@ extension LNSkillDetailViewController {
         }
         
         let menu = buildBottomMenu()
-        stackView.addArrangedSubview(menu)
+        view.addSubview(menu)
+        menu.snp.makeConstraints { make in
+            make.horizontalEdges.equalToSuperview()
+            make.bottom.equalToSuperview()
+        }
     }
     
     private func setupNavBar() {

+ 2 - 0
Lanu/Views/IM/Chat/LNIMChatViewController.swift

@@ -329,6 +329,8 @@ extension LNIMChatViewController {
         
         unreadLabel.textColor = .text_6
         unreadLabel.font = .body_l
+        unreadLabel.setContentHuggingPriority(.required, for: .horizontal)
+        unreadLabel.setContentCompressionResistancePriority(.required, for: .horizontal)
         infoStackView.addArrangedSubview(unreadLabel)
         
         avatar.layer.cornerRadius = 17

+ 3 - 0
Lanu/Views/IM/Notify/Cell/LNIMOfficialMessageCell.swift

@@ -64,6 +64,8 @@ extension LNIMOfficialMessageCell {
             make.bottom.equalToSuperview().offset(-12)
         }
         
+        topCover.contentMode = .scaleAspectFill
+        topCover.clipsToBounds = true
         stackView.addArrangedSubview(topCover)
         topCover.snp.makeConstraints { make in
             make.horizontalEdges.equalToSuperview()
@@ -123,6 +125,7 @@ extension LNIMOfficialMessageCell {
         jumpTitle.snp.makeConstraints { make in
             make.top.equalTo(line.snp.bottom).offset(6)
             make.leading.equalToSuperview().offset(12)
+            make.bottom.equalToSuperview()
         }
         
         let arrow = UIImageView.arrowImageView(size: 14)

+ 0 - 4
Lanu/Views/Login/Phone/LNLoginCaptchaInputViewController.swift

@@ -65,10 +65,6 @@ extension LNLoginCaptchaInputViewController: LNAccountManagerNotify {
             ])
         }
     }
-    
-    func onUserLogin() {
-        navigationController?.popToRootViewController(animated: true)
-    }
 }
 
 extension LNLoginCaptchaInputViewController: UITextViewDelegate {

+ 1 - 1
Lanu/Views/Profile/Profile/LNProfileBottomMenu.swift

@@ -104,7 +104,7 @@ extension LNProfileBottomMenu {
         stackView.snp.makeConstraints { make in
             make.horizontalEdges.equalToSuperview().inset(16)
             make.top.equalToSuperview().offset(16)
-            make.bottom.equalToSuperview().offset(-4)
+            make.bottom.equalToSuperview().offset(commonBottomInset)
         }
         
         let follow = buildFollowView()

+ 1 - 1
Lanu/Views/Profile/Profile/LNProfileViewController.swift

@@ -248,7 +248,7 @@ extension LNProfileViewController {
         view.addSubview(menu)
         menu.snp.makeConstraints { make in
             make.horizontalEdges.equalToSuperview()
-            make.bottom.equalToSuperview().offset(-view.safeBottomInset)
+            make.bottom.equalToSuperview()
         }
         
         scoreView.isHidden = true

+ 7 - 1
Lanu/Views/Settings/LNAboutViewController.swift

@@ -50,8 +50,14 @@ extension LNAboutViewController {
             make.top.equalTo(icon.snp.bottom).offset(7)
         }
         
+        var versionStr: String = .init(key: "A00248", curAppVersion)
+        
+#if DEBUG
+        versionStr += "(\(curBuildVersion)"
+#endif
+        
         let versionLabel = UILabel()
-        versionLabel.text = .init(key: "A00248", curAppVersion)
+        versionLabel.text = versionStr
         versionLabel.font = .body_s
         versionLabel.textColor = .text_5
         view.addSubview(versionLabel)

+ 8 - 1
Lanu/Views/Settings/LNSettingsViewController.swift

@@ -63,7 +63,14 @@ extension LNSettingsViewController {
         
         let cleanCache = buildFunctionItem(icon: .icCleanCache, title: .init(key: "A00257"), infoView: nil)
         cleanCache.onTap {
-            showToast(.init(key: "A00258"))
+            let alert = LNCommonAlertView()
+            alert.titleLabel.text = .init(key: "A00257")
+            alert.messageLabel.text = .init(key: "B00110")
+            alert.setConfirm {
+                showToast(.init(key: "A00258"))
+            }
+            alert.setCancel()
+            alert.popup()
         }
         stackView.addArrangedSubview(cleanCache)
         

+ 24 - 0
Lanu/Views/Wallet/Bean/LNBeanViewController.swift

@@ -30,6 +30,12 @@ class LNBeanViewController: LNViewController {
         
         updateContent()
     }
+    
+    override func viewDidAppear(_ animated: Bool) {
+        super.viewDidAppear(animated)
+        
+        LNPurchaseManager.shared.reloadWalletInfo()
+    }
 }
 
 extension LNBeanViewController: LNPurchaseManagerNotify {
@@ -76,6 +82,24 @@ extension LNBeanViewController {
             make.edges.equalToSuperview()
         }
         
+        if LNConfigManager.shared.isBeanAvailable {
+            let tag = UIImageView()
+            tag.image = switch LNAppConfig.shared.curLang {
+            case .chiness: .icBeanValueBgCn
+            case .english: .icBeanValueBgEn
+            case .indonesian: .icBeanValueBgId
+            }
+            tag.isUserInteractionEnabled = true
+            tag.onTap { [weak self] in
+                guard let self else { return }
+                view.pushToWebView(.init(url: .beanUrl))
+            }
+            container.addSubview(tag)
+            tag.snp.makeConstraints { make in
+                make.top.trailing.equalToSuperview()
+            }
+        }
+        
         let totalView = UIView()
         container.addSubview(totalView)
         totalView.snp.makeConstraints { make in

+ 4 - 0
Lanu/Views/Web/LNWebViewController.swift

@@ -40,6 +40,10 @@ class LNJumpWebViewConfig {
 
 extension UIView {
     func pushToWebView(_ config: LNJumpWebViewConfig) {
+        if config.url.isDeeplink, let url = URL(string: config.url) {
+            LNDeeplinkManager.shared.handleDeepLink(url)
+            return
+        }
         let vc = LNWebViewController(config: config)
         navigationController?.pushViewController(vc, animated: true)
     }

+ 1 - 0
Podfile

@@ -10,6 +10,7 @@ target 'Gami' do
   # # 腾讯IM
   pod 'TIMCommon', :path => "./ThirdParty/TUIKit/TIMCommon"
   pod 'TUIChat', :path => "./ThirdParty/TUIKit/TUIChat"
+  pod 'TIMPush'
   
   pod 'TUICallEngine'
   pod 'TIMPush'

+ 1 - 1
Podfile.lock

@@ -70,6 +70,6 @@ SPEC CHECKSUMS:
   TXIMSDK_Plus_iOS_XCFramework: 3b435eae84c639f35ae8dc9c8b92c399a8b0a67f
   TXLiteAVSDK_TRTC: b576b0c6a477fa98b5d2b33be63fa9aa7c41f0eb
 
-PODFILE CHECKSUM: f118fc1e373cb1d93050835729cbe48315a635bf
+PODFILE CHECKSUM: 4cc71672f79b31706491fcec8cd887e0a7f87d52
 
 COCOAPODS: 1.16.2