소스 검색

[fix] bug

zhujieshan 2 달 전
부모
커밋
9f413a37b4
34개의 변경된 파일470개의 추가작업 그리고 159개의 파일을 삭제
  1. 4 4
      QuickSearchLocation.xcodeproj/project.pbxproj
  2. 28 8
      QuickSearchLocation/Classes/Common/Tool/QSLCountdownManager.swift
  3. 1 1
      QuickSearchLocation/Classes/Common/Tool/QSLGravityManager.swift
  4. 2 4
      QuickSearchLocation/Classes/Common/Tool/QSLJumpManager.swift
  5. 6 2
      QuickSearchLocation/Classes/Common/Tool/QSLLoading.swift
  6. 1 1
      QuickSearchLocation/Classes/Common/Tool/QSLSocketManager.swift
  7. 3 3
      QuickSearchLocation/Classes/Common/View/QSLCountdownView.swift
  8. 1 1
      QuickSearchLocation/Classes/Main/SceneDelegate.swift
  9. 9 4
      QuickSearchLocation/Classes/Pages/QSLAdd/Controller/QSLAddController.swift
  10. 32 11
      QuickSearchLocation/Classes/Pages/QSLHome/Controller/QSLHomeController.swift
  11. 1 1
      QuickSearchLocation/Classes/Pages/QSLHome/View/QSLHomeAddFriendAlertView.swift
  12. 51 31
      QuickSearchLocation/Classes/Pages/QSLHome/View/QSLHomeFriendView.swift
  13. 3 0
      QuickSearchLocation/Classes/Pages/QSLLogin/Controller/QSLLoginViewController.swift
  14. 30 49
      QuickSearchLocation/Classes/Pages/QSLVip/Controller/QSLActivityVipVC.swift
  15. 15 11
      QuickSearchLocation/Classes/Pages/QSLVip/Controller/QSLVipController.swift
  16. 252 23
      QuickSearchLocation/Classes/Pages/QSLVip/QSLVipManager.swift
  17. 2 1
      QuickSearchLocation/Resources/Assets.xcassets/Home/home_activity_bg.imageset/Contents.json
  18. BIN
      QuickSearchLocation/Resources/Assets.xcassets/Home/home_activity_bg.imageset/顶部卡片.png
  19. BIN
      QuickSearchLocation/Resources/Assets.xcassets/Home/home_activity_bg.imageset/顶部卡片@2x.png
  20. 22 0
      QuickSearchLocation/Resources/Assets.xcassets/Home/home_find_friend.imageset/Contents.json
  21. BIN
      QuickSearchLocation/Resources/Assets.xcassets/Home/home_find_friend.imageset/找TA (1).png
  22. BIN
      QuickSearchLocation/Resources/Assets.xcassets/Home/home_find_friend.imageset/找TA.png
  23. 2 1
      QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_s.imageset/Contents.json
  24. BIN
      QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_s.imageset/Group 40405.png
  25. BIN
      QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_s.imageset/Group 42960.png
  26. BIN
      QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_s.imageset/Group 42960@2x.png
  27. 2 1
      QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_uns.imageset/Contents.json
  28. BIN
      QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_uns.imageset/Group 40405-1.png
  29. 0 0
      QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_uns.imageset/Group 40405.png
  30. 1 1
      QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_top_title.imageset/Contents.json
  31. 2 1
      QuickSearchLocation/Resources/Assets.xcassets/Vip/vip_comment_give_thumb.imageset/Contents.json
  32. BIN
      QuickSearchLocation/Resources/Assets.xcassets/Vip/vip_comment_give_thumb.imageset/Group 40497.png
  33. BIN
      QuickSearchLocation/Resources/Assets.xcassets/Vip/vip_comment_give_thumb.imageset/Group 40497@2x.png
  34. BIN
      QuickSearchLocation/Resources/Assets.xcassets/Vip/vip_comment_give_thumb.imageset/vip_comment_give_thumb@2x.png

+ 4 - 4
QuickSearchLocation.xcodeproj/project.pbxproj

@@ -1322,7 +1322,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 23;
+				CURRENT_PROJECT_VERSION = 25;
 				DEVELOPMENT_TEAM = Q364C8K9BL;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				FRAMEWORK_SEARCH_PATHS = (
@@ -1346,7 +1346,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.2.5;
+				MARKETING_VERSION = 1.2.6;
 				PRODUCT_BUNDLE_IDENTIFIER = com.manbu.shouji;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1366,7 +1366,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 23;
+				CURRENT_PROJECT_VERSION = 25;
 				DEVELOPMENT_TEAM = Q364C8K9BL;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				FRAMEWORK_SEARCH_PATHS = (
@@ -1390,7 +1390,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.2.5;
+				MARKETING_VERSION = 1.2.6;
 				PRODUCT_BUNDLE_IDENTIFIER = com.manbu.shouji;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";

+ 28 - 8
QuickSearchLocation/Classes/Common/Tool/QSLCountdownManager.swift

@@ -11,8 +11,18 @@ import UIKit
 class QSLCountdownManager {
     static let shared = QSLCountdownManager()
     private var timer: Timer?
-    var selectGood: QSLGoodModel?
-    var remainingSeconds: Int = 900 // 15分钟 = 900秒
+    var selectGood: QSLGoodModel?{
+        didSet{
+            if(oldValue != nil){
+                NotificationCenter.default.post(
+                    name: Notification.Name("QSLHomeRefreshCouponViewNoti"),
+                    object: nil,
+                    userInfo: nil
+                )
+            }
+        }
+    }
+    var remainingSeconds: Int = 900 * 1000 // 15分钟 = 900秒
     var updateHandler: ((String) -> Void)?
     var updateHandler1: ((String) -> Void)?
     
@@ -24,11 +34,19 @@ class QSLCountdownManager {
         if(selectGood == nil){
             return
         }
-        remainingSeconds = 900
-        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateCountdown), userInfo: nil, repeats: true)
+        remainingSeconds = 900 * 1000
+        timer = Timer.scheduledTimer(timeInterval: 0.001, target: self, selector: #selector(updateCountdown), userInfo: nil, repeats: true)
         RunLoop.current.add(timer!, forMode: .common)
     }
     
+    func checkIsCountDown() -> Bool{
+        if let curTimer = timer {
+            return true
+        }else{
+            return false
+        }
+    }
+    
     func stopCountdown() {
         finishHandler?()
         timer?.invalidate()
@@ -41,11 +59,13 @@ class QSLCountdownManager {
             stopCountdown()
         }
         
-        let hours = remainingSeconds / 3600
-        let minutes = (remainingSeconds % 3600) / 60
-        let seconds = remainingSeconds % 60
+        let totalSeconds = remainingSeconds / 1000
+        let minutes = totalSeconds / 60
+        let seconds = totalSeconds % 60
+        let milliseconds = remainingSeconds % 1000
         
-        let timeString = String(format: "%02d : %02d : %02d", hours, minutes, seconds)
+        // 格式:MM:SS:SSS(例如 "14:59:500")
+        let timeString = String(format: "%02d : %02d : %03d", minutes, seconds, milliseconds)
         updateHandler?(timeString)
         updateHandler1?(timeString)
     }

+ 1 - 1
QuickSearchLocation/Classes/Common/Tool/QSLGravityManager.swift

@@ -13,7 +13,7 @@ var gravityInstance: GravityEngineSDK?
 class QSLGravityManager {
 
     func initGE() {
-        
+        return;
         // 引力引擎
         let config = GEConfig()
         

+ 2 - 4
QuickSearchLocation/Classes/Common/Tool/QSLJumpManager.swift

@@ -72,7 +72,7 @@ extension QSLJumpManager {
                     gravityInstance?.track(QSLGravityConst.vip_submit_success, properties: ["id": 01001])
                     
                     //弹出是否好评的弹窗
-                    QSLGuideusersToCommentManager.commentShare.manageWhetherTriggerPopUpWindow(QSLGuideusersToCommentType.member)
+                    //QSLGuideusersToCommentManager.commentShare.manageWhetherTriggerPopUpWindow(QSLGuideusersToCommentType.member)
                     
                     // 引力传递支付事件
                     gravityInstance?.trackPayEvent(withAmount: Int32(selectGood.amount), withPayType: "CNY", withOrderId: outTradeNo, withPayReason: selectGood.name, withPayMethod: "apple")
@@ -88,9 +88,7 @@ extension QSLJumpManager {
                     gravityInstance?.track(QSLGravityConst.new_vip_result, properties: ["is_member":QSLBaseManager.shared.isVip(),"purchase_result": "fail","pay_amount":Int32(selectGood.amount)])
                     gravityInstance?.track(QSLGravityConst.vip_fail)
                     QSLLoading.error(text: "支付失败")
-                } else if status == .searchFail {
-                    QSLLoading.error(text: "查询订单失败,请稍后重试")
-                }
+                } 
             }
         }
     }

+ 6 - 2
QuickSearchLocation/Classes/Common/Tool/QSLLoading.swift

@@ -13,15 +13,19 @@ class QSLLoading {
         ProgressHUD.animate(nil, .circleStrokeSpin, interaction: false)
     }
     
+    static func showWithCancel() {
+        ProgressHUD.animate(nil, .circleStrokeSpin, interaction: true)
+    }
+    
     static func hide() {
         ProgressHUD.dismiss()
     }
     
     static func success(text: String) {
-        ProgressHUD.succeed(text, interaction: false, delay: 3)
+        ProgressHUD.succeed(text, interaction: false, delay: 2)
     }
     
     static func error(text: String) {
-        ProgressHUD.error(text, interaction: false, delay: 3)
+        ProgressHUD.error(text, interaction: false, delay: 2)
     }
 }

+ 1 - 1
QuickSearchLocation/Classes/Common/Tool/QSLSocketManager.swift

@@ -90,7 +90,7 @@ class QSLSocketManager: NSObject, SRWebSocketDelegate {
         do {
             try self.webSocket?.send(string: message)
             ///判断要不要弹引导用户去评价
-            QSLGuideusersToCommentManager.commentShare.manageWhetherTriggerPopUpWindow(QSLGuideusersToCommentType.nonMember)
+            //QSLGuideusersToCommentManager.commentShare.manageWhetherTriggerPopUpWindow(QSLGuideusersToCommentType.nonMember)
             print("消息已发送")
         } catch {
             print("发送消息失败!")

+ 3 - 3
QuickSearchLocation/Classes/Common/View/QSLCountdownView.swift

@@ -9,7 +9,7 @@ import UIKit
 import YYText
 
 class QSLCountdownView: UIView {
-    private let label = YYLabel()
+    let label = YYLabel()
     private var countdownType: Int  // 1 :首页优惠券 2:引导页
         
     // 自定义初始化方法,传入Int参数
@@ -49,10 +49,10 @@ class QSLCountdownView: UIView {
                 // 设置数字背景
                 let bgColor = UIColor.white
                 let bgBorder = YYTextBorder(fill: bgColor, cornerRadius: 2)
-                bgBorder.insets = UIEdgeInsets(top: -3, left: -2.5, bottom: -2, right: -2)
+                bgBorder.insets = UIEdgeInsets(top: -3, left: -3.5, bottom: -2, right: -3)
                 
                 let bgBorder1 = YYTextBorder(fill: UIColor.clear, cornerRadius: 0)
-                bgBorder1.insets = UIEdgeInsets(top: -3, left: -2, bottom: -2, right: -2)
+                bgBorder1.insets = UIEdgeInsets(top: -3, left: -3, bottom: -2, right: -3)
                 
                 // 遍历每个字符
                 for (index, char) in timeAttributedString.string.enumerated() {

+ 1 - 1
QuickSearchLocation/Classes/Main/SceneDelegate.swift

@@ -30,7 +30,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
         // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
         if self.isShowTipView {
             ///判断要不要弹引导用户去评价
-            QSLGuideusersToCommentManager.commentShare.manageWhetherTriggerPopUpWindow(QSLGuideusersToCommentType.nonMember)
+            //QSLGuideusersToCommentManager.commentShare.manageWhetherTriggerPopUpWindow(QSLGuideusersToCommentType.nonMember)
         }
         self.isShowTipView = false
     }

+ 9 - 4
QuickSearchLocation/Classes/Pages/QSLAdd/Controller/QSLAddController.swift

@@ -50,7 +50,7 @@ class QSLAddController: QSLBaseController {
     
     lazy var addTitleIcon: UILabel = {
         let label = UILabel()
-        label.text("查找好友的手机号码")
+        label.text("查找好友")
         label.textColor = .hexStringColor(hexString: "#202020")
         label.mediumFont(17)
         return label
@@ -177,11 +177,16 @@ class QSLAddController: QSLBaseController {
 //        }
 //        
         if !QSLBaseManager.shared.isVip() {
-            if let currentWindow = UIApplication.keyWindow {
-                QSLAddFriendSuccessAlertView.alert(view: currentWindow) {
-                    QSLJumpManager.shared.pushToVip(type: .add)
+            QSLLoading.show()
+            DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
+                QSLLoading.hide()
+                if let currentWindow = UIApplication.keyWindow {
+                    QSLAddFriendSuccessAlertView.alert(view: currentWindow) {
+                        QSLJumpManager.shared.pushToVip(type: .add)
+                    }
                 }
             }
+            
             return
         }
         

+ 32 - 11
QuickSearchLocation/Classes/Pages/QSLHome/Controller/QSLHomeController.swift

@@ -54,13 +54,23 @@ class QSLHomeController: QSLBaseController {
             vc.modalPresentationStyle = .fullScreen
             self.present(vc, animated: false)
             vc.dismissHandler = {[weak self] isCancel in
-                QSLGuideusersToCommentManager.commentShare.noMemberPositiveReviewPopWindow {
+                if(UserDefaults.standard.value(forKey: "QSLShowHomeReview") != nil){
                     if let currentWindow = UIApplication.keyWindow {
                         QSLHomeAddFriendView.alert(view: currentWindow) {
                             QSLJumpManager.shared.pushToAdd(type: .homealert)
                         }
                     }
+                }else{
+                    UserDefaults.standard.setValue("1", forKey: "QSLShowHomeReview")
+                    QSLGuideusersToCommentManager.commentShare.noMemberPositiveReviewPopWindow {
+                        if let currentWindow = UIApplication.keyWindow {
+                            QSLHomeAddFriendView.alert(view: currentWindow) {
+                                QSLJumpManager.shared.pushToAdd(type: .homealert)
+                            }
+                        }
+                    }
                 }
+                
             }
         }
         
@@ -132,12 +142,23 @@ class QSLHomeController: QSLBaseController {
         return _homeAuthHeaderView
     }()
     
-    lazy var homeButtonsView = {
-        
-        let _homeButtonsView = QSLHomeButtonView()
-        return _homeButtonsView
+    @objc func homeFriendBtnAction(){
+        QSLJumpManager.shared.pushToAdd(type: .homesmall)
+    }
+    
+    lazy var homeFriendBtn: UIButton = {
+        let _homeResortBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 56.rpx, height: 56.rpx))
+        _homeResortBtn.image(UIImage(named: "home_find_friend"))
+        _homeResortBtn.addTarget(self, action: #selector(homeFriendBtnAction), for: .touchUpInside)
+        return _homeResortBtn
     }()
     
+//    lazy var homeButtonsView = {
+//        
+//        let _homeButtonsView = QSLHomeButtonView()
+//        return _homeButtonsView
+//    }()
+    
     /// 定位按钮
     lazy var homeLocateBtnView = {
         
@@ -749,12 +770,12 @@ extension QSLHomeController {
             make.edges.equalTo(0)
         }
         
-//        view.addSubview(homeButtonsView)
-//        homeButtonsView.snp.makeConstraints { make in
-//            make.size.equalTo(CGSize(width: 40, height: 104))
-//            make.top.equalTo(QSLConst.qsl_kStatusBarFrameH + 164)
-//            make.right.equalTo(QSLHomeViewModel.UX.viewRight)
-//        }
+        view.addSubview(homeFriendBtn)
+        homeFriendBtn.snp.makeConstraints { make in
+            make.size.equalTo(CGSize(width: 56.rpx, height: 56.rpx))
+            make.top.equalTo(QSLConst.qsl_kStatusBarFrameH + 28.rpx)
+            make.right.equalTo(-2.rpx)
+        }
 //        
 //        view.addSubview(homeLocateBtnView)
 //        homeLocateBtnView.snp.makeConstraints { make in

+ 1 - 1
QuickSearchLocation/Classes/Pages/QSLHome/View/QSLHomeAddFriendAlertView.swift

@@ -27,7 +27,7 @@ class QSLHomeAddFriendView: UIView {
     lazy var titleLabel: UILabel = {
       
         let label = UILabel()
-        label.text("实时定位轨迹")
+        label.text("查找好友定位")
         label.boldFont(30)
         label.textColor = QSLColor.textColor_333
         return label

+ 51 - 31
QuickSearchLocation/Classes/Pages/QSLHome/View/QSLHomeFriendView.swift

@@ -182,6 +182,13 @@ class QSLHomeFriendView: UIView {
                     name: Notification.Name("QSLHomeUpdateCouponViewNoti"),
                     object: nil
                 )
+        //更新首页优惠券价格
+        NotificationCenter.default.addObserver(
+                    self,
+                    selector: #selector(refreshCouponNotification(_:)),
+                    name: Notification.Name("QSLHomeRefreshCouponViewNoti"),
+                    object: nil
+                )
     }
     
     required init?(coder: NSCoder) {
@@ -326,43 +333,56 @@ extension QSLHomeFriendView: QSLHomeFriendTableViewCellDelegate {
         updateCouponViewVisibility(show: shouldShow)
     }
     
+    @objc private func refreshCouponNotification(_ notification: Notification) {
+        refreshCouponView()
+    }
+    
+    func refreshCouponView(){
+        if let model = QSLCountdownManager.shared.selectGood {
+            let amount : Int = Int((model.originalAmount - model.amount) / 100)
+            
+            let attr = NSMutableAttributedString()
+            
+            let firstText = "您有一订单未支付专属优惠券 "
+            let firstAttr = NSMutableAttributedString(string: firstText)
+            firstAttr.yy_font = UIFont.textM(10)
+            firstAttr.yy_color = UIColor.white
+            attr.append(firstAttr)
+            
+            if amount > 0 {
+                let secondText = "-¥\(amount)"
+                let secondAttr = NSMutableAttributedString(string: secondText)
+                secondAttr.yy_font = UIFont.textB(18)
+                secondAttr.yy_color = UIColor.hexStringColor(hexString: "#E1E3A3")
+                attr.append(secondAttr)
+            }
+            
+            self.couponLabel.attributedText = attr
+            
+            if(self.countdownLabel.label.text != nil){
+                return
+            }
+            
+            QSLCountdownManager.shared.updateHandler = { [weak self] timeString in
+                self?.countdownLabel.updateCountdownText(timeString)
+            }
+            QSLCountdownManager.shared.finishHandler  = { [weak self] in
+                self?.updateCouponViewVisibility(show: false)
+            }
+            QSLCountdownManager.shared.startCountdown()
+            
+        }
+    }
+    
     private func updateCouponViewVisibility(show: Bool) {
         if(couponView.isHidden == !show){
+            self.refreshCouponView()
             return
         }
         couponView.isHidden = !show
         
-        if show {
-            if let model = QSLCountdownManager.shared.selectGood {
-                let amount : Int = Int((model.originalAmount - model.amount) / 100)
-                
-                let attr = NSMutableAttributedString()
-                
-                let firstText = "您有一订单未支付专属优惠券 "
-                let firstAttr = NSMutableAttributedString(string: firstText)
-                firstAttr.yy_font = UIFont.textM(10)
-                firstAttr.yy_color = UIColor.white
-                attr.append(firstAttr)
-                
-                if amount > 0 {
-                    let secondText = "-¥\(amount)"
-                    let secondAttr = NSMutableAttributedString(string: secondText)
-                    secondAttr.yy_font = UIFont.textB(18)
-                    secondAttr.yy_color = UIColor.hexStringColor(hexString: "#E1E3A3")
-                    attr.append(secondAttr)
-                }
-                
-                self.couponLabel.attributedText = attr
-                
-                QSLCountdownManager.shared.updateHandler = { [weak self] timeString in
-                    self?.countdownLabel.updateCountdownText(timeString)
-                }
-                QSLCountdownManager.shared.finishHandler  = { [weak self] in
-                    self?.updateCouponViewVisibility(show: false)
-                }
-                QSLCountdownManager.shared.startCountdown()
-                
-            }
+        if (show) {
+            self.refreshCouponView()
             
             couponViewTopConstraint?.update(offset: 8.rpx)
             friBgViewTopConstraint?.update(offset: 8.rpx) // 修改这里

+ 3 - 0
QuickSearchLocation/Classes/Pages/QSLLogin/Controller/QSLLoginViewController.swift

@@ -15,6 +15,7 @@ enum QSLLoginJumpType: Int {
     case road    // 查看轨迹
     case contact // 添加紧急联系人
     case onQucikLogin // 意见登录
+    case member // 会员页
 }
 
 class QSLLoginViewController: QSLBaseController {
@@ -220,6 +221,8 @@ class QSLLoginViewController: QSLBaseController {
                 gravityInstance?.track(QSLGravityConst.login_show, properties: ["id": 1004])
             case .onQucikLogin:
                 gravityInstance?.track(QSLGravityConst.login_show, properties: ["id": 1005])
+            case .member:
+                gravityInstance?.track(QSLGravityConst.login_show, properties: ["id": 1006])
             }
         }
     }

+ 30 - 49
QuickSearchLocation/Classes/Pages/QSLVip/Controller/QSLActivityVipVC.swift

@@ -27,11 +27,11 @@ class QSLActivityVipVC: QSLBaseController {
         
         self.updateServiceLabelText(showSubscribe: false)
         
-        if(QSLBaseManager.shared.isLogin()){
-            self.naviResumeBtn.isHidden = true
-        }else{
-            self.naviResumeBtn.isHidden = true
-        }
+//        if(QSLBaseManager.shared.isLogin()){
+//            self.naviResumeBtn.isHidden = false
+//        }else{
+//            self.naviResumeBtn.isHidden = true
+//        }
     }
     
     @objc func privacyAction() {
@@ -59,7 +59,9 @@ class QSLActivityVipVC: QSLBaseController {
     }
     
     @objc func payBtnAction() {
-        
+        if let curGood = self.selectGood {
+            QSLCountdownManager.shared.selectGood = curGood
+        }
         switch self.selectGood?.level {
         case 100 :
             gravityInstance?.track(QSLGravityConst.activity_vip_click, properties: ["package_type": "day"])
@@ -92,14 +94,14 @@ class QSLActivityVipVC: QSLBaseController {
         }
         
         if goodList.count > 0, let selectGood = self.selectGood {
-            QSLLoading.show()
+            QSLLoading.showWithCancel()
             QSLVipManager.shared.startPay(goods: selectGood) { [self] status, outTradeNo in
                 QSLVipManager.shared.isPaying = false
                 if status == .success {
                     QSLLoading.success(text: "支付成功")
                     
                     //弹出是否好评的弹窗
-                    QSLGuideusersToCommentManager.commentShare.manageWhetherTriggerPopUpWindow(QSLGuideusersToCommentType.member)
+                    //QSLGuideusersToCommentManager.commentShare.manageWhetherTriggerPopUpWindow(QSLGuideusersToCommentType.member)
                     
                     // 引力传递支付事件
                     if let selectGood = self.selectGood {
@@ -117,6 +119,10 @@ class QSLActivityVipVC: QSLBaseController {
                     DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                         self.navigationController?.popViewController(animated: true)
                         NotificationCenter.default.post(name: QSLNotification.QSLRefreshMember, object: nil)
+                        
+                        if(!QSLBaseManager.shared.isLogin()){
+                            QSLJumpManager.shared.pushToLogin(type: .member)
+                        }
                     }
                     
                 } else if status == .cancel {
@@ -130,8 +136,6 @@ class QSLActivityVipVC: QSLBaseController {
                     QSLLoading.error(text: "支付失败")
 //                    payFailAlertTip()
                     self.isCancel = true
-                } else if status == .searchFail {
-                    QSLLoading.error(text: "查询订单失败,请稍后重试")
                 }
             }
         }
@@ -174,12 +178,11 @@ class QSLActivityVipVC: QSLBaseController {
                     height = Int(134.rpx + CGFloat(remainingRows) * 124.rpx)
                 }
                 
-                self.vipItemView.snp.updateConstraints { make in
+                self.goodsCollectionView.snp.updateConstraints { make in
                     make.height.equalTo(height)
                 }
                 
-                self.view.layoutIfNeeded()
-                self.scrollView.contentSize = CGSize(width: 0.0, height: self.vipItemView.qsl_y+CGFloat(height)+100+QSLConst.qsl_kTabbarBottom/2+12)
+                self.scrollView.contentSize = CGSize(width: 0.0, height: self.goodsCollectionView.qsl_y+CGFloat(height)+100+QSLConst.qsl_kTabbarBottom/2+12)
                 
                 QSLCountdownManager.shared.selectGood = self.goodList[0]
 
@@ -371,11 +374,6 @@ class QSLActivityVipVC: QSLBaseController {
         return button
     }()
     
-    lazy var vipBg: UIView = {
-        let imageView = UIView()
-        return imageView
-    }()
-    
     lazy var vipTopBg: UIImageView = {
         let imageView = UIImageView()
         imageView.image = UIImage(named: "vip_activity_top_bg")
@@ -465,11 +463,6 @@ class QSLActivityVipVC: QSLBaseController {
         return pageControl
     }()
     
-    lazy var vipItemView: UIView = {
-        let item = UIView()
-        return item
-    }()
-    
     lazy var goodsCollectionView: UICollectionView = {
             
         let layout = UICollectionViewFlowLayout()
@@ -533,7 +526,9 @@ extension QSLActivityVipVC{
         
         self.view.addSubview(scrollView)
         scrollView.snp.makeConstraints { make in
-            make.bottom.top.left.right.equalTo(0)
+            make.top.left.equalTo(0)
+            make.width.equalTo(QSLConst.qsl_kScreenW)
+            make.height.equalTo(QSLConst.qsl_kScreenH)
         }
         
         self.view.addSubview(vipNaviView)
@@ -565,15 +560,10 @@ extension QSLActivityVipVC{
             make.centerY.equalTo(backButton.snp.centerY)
         }
         
-        self.scrollView.addSubview(vipBg)
-        vipBg.snp.makeConstraints { make in
-            make.top.bottom.left.equalTo(0)
-            make.width.equalTo(QSLConst.qsl_kScreenW)
-        }
-        
-        vipBg.addSubview(vipTopBg)
+        self.scrollView.addSubview(vipTopBg)
         vipTopBg.snp.makeConstraints { make in
-            make.left.top.right.equalTo(0)
+            make.left.top.equalTo(0)
+            make.width.equalTo(QSLConst.qsl_kScreenW)
             make.height.equalTo(185.rpx)
         }
         
@@ -593,11 +583,12 @@ extension QSLActivityVipVC{
             make.width.equalTo(105.rpx)
         }
         
-        vipBg.addSubview(vipContentView)
+        self.scrollView.addSubview(vipContentView)
         vipContentView.snp.makeConstraints { make in
             make.top.equalTo(185.rpx)
-            make.left.right.equalTo(0.rpx)
-            make.height.equalTo(QSLConst.qsl_kScreenH)
+            make.left.equalTo(0)
+            make.width.equalTo(QSLConst.qsl_kScreenW)
+            make.height.equalTo(230.rpx)
         }
         
         vipContentView.addSubview(addTitleIconBg)
@@ -628,24 +619,14 @@ extension QSLActivityVipVC{
             make.top.equalTo(cycleScrollView.snp.bottom).offset(17.rpx)
         }
         
-        vipContentView.snp.remakeConstraints { make in
-            make.top.equalTo(185.rpx)
-            make.left.right.equalTo(0.rpx)
-            make.bottom.equalTo(pageControl.snp.bottom).offset(10.rpx)  // 这里只约束到 pageControl 的底部
-        }
-        
-        vipBg.addSubview(vipItemView)
-        vipItemView.snp.makeConstraints { make in
-            make.left.right.equalTo(0)
+        self.scrollView.addSubview(goodsCollectionView)
+        goodsCollectionView.snp.makeConstraints { make in
+            make.left.equalTo(0)
             make.height.equalTo(150.rpx)
+            make.width.equalTo(QSLConst.qsl_kScreenW)
             make.top.equalTo(vipContentView.snp.bottom).offset(0)
         }
         
-        vipItemView.addSubview(goodsCollectionView)
-        goodsCollectionView.snp.makeConstraints { make in
-            make.left.right.top.bottom.equalTo(0)
-        }
-        
         self.view.addSubview(bottomView)
         bottomView.snp.makeConstraints { make in
             make.right.equalTo(-12.rpx)

+ 15 - 11
QuickSearchLocation/Classes/Pages/QSLVip/Controller/QSLVipController.swift

@@ -466,11 +466,11 @@ class QSLVipController: QSLBaseController {
         
         calculateBuyCount()
         
-        if(QSLBaseManager.shared.isLogin()){
-            self.resumeBtn.isHidden = true
-        }else{
-            self.resumeBtn.isHidden = true
-        }
+//        if(QSLBaseManager.shared.isLogin()){
+//            self.resumeBtn.isHidden = false
+//        }else{
+//            self.resumeBtn.isHidden = true
+//        }
 
         if let type = self.type {
             switch type {
@@ -576,6 +576,9 @@ extension QSLVipController {
     
     // 支付按钮点击
     @objc func unlockBtnAction() {
+        if let curGood = self.selectGood {
+            QSLCountdownManager.shared.selectGood = curGood
+        }
         
         switch self.selectGood?.level {
         case 100 :
@@ -618,18 +621,17 @@ extension QSLVipController {
         }
         
         if goodList.count > 0, let selectGood = self.selectGood {
-            QSLLoading.show()
+            QSLLoading.showWithCancel()
             QSLVipManager.shared.startPay(goods: selectGood) { [self] status, outTradeNo in
                 QSLVipManager.shared.isPaying = false
                 if status == .success {
                     QSLLoading.success(text: "支付成功")
-                    
+                    self.isCancel = true
                     gravityInstance?.track(QSLGravityConst.new_vip_result, properties: ["is_member":QSLBaseManager.shared.isVip(),"purchase_result": "success","pay_amount":Int32(selectGood.amount)])
                     //支付成功埋点
                     gravityInstance?.track(QSLGravityConst.vip_submit_success, properties: ["id": 01001])
-                    
                     //弹出是否好评的弹窗
-                    QSLGuideusersToCommentManager.commentShare.manageWhetherTriggerPopUpWindow(QSLGuideusersToCommentType.member)
+//                    QSLGuideusersToCommentManager.commentShare.manageWhetherTriggerPopUpWindow(QSLGuideusersToCommentType.member)
                     
                     // 引力传递支付事件
                     if let selectGood = self.selectGood {
@@ -685,6 +687,10 @@ extension QSLVipController {
                     DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                         self.navigationController?.popViewController(animated: true)
                         NotificationCenter.default.post(name: QSLNotification.QSLRefreshMember, object: nil)
+                        
+                        if(!QSLBaseManager.shared.isLogin()){
+                            QSLJumpManager.shared.pushToLogin(type: .member)
+                        }
                     }
                     
                 } else if status == .cancel {
@@ -698,8 +704,6 @@ extension QSLVipController {
                     QSLLoading.error(text: "支付失败")
                     payFailAlertTip()
                     gravityInstance?.track(QSLGravityConst.new_vip_retention_show, properties: ["trigger_type":"fail"])
-                } else if status == .searchFail {
-                    QSLLoading.error(text: "查询订单失败,请稍后重试")
                 }
             }
         }

+ 252 - 23
QuickSearchLocation/Classes/Pages/QSLVip/QSLVipManager.swift

@@ -88,37 +88,212 @@ extension QSLVipManager {
     
     // 恢复订阅
     func restoreAction(complete: restoreComplete?) {
-        
         if complete != nil {
             self.restoreCompleteClosure = complete
         }
         
-        // 支付前查询自动续费的订单,将订单置为支付状态
-        let transactions = SKPaymentQueue.default().transactions
-        if transactions.count > 0 {
-            for tran in transactions {
-                if tran.transactionState == .purchased {
-                    SKPaymentQueue.default().finishTransaction(tran)
-                }
+        self.isPaying = true
+        self.isCheck = true
+        
+        print("开始恢复订阅")
+        QSLVipManager.shared.checkTransAction {isSuccess, response in
+            if(isSuccess){
+                self.restoreOrder()
+            }else{
+                self.isRestoring = false
+                self.restoreCompleteClosure?(false)
             }
         }
+    }
+    
+    func restoreOrder() {
         
-        self.isPaying = true
-        self.isCheck = false
+        if isRestoring { return }
         
-        print("开始恢复订阅")
+        if let receiptUrl = Bundle.main.appStoreReceiptURL {
+            let receiptData = try? Data(contentsOf: receiptUrl)
+            if let receiptString = receiptData?.base64EncodedString(options: .endLineWithLineFeed) {
+                debugPrint("receiptString = \(String(describing: receiptString))")
+                self.requestRestoreOrder(receiptData: receiptString)
+                return
+            }
+        }
+        
+        isRestoring = true
         SKPaymentQueue.default().restoreCompletedTransactions()
         
-        Timer.scheduledTimer(withTimeInterval: 15.0, repeats: false) { timer in
-            if let restoreCompleteClosure = self.restoreCompleteClosure {
-                print("恢复订阅 15秒超时")
-                restoreCompleteClosure(false)
+        
+    }
+    
+    func checkTransAction(complete1: ((Bool, [String:Any]) -> Void)?) {
+       
+        if #available(iOS 13.0, *) {
+            Task{
+                var inSubscribeAppleGoodId = ""
+                var inSubscribeAppAccountToken = ""
+
+
+                if #available(iOS 15.0, *) {
+                    var activeTransactions: [String: StoreKit.Transaction] = [:]  // groupID → transaction
+                    var allActiveProductIDs: [String] = []  // 所有有效的商品ID
+                    var pendingDowngradeProductID: String? = nil
+
+
+                    // 首先检查未完成的交易,获取降级后的商品ID
+                    for await result in Transaction.unfinished {
+                        guard case .verified(let transaction) = result,
+                            transaction.productType == .autoRenewable
+                        else {
+                            continue
+                        }
+
+
+                        // 检查这个未完成的交易是否是降级交易
+                        if let product = try? await Product.products(for: [transaction.productID]).first {
+                            print("发现未完成的订阅交易: \(transaction.productID)")
+
+
+                            // 如果未完成的交易购买时间比当前有效订阅晚,很可能是降级
+                            let purchaseDate = transaction.purchaseDate
+
+
+                            // 检查当前有效订阅来判断是否为降级
+                            for await currentResult in Transaction.currentEntitlements {
+                                guard case .verified(let currentTransaction) = currentResult,
+                                    currentTransaction.productType == .autoRenewable
+                                else {
+                                    continue
+                                }
+
+
+                                // 如果未完成交易的购买时间晚于当前交易,且产品不同,则可能是降级
+                                if purchaseDate > currentTransaction.purchaseDate
+                                    && transaction.productID != currentTransaction.productID
+                                {
+                                    print("检测到降级订阅: \(transaction.productID)")
+                                    pendingDowngradeProductID = transaction.productID
+                                    break
+                                }
+                            }
+                        }
+                    }
+
+
+                    // 然后检查当前有效的订阅
+                    for await result in Transaction.currentEntitlements {
+                        guard case .verified(let transaction) = result,
+                            transaction.productType == .autoRenewable
+                        else {
+                            continue
+                        }
+
+
+                        // 跳过过期或撤销的
+                        if let expirationDate = transaction.expirationDate,
+                            expirationDate < Date()
+                        {
+                            continue
+                        }
+                        if transaction.revocationDate != nil {
+                            continue
+                        }
+
+
+                        // 添加到所有有效商品ID列表
+                        allActiveProductIDs.append(transaction.productID)
+                        print("发现有效订阅: \(transaction.productID)")
+
+
+                        // 获取订阅组 ID 和产品信息
+                        guard let product = try? await Product.products(for: [transaction.productID]).first,
+                            let groupID = product.subscription?.subscriptionGroupID
+                        else {
+                            continue
+                        }
+
+
+                        // 如果还没找到降级商品,继续通过订阅状态检查
+                        if pendingDowngradeProductID == nil {
+                            do {
+                                let statuses = try await product.subscription?.status ?? []
+                                for status in statuses {
+                                    switch status.state {
+                                    case .subscribed:
+                                        // 检查是否有pending的降级
+                                        if case .verified(let renewalInfo) = status.renewalInfo,
+                                            let autoRenewProductID = renewalInfo.autoRenewPreference,
+                                            autoRenewProductID != transaction.productID
+                                        {
+                                            // 发现pending的产品变更,通常是降级
+                                            print(
+                                                "通过renewalInfo检测到pending的订阅变更: \(autoRenewProductID)")
+                                            pendingDowngradeProductID = autoRenewProductID
+                                        }
+                                    default:
+                                        break
+                                    }
+                                }
+                            } catch {
+                                print("检查订阅状态失败: \(error)")
+                            }
+                        }
+
+
+                        // 每个订阅组只保留最新的
+                        if let current = activeTransactions[groupID] {
+                            if transaction.purchaseDate > current.purchaseDate {
+                                activeTransactions[groupID] = transaction
+                            }
+                        } else {
+                            activeTransactions[groupID] = transaction
+                        }
+                    }
+
+
+                    print("所有有效订阅商品ID: \(allActiveProductIDs)")
+                    print("按订阅组分组的订阅数量: \(activeTransactions.count)")
+
+
+                    // 优先使用通过未完成交易或renewalInfo找到的降级商品ID
+                    if let pendingProductID = pendingDowngradeProductID {
+                        inSubscribeAppleGoodId = pendingProductID
+                        // 对于pending的订阅,我们无法获取appAccountToken,使用当前订阅的
+                        if let transaction = activeTransactions.values.first {
+                            inSubscribeAppAccountToken = transaction.appAccountToken?.uuidString ?? ""
+                        }
+                        print("使用降级订阅商品ID: \(pendingProductID)")
+                    } else if let transaction = activeTransactions.values.first {
+                        // 如果有多个订阅组,这里可能需要根据业务逻辑选择合适的订阅
+                        inSubscribeAppleGoodId = transaction.productID
+                        inSubscribeAppAccountToken = transaction.appAccountToken?.uuidString ?? ""
+                        print("当前使用的订阅商品ID: \(transaction.productID)")
+
+
+                        // 如果有多个订阅,打印警告
+                        if activeTransactions.count > 1 {
+                            print("⚠️ 检测到多个订阅组的订阅,当前使用第一个: \(transaction.productID)")
+                            print("所有订阅组的商品ID: \(activeTransactions.values.map { $0.productID })")
+                        }
+                    } else {
+                        print("无当前有效订阅")
+                    }
+                }
+            
+                if(inSubscribeAppleGoodId.count == 0 || inSubscribeAppAccountToken.count == 0){
+                    complete1?(false, [:])
+                }else{
+                    complete1?(true, ["appleGoodsId":inSubscribeAppleGoodId,"appAccountToken":inSubscribeAppAccountToken])
+                }
+                print("inSubscribeAppleGoodId:\(inSubscribeAppleGoodId)")
+                print("inSubscribeAppAccountToken:\(inSubscribeAppAccountToken)")
+                
             }
-            self.restoreCompleteClosure = nil
-            // 停止定时器并从运行循环中移除
-            timer.invalidate()
+        }else{
+            complete1?(false, [:])
         }
+        
     }
+
 }
 
 // 网络请求
@@ -234,7 +409,7 @@ extension QSLVipManager {
     }
 }
 
-extension QSLVipManager: SKPaymentTransactionObserver {
+extension QSLVipManager: SKPaymentTransactionObserver, SKRequestDelegate {
     
     // 提交内购
     func submitIAP() {
@@ -332,10 +507,10 @@ extension QSLVipManager: SKPaymentTransactionObserver {
                     }
                     self.payCompleteCloure = nil
                     // 需要前台响应
-                    if let restoreCompleteClosure = self.restoreCompleteClosure {
-                        restoreCompleteClosure(false)
-                    }
-                    self.restoreCompleteClosure = nil
+//                    if let restoreCompleteClosure = self.restoreCompleteClosure {
+//                        restoreCompleteClosure(false)
+//                    }
+//                    self.restoreCompleteClosure = nil
                     SKPaymentQueue.default().finishTransaction(tran)
                     
                 case .deferred:
@@ -349,5 +524,59 @@ extension QSLVipManager: SKPaymentTransactionObserver {
     
     func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
         print("恢复购买失败\(error.localizedDescription)")
+        self.restoreCompleteClosure?(false)
+    }
+    
+    public func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
+        completeRestoreTransactions(queue, error: nil)
+    }
+    
+    func completedHandle(withTrans: SKPaymentTransaction) {
+      
+        let receiptURL = Bundle.main.appStoreReceiptURL
+        var receiptData:NSData? = nil
+        if let url = receiptURL {
+            receiptData = NSData(contentsOf: url)
+        }
+        
+        let receiptString = receiptData?.base64EncodedString(options: .endLineWithLineFeed)
+        if let receiptStr = receiptString {
+            self.requestRestoreOrder(receiptData: receiptStr)
+        }else{
+            self.isRestoring = false
+            let req = SKReceiptRefreshRequest()
+            req.delegate = self
+            req.start()
+        }
+    }
+    
+    private func completeRestoreTransactions(_ queue: SKPaymentQueue, error: Error?) {
+        if queue.transactions.count > 0 {
+            let transaction = queue.transactions[0]
+            print("restore:::\(transaction)")
+            completedHandle(withTrans: transaction)
+        } else {
+            self.restoreCompleteClosure?(false)
+        }
+
+    }
+    
+    public func requestDidFinish(_ request: SKRequest) {
+        if  request.isKind(of: SKProductsRequest.self) {
+           
+        }else if request.isKind(of: SKReceiptRefreshRequest.self) {
+            debugPrint("刷新本地凭证请求完成(注意:失败和成功都算完成) SKReceiptRefreshRequest: \(request)")
+            // 开始本地内购支付凭证验证
+            self.restoreOrder()
+        }
+        
+    }
+
+    public func request(_ request: SKRequest, didFailWithError error: Error) {
+        if  request.isKind(of: SKProductsRequest.self) {
+           
+        }else if request.isKind(of: SKReceiptRefreshRequest.self) {
+            self.restoreCompleteClosure?(false)
+        }
     }
 }

+ 2 - 1
QuickSearchLocation/Resources/Assets.xcassets/Home/home_activity_bg.imageset/Contents.json

@@ -5,11 +5,12 @@
       "scale" : "1x"
     },
     {
-      "filename" : "顶部卡片.png",
+      "filename" : "顶部卡片@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
+      "filename" : "顶部卡片.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
QuickSearchLocation/Resources/Assets.xcassets/Home/home_activity_bg.imageset/顶部卡片.png


BIN
QuickSearchLocation/Resources/Assets.xcassets/Home/home_activity_bg.imageset/顶部卡片@2x.png


+ 22 - 0
QuickSearchLocation/Resources/Assets.xcassets/Home/home_find_friend.imageset/Contents.json

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

BIN
QuickSearchLocation/Resources/Assets.xcassets/Home/home_find_friend.imageset/找TA (1).png


BIN
QuickSearchLocation/Resources/Assets.xcassets/Home/home_find_friend.imageset/找TA.png


+ 2 - 1
QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_s.imageset/Contents.json

@@ -5,11 +5,12 @@
       "scale" : "1x"
     },
     {
-      "filename" : "Group 40405.png",
+      "filename" : "Group 42960@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
+      "filename" : "Group 42960.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_s.imageset/Group 40405.png


BIN
QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_s.imageset/Group 42960.png


BIN
QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_s.imageset/Group 42960@2x.png


+ 2 - 1
QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_uns.imageset/Contents.json

@@ -5,11 +5,12 @@
       "scale" : "1x"
     },
     {
-      "filename" : "Group 42961.png",
+      "filename" : "Group 40405.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
+      "filename" : "Group 40405-1.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_uns.imageset/Group 40405-1.png


QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_uns.imageset/Group 42961.png → QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_item_uns.imageset/Group 40405.png


+ 1 - 1
QuickSearchLocation/Resources/Assets.xcassets/Vip/activity/vip_activity_top_title.imageset/Contents.json

@@ -1,11 +1,11 @@
 {
   "images" : [
     {
-      "filename" : "文字.png",
       "idiom" : "universal",
       "scale" : "1x"
     },
     {
+      "filename" : "文字.png",
       "idiom" : "universal",
       "scale" : "2x"
     },

+ 2 - 1
QuickSearchLocation/Resources/Assets.xcassets/Vip/vip_comment_give_thumb.imageset/Contents.json

@@ -5,11 +5,12 @@
       "scale" : "1x"
     },
     {
-      "filename" : "vip_comment_give_thumb@2x.png",
+      "filename" : "Group 40497@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
+      "filename" : "Group 40497.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
QuickSearchLocation/Resources/Assets.xcassets/Vip/vip_comment_give_thumb.imageset/Group 40497.png


BIN
QuickSearchLocation/Resources/Assets.xcassets/Vip/vip_comment_give_thumb.imageset/Group 40497@2x.png


BIN
QuickSearchLocation/Resources/Assets.xcassets/Vip/vip_comment_give_thumb.imageset/vip_comment_give_thumb@2x.png