diff --git a/QuickLocation.xcodeproj/project.pbxproj b/QuickLocation.xcodeproj/project.pbxproj index 7de71c27..aa1c8ebe 100644 --- a/QuickLocation.xcodeproj/project.pbxproj +++ b/QuickLocation.xcodeproj/project.pbxproj @@ -168,8 +168,6 @@ 3062E8C02FCED7BB00CEF511 /* GroupIconListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3062E8BF2FCED7BB00CEF511 /* GroupIconListView.swift */; }; 3062E8C22FCFB86800CEF511 /* CreateGroupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3062E8C12FCFB86800CEF511 /* CreateGroupViewModel.swift */; }; 3062E8C42FCFC90F00CEF511 /* CreateGroupVipPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3062E8C32FCFC90F00CEF511 /* CreateGroupVipPopView.swift */; }; - 3062E8C72FCFD02F00CEF511 /* VipRechargeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3062E8C62FCFD02F00CEF511 /* VipRechargeView.swift */; }; - 3062E8C92FCFD03B00CEF511 /* VipRechargeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3062E8C82FCFD03B00CEF511 /* VipRechargeVC.swift */; }; 307073E12FD15F50004C37CC /* GroupIMService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 307073E02FD15F50004C37CC /* GroupIMService.swift */; }; 307073E52FD18A20004C37CC /* GroupChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 307073E32FD18A20004C37CC /* GroupChatView.swift */; }; 307073E62FD18A20004C37CC /* GroupChatVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 307073E22FD18A20004C37CC /* GroupChatVC.swift */; }; @@ -196,8 +194,6 @@ 30A87A6F2FEF7BE40095E7C6 /* SearchLocationResultVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A87A6E2FEF7BE40095E7C6 /* SearchLocationResultVC.swift */; }; 30A87A712FEF7BED0095E7C6 /* SearchLocationResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A87A702FEF7BED0095E7C6 /* SearchLocationResultView.swift */; }; 30ACD54C2FF6336000174861 /* PopupWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30ACD54B2FF6336000174861 /* PopupWindow.swift */; }; - 30ACD54E2FF7942E00174861 /* PromotionalActivitiesVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30ACD54D2FF7942E00174861 /* PromotionalActivitiesVC.swift */; }; - 30ACD5502FF7943A00174861 /* PromotionalActivitiesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30ACD54F2FF7943A00174861 /* PromotionalActivitiesView.swift */; }; 30ACD67B2FF7B36A00174861 /* PopupQueueManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30ACD67A2FF7B36A00174861 /* PopupQueueManager.swift */; }; 30B2D0B12FEB111100CA0001 /* PhotoPickerStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B2D0B02FEB111100CA0001 /* PhotoPickerStore.swift */; }; 30B2D0B32FEB111100CA0001 /* PhotoPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30B2D0B22FEB111100CA0001 /* PhotoPickerView.swift */; }; @@ -262,13 +258,9 @@ 30D891F52FE22E0600E958FD /* OrderAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D891F42FE22E0600E958FD /* OrderAPI.swift */; }; 30D891F72FE22E6E00E958FD /* OrderService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D891F62FE22E6E00E958FD /* OrderService.swift */; }; 30DA36BD2FECC5AB008D5A2C /* CreateScheduleVipPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DA36BC2FECC5AB008D5A2C /* CreateScheduleVipPopView.swift */; }; - 30DC18522FD009CD0041DCD1 /* VipExpenseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DC18512FD009CD0041DCD1 /* VipExpenseModel.swift */; }; - 30DC18542FD00C4A0041DCD1 /* VipRechargeVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DC18532FD00C4A0041DCD1 /* VipRechargeVM.swift */; }; 30DC185A2FD11E7A0041DCD1 /* WebOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DC18562FD11E7A0041DCD1 /* WebOperations.swift */; }; 30DC185B2FD11E7A0041DCD1 /* NavigationTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DC18552FD11E7A0041DCD1 /* NavigationTitleView.swift */; }; 30DC185C2FD11E7A0041DCD1 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DC18572FD11E7A0041DCD1 /* WebViewController.swift */; }; - 30DC185E2FD1211D0041DCD1 /* VipRightsVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DC185D2FD1211D0041DCD1 /* VipRightsVC.swift */; }; - 30DC18602FD12A020041DCD1 /* VipWaivePopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DC185F2FD12A020041DCD1 /* VipWaivePopView.swift */; }; 30EBF7202FEFD6F2009A8A87 /* GroupChooseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EBF71F2FEFD6F2009A8A87 /* GroupChooseView.swift */; }; 30EFF2992FD65FB000EB35D4 /* VoicePlayerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFF2982FD65FB000EB35D4 /* VoicePlayerManager.swift */; }; 30EFF29B2FD668C900EB35D4 /* VoiceRecordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFF29A2FD668C900EB35D4 /* VoiceRecordView.swift */; }; @@ -287,7 +279,6 @@ 30EFF3C22FDA3F7F00EB35D4 /* AppCacheManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFF3C12FDA3F7F00EB35D4 /* AppCacheManager.swift */; }; 30EFF3C42FDA431D00EB35D4 /* ChangePhoneVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFF3C32FDA431D00EB35D4 /* ChangePhoneVC.swift */; }; 30EFF3C62FDA433E00EB35D4 /* ChangePhoneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFF3C52FDA433E00EB35D4 /* ChangePhoneView.swift */; }; - 30EFF3CA2FDA575600EB35D4 /* CancellationPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFF3C92FDA575600EB35D4 /* CancellationPopView.swift */; }; 30EFF3CD2FDA668A00EB35D4 /* MyProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFF3CC2FDA668A00EB35D4 /* MyProfileView.swift */; }; 30EFF3CF2FDA669800EB35D4 /* MyProfileVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFF3CE2FDA669800EB35D4 /* MyProfileVC.swift */; }; 30EFF3D12FDA69EC00EB35D4 /* AvatarIconListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EFF3D02FDA69EC00EB35D4 /* AvatarIconListVC.swift */; }; @@ -374,6 +365,7 @@ 55B250043038000100786504 /* MailboxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B250033038000100786503 /* MailboxView.swift */; }; 55B250063038000100786506 /* MailboxViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B250053038000100786505 /* MailboxViewController.swift */; }; 55B250083038000100786508 /* MailboxDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B250073038000100786507 /* MailboxDetailViewController.swift */; }; + 55B26001304B000100786601 /* VersionUpgradePopVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B26000304B000100786600 /* VersionUpgradePopVC.swift */; }; 55B261010000000100786601 /* PrivacySettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B261000000000100786600 /* PrivacySettingsViewController.swift */; }; 55BF752D2FFE53F70055DA57 /* LocationPermissionPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55BF752C2FFE53F70055DA57 /* LocationPermissionPopView.swift */; }; 55BF75352FFF91690055DA57 /* InteractionEmojiCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55BF75342FFF91690055DA57 /* InteractionEmojiCell.swift */; }; @@ -618,8 +610,6 @@ 3062E8BF2FCED7BB00CEF511 /* GroupIconListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupIconListView.swift; sourceTree = ""; }; 3062E8C12FCFB86800CEF511 /* CreateGroupViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupViewModel.swift; sourceTree = ""; }; 3062E8C32FCFC90F00CEF511 /* CreateGroupVipPopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupVipPopView.swift; sourceTree = ""; }; - 3062E8C62FCFD02F00CEF511 /* VipRechargeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VipRechargeView.swift; sourceTree = ""; }; - 3062E8C82FCFD03B00CEF511 /* VipRechargeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VipRechargeVC.swift; sourceTree = ""; }; 307073E02FD15F50004C37CC /* GroupIMService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupIMService.swift; sourceTree = ""; }; 307073E22FD18A20004C37CC /* GroupChatVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupChatVC.swift; sourceTree = ""; }; 307073E32FD18A20004C37CC /* GroupChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupChatView.swift; sourceTree = ""; }; @@ -646,8 +636,6 @@ 30A87A6E2FEF7BE40095E7C6 /* SearchLocationResultVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchLocationResultVC.swift; sourceTree = ""; }; 30A87A702FEF7BED0095E7C6 /* SearchLocationResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchLocationResultView.swift; sourceTree = ""; }; 30ACD54B2FF6336000174861 /* PopupWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupWindow.swift; sourceTree = ""; }; - 30ACD54D2FF7942E00174861 /* PromotionalActivitiesVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromotionalActivitiesVC.swift; sourceTree = ""; }; - 30ACD54F2FF7943A00174861 /* PromotionalActivitiesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromotionalActivitiesView.swift; sourceTree = ""; }; 30ACD67A2FF7B36A00174861 /* PopupQueueManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupQueueManager.swift; sourceTree = ""; }; 30B2D0B02FEB111100CA0001 /* PhotoPickerStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoPickerStore.swift; sourceTree = ""; }; 30B2D0B22FEB111100CA0001 /* PhotoPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoPickerView.swift; sourceTree = ""; }; @@ -713,13 +701,9 @@ 30D891F42FE22E0600E958FD /* OrderAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderAPI.swift; sourceTree = ""; }; 30D891F62FE22E6E00E958FD /* OrderService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderService.swift; sourceTree = ""; }; 30DA36BC2FECC5AB008D5A2C /* CreateScheduleVipPopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateScheduleVipPopView.swift; sourceTree = ""; }; - 30DC18512FD009CD0041DCD1 /* VipExpenseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VipExpenseModel.swift; sourceTree = ""; }; - 30DC18532FD00C4A0041DCD1 /* VipRechargeVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VipRechargeVM.swift; sourceTree = ""; }; 30DC18552FD11E7A0041DCD1 /* NavigationTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationTitleView.swift; sourceTree = ""; }; 30DC18562FD11E7A0041DCD1 /* WebOperations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebOperations.swift; sourceTree = ""; }; 30DC18572FD11E7A0041DCD1 /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = ""; }; - 30DC185D2FD1211D0041DCD1 /* VipRightsVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VipRightsVC.swift; sourceTree = ""; }; - 30DC185F2FD12A020041DCD1 /* VipWaivePopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VipWaivePopView.swift; sourceTree = ""; }; 30EBF71F2FEFD6F2009A8A87 /* GroupChooseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupChooseView.swift; sourceTree = ""; }; 30EFF2982FD65FB000EB35D4 /* VoicePlayerManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoicePlayerManager.swift; sourceTree = ""; }; 30EFF29A2FD668C900EB35D4 /* VoiceRecordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceRecordView.swift; sourceTree = ""; }; @@ -740,7 +724,6 @@ 30EFF3C12FDA3F7F00EB35D4 /* AppCacheManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppCacheManager.swift; sourceTree = ""; }; 30EFF3C32FDA431D00EB35D4 /* ChangePhoneVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangePhoneVC.swift; sourceTree = ""; }; 30EFF3C52FDA433E00EB35D4 /* ChangePhoneView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangePhoneView.swift; sourceTree = ""; }; - 30EFF3C92FDA575600EB35D4 /* CancellationPopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CancellationPopView.swift; sourceTree = ""; }; 30EFF3CC2FDA668A00EB35D4 /* MyProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyProfileView.swift; sourceTree = ""; }; 30EFF3CE2FDA669800EB35D4 /* MyProfileVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyProfileVC.swift; sourceTree = ""; }; 30EFF3D02FDA69EC00EB35D4 /* AvatarIconListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarIconListVC.swift; sourceTree = ""; }; @@ -829,6 +812,7 @@ 55B250033038000100786503 /* MailboxView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MailboxView.swift; sourceTree = ""; }; 55B250053038000100786505 /* MailboxViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MailboxViewController.swift; sourceTree = ""; }; 55B250073038000100786507 /* MailboxDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MailboxDetailViewController.swift; sourceTree = ""; }; + 55B26000304B000100786600 /* VersionUpgradePopVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionUpgradePopVC.swift; sourceTree = ""; }; 55B261000000000100786600 /* PrivacySettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacySettingsViewController.swift; sourceTree = ""; }; 55BF752C2FFE53F70055DA57 /* LocationPermissionPopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationPermissionPopView.swift; sourceTree = ""; }; 55BF75342FFF91690055DA57 /* InteractionEmojiCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InteractionEmojiCell.swift; sourceTree = ""; }; @@ -1409,7 +1393,6 @@ 55B219C5302A000100784774 /* PigeonMessage */, 305A76392FCA8C7000227D26 /* Mine */, 305A798E2FCAC5F600227D26 /* InviteMember */, - 3062E8C52FCFD01000CEF511 /* VipRecharge */, 305A76312FCA8C7000227D26 /* Login */, 305A762C2FCA8C7000227D26 /* Launch */, 3062E8B32FCE6BA400CEF511 /* Scan */, @@ -1530,6 +1513,7 @@ 305A76692FCA8C7000227D26 /* Pop */ = { isa = PBXGroup; children = ( + 55B26000304B000100786600 /* VersionUpgradePopVC.swift */, 30CCDE4D2FE26CEA00F5214A /* PayResultPopVC.swift */, 30EFF3BA2FD90D7600EB35D4 /* ConfirmPopVC.swift */, 305A76642FCA8C7000227D26 /* DLAlertPopVC.swift */, @@ -1619,19 +1603,6 @@ path = CreateGroup; sourceTree = ""; }; - 3062E8C52FCFD01000CEF511 /* VipRecharge */ = { - isa = PBXGroup; - children = ( - 3062E8C82FCFD03B00CEF511 /* VipRechargeVC.swift */, - 3062E8C62FCFD02F00CEF511 /* VipRechargeView.swift */, - 30DC18532FD00C4A0041DCD1 /* VipRechargeVM.swift */, - 30DC18512FD009CD0041DCD1 /* VipExpenseModel.swift */, - 30DC185D2FD1211D0041DCD1 /* VipRightsVC.swift */, - 30DC185F2FD12A020041DCD1 /* VipWaivePopView.swift */, - ); - path = VipRecharge; - sourceTree = ""; - }; 307073E42FD18A20004C37CC /* GroupChat */ = { isa = PBXGroup; children = ( @@ -1717,8 +1688,6 @@ children = ( 30ACD67A2FF7B36A00174861 /* PopupQueueManager.swift */, 30ACD54B2FF6336000174861 /* PopupWindow.swift */, - 30ACD54D2FF7942E00174861 /* PromotionalActivitiesVC.swift */, - 30ACD54F2FF7943A00174861 /* PromotionalActivitiesView.swift */, ); path = PopupWindow; sourceTree = ""; @@ -1966,7 +1935,6 @@ 30EFF3BD2FD958A100EB35D4 /* AccountView.swift */, 30EFF3C32FDA431D00EB35D4 /* ChangePhoneVC.swift */, 30EFF3C52FDA433E00EB35D4 /* ChangePhoneView.swift */, - 30EFF3C92FDA575600EB35D4 /* CancellationPopView.swift */, ); path = Account; sourceTree = ""; @@ -2449,7 +2417,6 @@ 305A768B2FCA8C7000227D26 /* API.swift in Sources */, 30EFF3AE2FD7FF1400EB35D4 /* TextInputViewController.swift in Sources */, 305A768C2FCA8C7000227D26 /* APIProvider.swift in Sources */, - 3062E8C92FCFD03B00CEF511 /* VipRechargeVC.swift in Sources */, 305A768D2FCA8C7000227D26 /* AppNetworkConfig.swift in Sources */, 305A768E2FCA8C7000227D26 /* SignPlugin.swift in Sources */, 305A768F2FCA8C7000227D26 /* SystemAPI.swift in Sources */, @@ -2464,7 +2431,6 @@ 305A76912FCA8C7000227D26 /* Constant.swift in Sources */, 305A76922FCA8C7000227D26 /* LogUtils.swift in Sources */, 305A76932FCA8C7000227D26 /* AddImageCell.swift in Sources */, - 30ACD54E2FF7942E00174861 /* PromotionalActivitiesVC.swift in Sources */, 30EFF3D82FDA8F1000EB35D4 /* EmergencyContactVC.swift in Sources */, 30A87A682FEE86560095E7C6 /* CreateBubblePopView.swift in Sources */, 55B219C13024C00100784722 /* BubbleHeroView.swift in Sources */, @@ -2472,7 +2438,6 @@ 55B219C13024C00100784726 /* BubbleKnowledgeView.swift in Sources */, 55B219C13024C00100784728 /* BubbleKnowledgeVC.swift in Sources */, 30A87A4B2FEE1DAB0095E7C6 /* ItineraryDetailVC.swift in Sources */, - 30DC185E2FD1211D0041DCD1 /* VipRightsVC.swift in Sources */, 305A76942FCA8C7000227D26 /* UploadImageCell.swift in Sources */, 305A76952FCA8C7000227D26 /* CornerRadiusCell.swift in Sources */, 305A76962FCA8C7000227D26 /* CornerRadiusFooterView.swift in Sources */, @@ -2517,7 +2482,6 @@ 30EFF3D62FDA8F0100EB35D4 /* EmergencyContactView.swift in Sources */, 30A7A9112FCAEE3D00105780 /* GroupListPopView.swift in Sources */, 305A76A72FCA8C7000227D26 /* NSAttributedString+Extension.swift in Sources */, - 30DC18542FD00C4A0041DCD1 /* VipRechargeVM.swift in Sources */, 305A76A82FCA8C7000227D26 /* ObjectMapper+Extension.swift in Sources */, 30B74B3A2FF2115A00F6744D /* GroupScheduleView.swift in Sources */, 305A76A92FCA8C7000227D26 /* Optional+Extension.swift in Sources */, @@ -2616,7 +2580,6 @@ 30DC185B2FD11E7A0041DCD1 /* NavigationTitleView.swift in Sources */, 30DC185C2FD11E7A0041DCD1 /* WebViewController.swift in Sources */, 305A76C32FCA8C7000227D26 /* MainTabBarController.swift in Sources */, - 30EFF3CA2FDA575600EB35D4 /* CancellationPopView.swift in Sources */, 305A76C42FCA8C7000227D26 /* QuickLocationTabBar.swift in Sources */, 30C4C01D2FDBF557009215C1 /* RemoveMemberViewModel.swift in Sources */, 305A76C52FCA8C7000227D26 /* Account.swift in Sources */, @@ -2637,7 +2600,6 @@ 55B218B13024B00100784722 /* FeatureIntroVC.swift in Sources */, 55B218B13024B00100784724 /* FeatureIntroView.swift in Sources */, 305A76CE2FCA8C7000227D26 /* RouterManager.swift in Sources */, - 3062E8C72FCFD02F00CEF511 /* VipRechargeView.swift in Sources */, 305A76CF2FCA8C7000227D26 /* CountDownService.swift in Sources */, 30A87A502FEE4E4B0095E7C6 /* ScheduleHistoryView.swift in Sources */, 305A76D02FCA8C7000227D26 /* MoneyFormatter.swift in Sources */, @@ -2667,13 +2629,13 @@ 30A87A542FEE50B10095E7C6 /* ScheduleHistoryVM.swift in Sources */, 305A76DE2FCA8C7000227D26 /* ObservableType+ObjectMapper.swift in Sources */, 305A76DF2FCA8C7000227D26 /* Single+ObjectMapper.swift in Sources */, - 30DC18602FD12A020041DCD1 /* VipWaivePopView.swift in Sources */, 30D74AAB2FE8C7700050EB2C /* GPSSignalHelper.swift in Sources */, 55C219C13024C00100784731 /* SearchLocationHeaderView.swift in Sources */, 30A87A6B2FEF5B950095E7C6 /* SearchLocationView.swift in Sources */, 305A76E02FCA8C7000227D26 /* GroupView.swift in Sources */, 55B217B13022F0A000784711 /* GroupItineraryView.swift in Sources */, 30EFF3BB2FD90D7600EB35D4 /* ConfirmPopVC.swift in Sources */, + 55B26001304B000100786601 /* VersionUpgradePopVC.swift in Sources */, 30BAB8512FCD331C00C33B5C /* GroupAPI.swift in Sources */, 305A76E12FCA8C7000227D26 /* GroupViewController.swift in Sources */, 55B250043038000100786504 /* MailboxView.swift in Sources */, @@ -2726,7 +2688,6 @@ 305A76F02FCA8C7000227D26 /* MineViewModel.swift in Sources */, 30A87A602FEE71B80095E7C6 /* CreateBubbleVC.swift in Sources */, 305A76F12FCA8C7000227D26 /* SystemService.swift in Sources */, - 30DC18522FD009CD0041DCD1 /* VipExpenseModel.swift in Sources */, 30C4C01B2FDBF09D009215C1 /* RemoveMemberView.swift in Sources */, 307073E12FD15F50004C37CC /* GroupIMService.swift in Sources */, 305A76F22FCA8C7000227D26 /* UserService.swift in Sources */, @@ -2779,7 +2740,6 @@ 305A770C2FCA8C7000227D26 /* PageView.swift in Sources */, 305A770D2FCA8C7000227D26 /* PageViewManager.swift in Sources */, 30D891F52FE22E0600E958FD /* OrderAPI.swift in Sources */, - 30ACD5502FF7943A00174861 /* PromotionalActivitiesView.swift in Sources */, 307073EA2FD2715A004C37CC /* GroupChatViewModel.swift in Sources */, 305A770E2FCA8C7000227D26 /* DLAlertPopVC.swift in Sources */, 305A770F2FCA8C7000227D26 /* DLCustomPopVC.swift in Sources */, diff --git a/QuickLocation/API/APIProvider.swift b/QuickLocation/API/APIProvider.swift index 5f493708..e3665689 100644 --- a/QuickLocation/API/APIProvider.swift +++ b/QuickLocation/API/APIProvider.swift @@ -144,6 +144,8 @@ enum GatewayStatusCode: Int { /** ============== 用户权限相关 200~300 ============== */ // 登录失效 case userLoginExpair = 1001003 + case userLoginExpair2 = 1001004 + case userLoginExpair3 = 1001005 // 权限不足 case noAuthority = 500 // 审核中 diff --git a/QuickLocation/API/UserAPI.swift b/QuickLocation/API/UserAPI.swift index 75322a0b..b322e633 100644 --- a/QuickLocation/API/UserAPI.swift +++ b/QuickLocation/API/UserAPI.swift @@ -79,6 +79,9 @@ enum UserAPI { /// 签到信息 case signInInfo + /// 签到 + case signIn(latitude: Double, longitude: Double, address: String) + /// 更换手机号 case changePhone(timestamp: String, phone: String, code: String) @@ -185,7 +188,7 @@ extension UserAPI: MultiTargetProtocol { return "mapi/phone/unlock/allow" case .imToken: return "mapi/openim/user/token/get" - case .signInInfo: + case .signInInfo, .signIn: return "mapi/user/signin" case .changePhone, .changeAvater: return "api/user" @@ -392,6 +395,16 @@ extension UserAPI: MultiTargetProtocol { case .signInInfo: return .requestParameters(parameters: Parameters(), encoding: URLEncoding()) + case let .signIn(latitude, longitude, address): + return .requestParameters( + parameters: [ + "latitude": latitude, + "longitude": longitude, + "address": address + ], + encoding: JSONEncoding() + ) + case let .changeAvater(url): var params = Parameters() params["avater"] = url diff --git a/QuickLocation/Assets.xcassets/Bubble/upgrade_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/Bubble/upgrade_bg.imageset/Contents.json index 72ff4163..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/Bubble/upgrade_bg.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/Bubble/upgrade_bg.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "upgrade_bg@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "upgrade_bg@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/Bubble/upgrade_bg.imageset/upgrade_bg@2x.png b/QuickLocation/Assets.xcassets/Bubble/upgrade_bg.imageset/upgrade_bg@2x.png deleted file mode 100644 index 1bde3afd..00000000 Binary files a/QuickLocation/Assets.xcassets/Bubble/upgrade_bg.imageset/upgrade_bg@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Bubble/upgrade_bg.imageset/upgrade_bg@3x.png b/QuickLocation/Assets.xcassets/Bubble/upgrade_bg.imageset/upgrade_bg@3x.png deleted file mode 100644 index a2b788df..00000000 Binary files a/QuickLocation/Assets.xcassets/Bubble/upgrade_bg.imageset/upgrade_bg@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Bubble/vip_pop.imageset/Contents.json b/QuickLocation/Assets.xcassets/Bubble/vip_pop.imageset/Contents.json index 4379e223..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/Bubble/vip_pop.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/Bubble/vip_pop.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "vip_pop@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "vip_pop@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/Bubble/vip_pop.imageset/vip_pop@2x.png b/QuickLocation/Assets.xcassets/Bubble/vip_pop.imageset/vip_pop@2x.png deleted file mode 100644 index 608a3025..00000000 Binary files a/QuickLocation/Assets.xcassets/Bubble/vip_pop.imageset/vip_pop@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Bubble/vip_pop.imageset/vip_pop@3x.png b/QuickLocation/Assets.xcassets/Bubble/vip_pop.imageset/vip_pop@3x.png deleted file mode 100644 index d107c60d..00000000 Binary files a/QuickLocation/Assets.xcassets/Bubble/vip_pop.imageset/vip_pop@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Group/upgrade_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/Group/upgrade_bg.imageset/Contents.json index 72ff4163..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/Group/upgrade_bg.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/Group/upgrade_bg.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "upgrade_bg@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "upgrade_bg@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/Group/upgrade_bg.imageset/upgrade_bg@2x.png b/QuickLocation/Assets.xcassets/Group/upgrade_bg.imageset/upgrade_bg@2x.png deleted file mode 100644 index 468c64e3..00000000 Binary files a/QuickLocation/Assets.xcassets/Group/upgrade_bg.imageset/upgrade_bg@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Group/upgrade_bg.imageset/upgrade_bg@3x.png b/QuickLocation/Assets.xcassets/Group/upgrade_bg.imageset/upgrade_bg@3x.png deleted file mode 100644 index 6b63c78d..00000000 Binary files a/QuickLocation/Assets.xcassets/Group/upgrade_bg.imageset/upgrade_bg@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Group/vip_pop.imageset/Contents.json b/QuickLocation/Assets.xcassets/Group/vip_pop.imageset/Contents.json index 92361557..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/Group/vip_pop.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/Group/vip_pop.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "Group_2396@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "Group_2396@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/Group/vip_pop.imageset/Group_2396@2x.png b/QuickLocation/Assets.xcassets/Group/vip_pop.imageset/Group_2396@2x.png deleted file mode 100644 index 02e3feee..00000000 Binary files a/QuickLocation/Assets.xcassets/Group/vip_pop.imageset/Group_2396@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Group/vip_pop.imageset/Group_2396@3x.png b/QuickLocation/Assets.xcassets/Group/vip_pop.imageset/Group_2396@3x.png deleted file mode 100644 index dc42599b..00000000 Binary files a/QuickLocation/Assets.xcassets/Group/vip_pop.imageset/Group_2396@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/GroupMemberList/vip.imageset/Contents.json b/QuickLocation/Assets.xcassets/GroupMemberList/vip.imageset/Contents.json index d10f4289..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/GroupMemberList/vip.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/GroupMemberList/vip.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "蒙版组 13899@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "蒙版组 13899@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/GroupMemberList/vip.imageset/蒙版组 13899@2x.png b/QuickLocation/Assets.xcassets/GroupMemberList/vip.imageset/蒙版组 13899@2x.png deleted file mode 100644 index 7bf141ea..00000000 Binary files a/QuickLocation/Assets.xcassets/GroupMemberList/vip.imageset/蒙版组 13899@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/GroupMemberList/vip.imageset/蒙版组 13899@3x.png b/QuickLocation/Assets.xcassets/GroupMemberList/vip.imageset/蒙版组 13899@3x.png deleted file mode 100644 index 605192b4..00000000 Binary files a/QuickLocation/Assets.xcassets/GroupMemberList/vip.imageset/蒙版组 13899@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Home/HistoryTrack/vip_required.imageset/Contents.json b/QuickLocation/Assets.xcassets/Home/HistoryTrack/vip_required.imageset/Contents.json index 1c3875c5..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/Home/HistoryTrack/vip_required.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/Home/HistoryTrack/vip_required.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "vip_required@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "vip_required@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/Home/HistoryTrack/vip_required.imageset/vip_required@2x.png b/QuickLocation/Assets.xcassets/Home/HistoryTrack/vip_required.imageset/vip_required@2x.png deleted file mode 100644 index bddcc0e3..00000000 Binary files a/QuickLocation/Assets.xcassets/Home/HistoryTrack/vip_required.imageset/vip_required@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Home/HistoryTrack/vip_required.imageset/vip_required@3x.png b/QuickLocation/Assets.xcassets/Home/HistoryTrack/vip_required.imageset/vip_required@3x.png deleted file mode 100644 index 1a85d451..00000000 Binary files a/QuickLocation/Assets.xcassets/Home/HistoryTrack/vip_required.imageset/vip_required@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register2_logo.imageset/Contents.json b/QuickLocation/Assets.xcassets/IM/location_driving.imageset/Contents.json similarity index 74% rename from QuickLocation/Assets.xcassets/PopupWindow/register2_logo.imageset/Contents.json rename to QuickLocation/Assets.xcassets/IM/location_driving.imageset/Contents.json index 7c09cc29..384af2a6 100644 --- a/QuickLocation/Assets.xcassets/PopupWindow/register2_logo.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/IM/location_driving.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "Group 2127@2x.png", + "filename" : "location_driving@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "Group 2127@3x.png", + "filename" : "location_driving@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/IM/location_driving.imageset/location_driving@2x.png b/QuickLocation/Assets.xcassets/IM/location_driving.imageset/location_driving@2x.png new file mode 100644 index 00000000..8414b8a2 Binary files /dev/null and b/QuickLocation/Assets.xcassets/IM/location_driving.imageset/location_driving@2x.png differ diff --git a/QuickLocation/Assets.xcassets/IM/location_driving.imageset/location_driving@3x.png b/QuickLocation/Assets.xcassets/IM/location_driving.imageset/location_driving@3x.png new file mode 100644 index 00000000..c7ae82ac Binary files /dev/null and b/QuickLocation/Assets.xcassets/IM/location_driving.imageset/location_driving@3x.png differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/IM/location_walking.imageset/Contents.json similarity index 74% rename from QuickLocation/Assets.xcassets/PopupWindow/register_bg.imageset/Contents.json rename to QuickLocation/Assets.xcassets/IM/location_walking.imageset/Contents.json index 954bc1ec..40be12b5 100644 --- a/QuickLocation/Assets.xcassets/PopupWindow/register_bg.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/IM/location_walking.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "Group 2188@2x.png", + "filename" : "location_walking@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "Group 2188@3x.png", + "filename" : "location_walking@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/IM/location_walking.imageset/location_walking@2x.png b/QuickLocation/Assets.xcassets/IM/location_walking.imageset/location_walking@2x.png new file mode 100644 index 00000000..488aa8dd Binary files /dev/null and b/QuickLocation/Assets.xcassets/IM/location_walking.imageset/location_walking@2x.png differ diff --git a/QuickLocation/Assets.xcassets/IM/location_walking.imageset/location_walking@3x.png b/QuickLocation/Assets.xcassets/IM/location_walking.imageset/location_walking@3x.png new file mode 100644 index 00000000..a2b527f7 Binary files /dev/null and b/QuickLocation/Assets.xcassets/IM/location_walking.imageset/location_walking@3x.png differ diff --git a/QuickLocation/Assets.xcassets/MemberVipRequired/app_usage.imageset/Contents.json b/QuickLocation/Assets.xcassets/MemberVipRequired/app_usage.imageset/Contents.json index 4be8d4e9..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/MemberVipRequired/app_usage.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/MemberVipRequired/app_usage.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "app_usage@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "app_usage@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/MemberVipRequired/app_usage.imageset/app_usage@2x.png b/QuickLocation/Assets.xcassets/MemberVipRequired/app_usage.imageset/app_usage@2x.png deleted file mode 100644 index f31df810..00000000 Binary files a/QuickLocation/Assets.xcassets/MemberVipRequired/app_usage.imageset/app_usage@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/MemberVipRequired/app_usage.imageset/app_usage@3x.png b/QuickLocation/Assets.xcassets/MemberVipRequired/app_usage.imageset/app_usage@3x.png deleted file mode 100644 index d3f92deb..00000000 Binary files a/QuickLocation/Assets.xcassets/MemberVipRequired/app_usage.imageset/app_usage@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/MemberVipRequired/phone_report.imageset/Contents.json b/QuickLocation/Assets.xcassets/MemberVipRequired/phone_report.imageset/Contents.json index 083fa343..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/MemberVipRequired/phone_report.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/MemberVipRequired/phone_report.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "phone_report@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "phone_report@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/MemberVipRequired/phone_report.imageset/phone_report@2x.png b/QuickLocation/Assets.xcassets/MemberVipRequired/phone_report.imageset/phone_report@2x.png deleted file mode 100644 index 500a39af..00000000 Binary files a/QuickLocation/Assets.xcassets/MemberVipRequired/phone_report.imageset/phone_report@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/MemberVipRequired/phone_report.imageset/phone_report@3x.png b/QuickLocation/Assets.xcassets/MemberVipRequired/phone_report.imageset/phone_report@3x.png deleted file mode 100644 index cfcccd21..00000000 Binary files a/QuickLocation/Assets.xcassets/MemberVipRequired/phone_report.imageset/phone_report@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Mine/vip_card.imageset/Contents.json b/QuickLocation/Assets.xcassets/Mine/vip_card.imageset/Contents.json index 72471ba6..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/Mine/vip_card.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/Mine/vip_card.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "vip_card@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "vip_card@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/Mine/vip_card.imageset/vip_card@2x.png b/QuickLocation/Assets.xcassets/Mine/vip_card.imageset/vip_card@2x.png deleted file mode 100644 index 2b4b4b03..00000000 Binary files a/QuickLocation/Assets.xcassets/Mine/vip_card.imageset/vip_card@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Mine/vip_card.imageset/vip_card@3x.png b/QuickLocation/Assets.xcassets/Mine/vip_card.imageset/vip_card@3x.png deleted file mode 100644 index 2b4b4b03..00000000 Binary files a/QuickLocation/Assets.xcassets/Mine/vip_card.imageset/vip_card@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register2_logo.imageset/Group 2127@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/register2_logo.imageset/Group 2127@2x.png deleted file mode 100644 index a65f4fb5..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/register2_logo.imageset/Group 2127@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register2_logo.imageset/Group 2127@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/register2_logo.imageset/Group 2127@3x.png deleted file mode 100644 index 3773d96f..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/register2_logo.imageset/Group 2127@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register_bg.imageset/Group 2188@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/register_bg.imageset/Group 2188@2x.png deleted file mode 100644 index 89a20de5..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/register_bg.imageset/Group 2188@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register_bg.imageset/Group 2188@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/register_bg.imageset/Group 2188@3x.png deleted file mode 100644 index 92dfbc67..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/register_bg.imageset/Group 2188@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register_heart.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/register_heart.imageset/Contents.json deleted file mode 100644 index 13a9575c..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/register_heart.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2323@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2323@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register_heart.imageset/Group_2323@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/register_heart.imageset/Group_2323@2x.png deleted file mode 100644 index dc95158c..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/register_heart.imageset/Group_2323@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register_heart.imageset/Group_2323@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/register_heart.imageset/Group_2323@3x.png deleted file mode 100644 index 38a10f8e..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/register_heart.imageset/Group_2323@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register_logo.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/register_logo.imageset/Contents.json deleted file mode 100644 index 41fa3fcf..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/register_logo.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2331@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2331@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register_logo.imageset/Group_2331@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/register_logo.imageset/Group_2331@2x.png deleted file mode 100644 index 31e5a6c0..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/register_logo.imageset/Group_2331@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register_logo.imageset/Group_2331@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/register_logo.imageset/Group_2331@3x.png deleted file mode 100644 index f57e08f4..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/register_logo.imageset/Group_2331@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register_text.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/register_text.imageset/Contents.json deleted file mode 100644 index 84061b41..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/register_text.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "register_text@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "register_text@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register_text.imageset/register_text@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/register_text.imageset/register_text@2x.png deleted file mode 100644 index 91265480..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/register_text.imageset/register_text@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/register_text.imageset/register_text@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/register_text.imageset/register_text@3x.png deleted file mode 100644 index 9595d879..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/register_text.imageset/register_text@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/search_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/search_bg.imageset/Contents.json deleted file mode 100644 index 4b17b660..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/search_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "search_bg@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "search_bg@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/search_bg.imageset/search_bg@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/search_bg.imageset/search_bg@2x.png deleted file mode 100644 index 51f68d82..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/search_bg.imageset/search_bg@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/search_bg.imageset/search_bg@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/search_bg.imageset/search_bg@3x.png deleted file mode 100644 index 8cd1ff4d..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/search_bg.imageset/search_bg@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/search_earth.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/search_earth.imageset/Contents.json deleted file mode 100644 index dff4989e..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/search_earth.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "组 3 2@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "组 3 2@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/search_earth.imageset/组 3 2@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/search_earth.imageset/组 3 2@2x.png deleted file mode 100644 index ba0d7354..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/search_earth.imageset/组 3 2@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/search_earth.imageset/组 3 2@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/search_earth.imageset/组 3 2@3x.png deleted file mode 100644 index 5f6b1088..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/search_earth.imageset/组 3 2@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/search_people.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/search_people.imageset/Contents.json deleted file mode 100644 index fd3fe5cb..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/search_people.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "image 111@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "image 111@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/search_people.imageset/image 111@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/search_people.imageset/image 111@2x.png deleted file mode 100644 index b2f280f5..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/search_people.imageset/image 111@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/search_people.imageset/image 111@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/search_people.imageset/image 111@3x.png deleted file mode 100644 index e3e76c6a..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/search_people.imageset/image 111@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/star_1.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/star_1.imageset/Contents.json deleted file mode 100644 index b0f7bfee..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/star_1.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2322@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2322@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/star_1.imageset/Group_2322@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/star_1.imageset/Group_2322@2x.png deleted file mode 100644 index 8101d281..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/star_1.imageset/Group_2322@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/star_1.imageset/Group_2322@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/star_1.imageset/Group_2322@3x.png deleted file mode 100644 index 2ce46a82..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/star_1.imageset/Group_2322@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/star_2.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/star_2.imageset/Contents.json deleted file mode 100644 index ed17d5b3..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/star_2.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "image 107@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "image 107@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/star_2.imageset/image 107@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/star_2.imageset/image 107@2x.png deleted file mode 100644 index e8a4cbb0..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/star_2.imageset/image 107@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/star_2.imageset/image 107@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/star_2.imageset/image 107@3x.png deleted file mode 100644 index 4d36d569..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/star_2.imageset/image 107@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/star_3.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/star_3.imageset/Contents.json deleted file mode 100644 index b7238762..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/star_3.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "image 108@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "image 108@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/star_3.imageset/image 108@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/star_3.imageset/image 108@2x.png deleted file mode 100644 index 146db998..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/star_3.imageset/image 108@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/star_3.imageset/image 108@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/star_3.imageset/image 108@3x.png deleted file mode 100644 index 3e24fab2..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/star_3.imageset/image 108@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_heart.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip1_heart.imageset/Contents.json deleted file mode 100644 index 3cb5df7f..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip1_heart.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "vip1_unlock@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "vip1_unlock@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_heart.imageset/vip1_unlock@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip1_heart.imageset/vip1_unlock@2x.png deleted file mode 100644 index 03622d9f..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip1_heart.imageset/vip1_unlock@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_heart.imageset/vip1_unlock@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip1_heart.imageset/vip1_unlock@3x.png deleted file mode 100644 index 2c2cf5cf..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip1_heart.imageset/vip1_unlock@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_logo.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip1_logo.imageset/Contents.json deleted file mode 100644 index 7813070b..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip1_logo.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "vip1_logo@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "vip1_logo@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_logo.imageset/vip1_logo@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip1_logo.imageset/vip1_logo@2x.png deleted file mode 100644 index ce3e285a..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip1_logo.imageset/vip1_logo@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_logo.imageset/vip1_logo@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip1_logo.imageset/vip1_logo@3x.png deleted file mode 100644 index 5556a9ce..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip1_logo.imageset/vip1_logo@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_1.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_1.imageset/Contents.json deleted file mode 100644 index d47fa0db..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_1.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 2086@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 2086@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_1.imageset/Group 2086@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_1.imageset/Group 2086@2x.png deleted file mode 100644 index 2fe50bcc..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_1.imageset/Group 2086@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_1.imageset/Group 2086@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_1.imageset/Group 2086@3x.png deleted file mode 100644 index 98227452..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_1.imageset/Group 2086@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_2.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_2.imageset/Contents.json deleted file mode 100644 index b70c164f..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_2.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 2087@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 2087@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_2.imageset/Group 2087@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_2.imageset/Group 2087@2x.png deleted file mode 100644 index 4a804d09..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_2.imageset/Group 2087@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_2.imageset/Group 2087@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_2.imageset/Group 2087@3x.png deleted file mode 100644 index fd0bc1ce..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_2.imageset/Group 2087@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_3.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_3.imageset/Contents.json deleted file mode 100644 index f3081e8c..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_3.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 2088@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 2088@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_3.imageset/Group 2088@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_3.imageset/Group 2088@2x.png deleted file mode 100644 index 75ed2034..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_3.imageset/Group 2088@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_3.imageset/Group 2088@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_3.imageset/Group 2088@3x.png deleted file mode 100644 index 34be5789..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip1_tips_3.imageset/Group 2088@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip2_bg.imageset/Contents.json deleted file mode 100644 index b774b73b..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip2_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2092@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2092@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_bg.imageset/Group_2092@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip2_bg.imageset/Group_2092@2x.png deleted file mode 100644 index 88a2c9bd..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip2_bg.imageset/Group_2092@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_bg.imageset/Group_2092@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip2_bg.imageset/Group_2092@3x.png deleted file mode 100644 index 10354eec..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip2_bg.imageset/Group_2092@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_icon.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip2_icon.imageset/Contents.json deleted file mode 100644 index 197fb605..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip2_icon.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Mask_group@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Mask_group@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_icon.imageset/Mask_group@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip2_icon.imageset/Mask_group@2x.png deleted file mode 100644 index 8542aefa..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip2_icon.imageset/Mask_group@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_icon.imageset/Mask_group@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip2_icon.imageset/Mask_group@3x.png deleted file mode 100644 index 5c028415..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip2_icon.imageset/Mask_group@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_logo.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip2_logo.imageset/Contents.json deleted file mode 100644 index e3110d0e..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip2_logo.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 2091@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 2091@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_logo.imageset/Group 2091@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip2_logo.imageset/Group 2091@2x.png deleted file mode 100644 index 6fceae51..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip2_logo.imageset/Group 2091@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_logo.imageset/Group 2091@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip2_logo.imageset/Group 2091@3x.png deleted file mode 100644 index ed16ef1c..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip2_logo.imageset/Group 2091@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_text.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip2_text.imageset/Contents.json deleted file mode 100644 index 99168a40..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip2_text.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "vip2_text@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "vip2_text@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_text.imageset/vip2_text@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip2_text.imageset/vip2_text@2x.png deleted file mode 100644 index 622ac2a8..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip2_text.imageset/vip2_text@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_text.imageset/vip2_text@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip2_text.imageset/vip2_text@3x.png deleted file mode 100644 index 87363387..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip2_text.imageset/vip2_text@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_text_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip2_text_bg.imageset/Contents.json deleted file mode 100644 index dd6b162e..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip2_text_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2084@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2084@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_text_bg.imageset/Group_2084@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip2_text_bg.imageset/Group_2084@2x.png deleted file mode 100644 index 0273c388..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip2_text_bg.imageset/Group_2084@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip2_text_bg.imageset/Group_2084@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip2_text_bg.imageset/Group_2084@3x.png deleted file mode 100644 index 92149c8e..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip2_text_bg.imageset/Group_2084@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip3_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip3_bg.imageset/Contents.json deleted file mode 100644 index a6a2dc42..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip3_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2094@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2094@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip3_bg.imageset/Group_2094@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip3_bg.imageset/Group_2094@2x.png deleted file mode 100644 index c916901a..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip3_bg.imageset/Group_2094@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip3_bg.imageset/Group_2094@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip3_bg.imageset/Group_2094@3x.png deleted file mode 100644 index 69fa36e5..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip3_bg.imageset/Group_2094@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip4_animate.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip4_animate.imageset/Contents.json deleted file mode 100644 index aba566c3..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip4_animate.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 2109@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 2109@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip4_animate.imageset/Group 2109@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip4_animate.imageset/Group 2109@2x.png deleted file mode 100644 index 34364ef5..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip4_animate.imageset/Group 2109@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip4_animate.imageset/Group 2109@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip4_animate.imageset/Group 2109@3x.png deleted file mode 100644 index 03b51243..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip4_animate.imageset/Group 2109@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip4_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip4_bg.imageset/Contents.json deleted file mode 100644 index 96e76ac3..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip4_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "vip4_bg@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "vip4_bg@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip4_bg.imageset/vip4_bg@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip4_bg.imageset/vip4_bg@2x.png deleted file mode 100644 index d7647477..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip4_bg.imageset/vip4_bg@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip4_bg.imageset/vip4_bg@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip4_bg.imageset/vip4_bg@3x.png deleted file mode 100644 index e9a576f5..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip4_bg.imageset/vip4_bg@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/PopupWindow/vip_bg.imageset/Contents.json deleted file mode 100644 index c3e014ec..00000000 --- a/QuickLocation/Assets.xcassets/PopupWindow/vip_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 2209@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 2209@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip_bg.imageset/Group 2209@2x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip_bg.imageset/Group 2209@2x.png deleted file mode 100644 index 68365f9b..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip_bg.imageset/Group 2209@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PopupWindow/vip_bg.imageset/Group 2209@3x.png b/QuickLocation/Assets.xcassets/PopupWindow/vip_bg.imageset/Group 2209@3x.png deleted file mode 100644 index 5564803b..00000000 Binary files a/QuickLocation/Assets.xcassets/PopupWindow/vip_bg.imageset/Group 2209@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/benefits.imageset/Contents.json b/QuickLocation/Assets.xcassets/PromotionalActivities/benefits.imageset/Contents.json deleted file mode 100644 index 3fba2a2a..00000000 --- a/QuickLocation/Assets.xcassets/PromotionalActivities/benefits.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "benefits@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "benefits@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/benefits.imageset/benefits@2x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/benefits.imageset/benefits@2x.png deleted file mode 100644 index 35eed081..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/benefits.imageset/benefits@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/benefits.imageset/benefits@3x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/benefits.imageset/benefits@3x.png deleted file mode 100644 index 7b7127e7..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/benefits.imageset/benefits@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/header_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/PromotionalActivities/header_bg.imageset/Contents.json deleted file mode 100644 index 88b0b057..00000000 --- a/QuickLocation/Assets.xcassets/PromotionalActivities/header_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "banner@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "banner@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/header_bg.imageset/banner@2x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/header_bg.imageset/banner@2x.png deleted file mode 100644 index 50dee158..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/header_bg.imageset/banner@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/header_bg.imageset/banner@3x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/header_bg.imageset/banner@3x.png deleted file mode 100644 index 55532af2..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/header_bg.imageset/banner@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/normal_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/PromotionalActivities/normal_bg.imageset/Contents.json deleted file mode 100644 index 19a1c34f..00000000 --- a/QuickLocation/Assets.xcassets/PromotionalActivities/normal_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2432@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2432@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/normal_bg.imageset/Group_2432@2x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/normal_bg.imageset/Group_2432@2x.png deleted file mode 100644 index b8e4e6bd..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/normal_bg.imageset/Group_2432@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/normal_bg.imageset/Group_2432@3x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/normal_bg.imageset/Group_2432@3x.png deleted file mode 100644 index 85195a56..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/normal_bg.imageset/Group_2432@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/normal_on_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/PromotionalActivities/normal_on_bg.imageset/Contents.json deleted file mode 100644 index 20dfc443..00000000 --- a/QuickLocation/Assets.xcassets/PromotionalActivities/normal_on_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "normal_on_bg@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "normal_on_bg@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/normal_on_bg.imageset/normal_on_bg@2x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/normal_on_bg.imageset/normal_on_bg@2x.png deleted file mode 100644 index 30199923..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/normal_on_bg.imageset/normal_on_bg@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/normal_on_bg.imageset/normal_on_bg@3x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/normal_on_bg.imageset/normal_on_bg@3x.png deleted file mode 100644 index 69131f4e..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/normal_on_bg.imageset/normal_on_bg@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_bg.imageset/Contents.json deleted file mode 100644 index d3af90ba..00000000 --- a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "recommend_bg@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "recommend_bg@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_bg.imageset/recommend_bg@2x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_bg.imageset/recommend_bg@2x.png deleted file mode 100644 index 90cf61d1..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_bg.imageset/recommend_bg@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_bg.imageset/recommend_bg@3x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_bg.imageset/recommend_bg@3x.png deleted file mode 100644 index a469b2e0..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_bg.imageset/recommend_bg@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_icon.imageset/Contents.json b/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_icon.imageset/Contents.json deleted file mode 100644 index 0df860ca..00000000 --- a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_icon.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2429@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2429@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_icon.imageset/Group_2429@2x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_icon.imageset/Group_2429@2x.png deleted file mode 100644 index 3b1cc3ed..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_icon.imageset/Group_2429@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_icon.imageset/Group_2429@3x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_icon.imageset/Group_2429@3x.png deleted file mode 100644 index cbfd6a19..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_icon.imageset/Group_2429@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_on_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_on_bg.imageset/Contents.json deleted file mode 100644 index 5bc6c4f7..00000000 --- a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_on_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "recommend_on_bg@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "recommend_on_bg@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_on_bg.imageset/recommend_on_bg@2x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_on_bg.imageset/recommend_on_bg@2x.png deleted file mode 100644 index 35baad67..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_on_bg.imageset/recommend_on_bg@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_on_bg.imageset/recommend_on_bg@3x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_on_bg.imageset/recommend_on_bg@3x.png deleted file mode 100644 index afa4f47e..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/recommend_on_bg.imageset/recommend_on_bg@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/tips_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/PromotionalActivities/tips_bg.imageset/Contents.json deleted file mode 100644 index e5cef62f..00000000 --- a/QuickLocation/Assets.xcassets/PromotionalActivities/tips_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2428@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2428@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/tips_bg.imageset/Group_2428@2x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/tips_bg.imageset/Group_2428@2x.png deleted file mode 100644 index 85ec64a0..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/tips_bg.imageset/Group_2428@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/tips_bg.imageset/Group_2428@3x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/tips_bg.imageset/Group_2428@3x.png deleted file mode 100644 index 8eeaedfe..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/tips_bg.imageset/Group_2428@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/vip_icon.imageset/Contents.json b/QuickLocation/Assets.xcassets/PromotionalActivities/vip_icon.imageset/Contents.json deleted file mode 100644 index af967479..00000000 --- a/QuickLocation/Assets.xcassets/PromotionalActivities/vip_icon.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2426@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2426@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/vip_icon.imageset/Group_2426@2x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/vip_icon.imageset/Group_2426@2x.png deleted file mode 100644 index 60de6ed5..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/vip_icon.imageset/Group_2426@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/vip_icon.imageset/Group_2426@3x.png b/QuickLocation/Assets.xcassets/PromotionalActivities/vip_icon.imageset/Group_2426@3x.png deleted file mode 100644 index 8d0b8f3c..00000000 Binary files a/QuickLocation/Assets.xcassets/PromotionalActivities/vip_icon.imageset/Group_2426@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Schedule/vip_pop.imageset/Contents.json b/QuickLocation/Assets.xcassets/Schedule/vip_pop.imageset/Contents.json index 92361557..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/Schedule/vip_pop.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/Schedule/vip_pop.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "Group_2396@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "Group_2396@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/Schedule/vip_pop.imageset/Group_2396@2x.png b/QuickLocation/Assets.xcassets/Schedule/vip_pop.imageset/Group_2396@2x.png deleted file mode 100644 index 7256ebb5..00000000 Binary files a/QuickLocation/Assets.xcassets/Schedule/vip_pop.imageset/Group_2396@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/Schedule/vip_pop.imageset/Group_2396@3x.png b/QuickLocation/Assets.xcassets/Schedule/vip_pop.imageset/Group_2396@3x.png deleted file mode 100644 index 7d92a706..00000000 Binary files a/QuickLocation/Assets.xcassets/Schedule/vip_pop.imageset/Group_2396@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/SearchLocation/vip_mask.imageset/Contents.json b/QuickLocation/Assets.xcassets/SearchLocation/vip_mask.imageset/Contents.json index 980c0fb4..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/SearchLocation/vip_mask.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/SearchLocation/vip_mask.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "组 48245@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "组 48245@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/SearchLocation/vip_mask.imageset/组 48245@2x.png b/QuickLocation/Assets.xcassets/SearchLocation/vip_mask.imageset/组 48245@2x.png deleted file mode 100644 index 3f9956e2..00000000 Binary files a/QuickLocation/Assets.xcassets/SearchLocation/vip_mask.imageset/组 48245@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/SearchLocation/vip_mask.imageset/组 48245@3x.png b/QuickLocation/Assets.xcassets/SearchLocation/vip_mask.imageset/组 48245@3x.png deleted file mode 100644 index 6a14ae9d..00000000 Binary files a/QuickLocation/Assets.xcassets/SearchLocation/vip_mask.imageset/组 48245@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/PromotionalActivities/Contents.json b/QuickLocation/Assets.xcassets/VersionUpgrade/Contents.json similarity index 100% rename from QuickLocation/Assets.xcassets/PromotionalActivities/Contents.json rename to QuickLocation/Assets.xcassets/VersionUpgrade/Contents.json diff --git a/QuickLocation/Assets.xcassets/VipRecharge/apple.imageset/Contents.json b/QuickLocation/Assets.xcassets/VersionUpgrade/header.imageset/Contents.json similarity index 79% rename from QuickLocation/Assets.xcassets/VipRecharge/apple.imageset/Contents.json rename to QuickLocation/Assets.xcassets/VersionUpgrade/header.imageset/Contents.json index 7c575d4a..92cf7b16 100644 --- a/QuickLocation/Assets.xcassets/VipRecharge/apple.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/VersionUpgrade/header.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "apple@2x.png", + "filename" : "header@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "apple@3x.png", + "filename" : "header@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/VersionUpgrade/header.imageset/header@2x.png b/QuickLocation/Assets.xcassets/VersionUpgrade/header.imageset/header@2x.png new file mode 100644 index 00000000..12afb4c5 Binary files /dev/null and b/QuickLocation/Assets.xcassets/VersionUpgrade/header.imageset/header@2x.png differ diff --git a/QuickLocation/Assets.xcassets/VersionUpgrade/header.imageset/header@3x.png b/QuickLocation/Assets.xcassets/VersionUpgrade/header.imageset/header@3x.png new file mode 100644 index 00000000..e3814a98 Binary files /dev/null and b/QuickLocation/Assets.xcassets/VersionUpgrade/header.imageset/header@3x.png differ diff --git a/QuickLocation/Assets.xcassets/VipFeature/limited_offer.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipFeature/limited_offer.imageset/Contents.json index 044f4fb9..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/VipFeature/limited_offer.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/VipFeature/limited_offer.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "limited_offer@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "limited_offer@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/VipFeature/limited_offer.imageset/limited_offer@2x.png b/QuickLocation/Assets.xcassets/VipFeature/limited_offer.imageset/limited_offer@2x.png deleted file mode 100644 index bbe03d28..00000000 Binary files a/QuickLocation/Assets.xcassets/VipFeature/limited_offer.imageset/limited_offer@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipFeature/limited_offer.imageset/limited_offer@3x.png b/QuickLocation/Assets.xcassets/VipFeature/limited_offer.imageset/limited_offer@3x.png deleted file mode 100644 index 5bf00817..00000000 Binary files a/QuickLocation/Assets.xcassets/VipFeature/limited_offer.imageset/limited_offer@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipFeature/media_locked_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipFeature/media_locked_bg.imageset/Contents.json index 1fe3c6b0..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/VipFeature/media_locked_bg.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/VipFeature/media_locked_bg.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "media_locked_bg@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "media_locked_bg@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/VipFeature/media_locked_bg.imageset/media_locked_bg@2x.png b/QuickLocation/Assets.xcassets/VipFeature/media_locked_bg.imageset/media_locked_bg@2x.png deleted file mode 100644 index d26b009e..00000000 Binary files a/QuickLocation/Assets.xcassets/VipFeature/media_locked_bg.imageset/media_locked_bg@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipFeature/media_locked_bg.imageset/media_locked_bg@3x.png b/QuickLocation/Assets.xcassets/VipFeature/media_locked_bg.imageset/media_locked_bg@3x.png deleted file mode 100644 index caf0e4de..00000000 Binary files a/QuickLocation/Assets.xcassets/VipFeature/media_locked_bg.imageset/media_locked_bg@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipFeature/realtime_location.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipFeature/realtime_location.imageset/Contents.json index 27666dff..a19a5492 100644 --- a/QuickLocation/Assets.xcassets/VipFeature/realtime_location.imageset/Contents.json +++ b/QuickLocation/Assets.xcassets/VipFeature/realtime_location.imageset/Contents.json @@ -5,12 +5,10 @@ "scale" : "1x" }, { - "filename" : "realtime_location@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "realtime_location@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/QuickLocation/Assets.xcassets/VipFeature/realtime_location.imageset/realtime_location@2x.png b/QuickLocation/Assets.xcassets/VipFeature/realtime_location.imageset/realtime_location@2x.png deleted file mode 100644 index 24995a4e..00000000 Binary files a/QuickLocation/Assets.xcassets/VipFeature/realtime_location.imageset/realtime_location@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipFeature/realtime_location.imageset/realtime_location@3x.png b/QuickLocation/Assets.xcassets/VipFeature/realtime_location.imageset/realtime_location@3x.png deleted file mode 100644 index afa882d5..00000000 Binary files a/QuickLocation/Assets.xcassets/VipFeature/realtime_location.imageset/realtime_location@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipIcon/1.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipIcon/1.imageset/Contents.json deleted file mode 100644 index f2029115..00000000 --- a/QuickLocation/Assets.xcassets/VipIcon/1.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2335@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2335@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipIcon/1.imageset/Group_2335@2x.png b/QuickLocation/Assets.xcassets/VipIcon/1.imageset/Group_2335@2x.png deleted file mode 100644 index 35400549..00000000 Binary files a/QuickLocation/Assets.xcassets/VipIcon/1.imageset/Group_2335@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipIcon/1.imageset/Group_2335@3x.png b/QuickLocation/Assets.xcassets/VipIcon/1.imageset/Group_2335@3x.png deleted file mode 100644 index f4ee609a..00000000 Binary files a/QuickLocation/Assets.xcassets/VipIcon/1.imageset/Group_2335@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipIcon/2.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipIcon/2.imageset/Contents.json deleted file mode 100644 index b255a01a..00000000 --- a/QuickLocation/Assets.xcassets/VipIcon/2.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2334@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2334@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipIcon/2.imageset/Group_2334@2x.png b/QuickLocation/Assets.xcassets/VipIcon/2.imageset/Group_2334@2x.png deleted file mode 100644 index 2201a33e..00000000 Binary files a/QuickLocation/Assets.xcassets/VipIcon/2.imageset/Group_2334@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipIcon/2.imageset/Group_2334@3x.png b/QuickLocation/Assets.xcassets/VipIcon/2.imageset/Group_2334@3x.png deleted file mode 100644 index e6e61fef..00000000 Binary files a/QuickLocation/Assets.xcassets/VipIcon/2.imageset/Group_2334@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipIcon/4.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipIcon/4.imageset/Contents.json deleted file mode 100644 index 01bf7f2e..00000000 --- a/QuickLocation/Assets.xcassets/VipIcon/4.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group_2333@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group_2333@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipIcon/4.imageset/Group_2333@2x.png b/QuickLocation/Assets.xcassets/VipIcon/4.imageset/Group_2333@2x.png deleted file mode 100644 index 90634a76..00000000 Binary files a/QuickLocation/Assets.xcassets/VipIcon/4.imageset/Group_2333@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipIcon/4.imageset/Group_2333@3x.png b/QuickLocation/Assets.xcassets/VipIcon/4.imageset/Group_2333@3x.png deleted file mode 100644 index cd3d823d..00000000 Binary files a/QuickLocation/Assets.xcassets/VipIcon/4.imageset/Group_2333@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipIcon/Contents.json b/QuickLocation/Assets.xcassets/VipIcon/Contents.json deleted file mode 100644 index 6e965652..00000000 --- a/QuickLocation/Assets.xcassets/VipIcon/Contents.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "provides-namespace" : true - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/Contents.json deleted file mode 100644 index 6e965652..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/Contents.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "provides-namespace" : true - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/ad.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/ad.imageset/Contents.json deleted file mode 100644 index f933c107..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/ad.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 1862@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 1862@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/ad.imageset/Group 1862@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/ad.imageset/Group 1862@2x.png deleted file mode 100644 index 50ca6e7b..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/ad.imageset/Group 1862@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/ad.imageset/Group 1862@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/ad.imageset/Group 1862@3x.png deleted file mode 100644 index fe541570..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/ad.imageset/Group 1862@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/alipay.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/alipay.imageset/Contents.json deleted file mode 100644 index cab8b8c2..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/alipay.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "alipay@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "alipay@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/alipay.imageset/alipay@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/alipay.imageset/alipay@2x.png deleted file mode 100644 index 0486e2ed..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/alipay.imageset/alipay@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/alipay.imageset/alipay@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/alipay.imageset/alipay@3x.png deleted file mode 100644 index 0aa9201c..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/alipay.imageset/alipay@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/apple.imageset/apple@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/apple.imageset/apple@2x.png deleted file mode 100644 index 63d4e759..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/apple.imageset/apple@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/apple.imageset/apple@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/apple.imageset/apple@3x.png deleted file mode 100644 index c26a6eaf..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/apple.imageset/apple@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/battery.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/battery.imageset/Contents.json deleted file mode 100644 index c2f2165a..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/battery.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 1863@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 1863@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/battery.imageset/Group 1863@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/battery.imageset/Group 1863@2x.png deleted file mode 100644 index a380fc95..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/battery.imageset/Group 1863@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/battery.imageset/Group 1863@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/battery.imageset/Group 1863@3x.png deleted file mode 100644 index b8d6462c..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/battery.imageset/Group 1863@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/bubble.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/bubble.imageset/Contents.json deleted file mode 100644 index 97cc5bb0..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/bubble.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 1861@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 1861@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/bubble.imageset/Group 1861@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/bubble.imageset/Group 1861@2x.png deleted file mode 100644 index 60468f40..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/bubble.imageset/Group 1861@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/bubble.imageset/Group 1861@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/bubble.imageset/Group 1861@3x.png deleted file mode 100644 index 1fa637f0..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/bubble.imageset/Group 1861@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/checkbox.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/checkbox.imageset/Contents.json deleted file mode 100644 index be2b233f..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/checkbox.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "tick-circle@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "tick-circle@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/checkbox.imageset/tick-circle@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/checkbox.imageset/tick-circle@2x.png deleted file mode 100644 index 1aea72ee..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/checkbox.imageset/tick-circle@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/checkbox.imageset/tick-circle@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/checkbox.imageset/tick-circle@3x.png deleted file mode 100644 index d2736729..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/checkbox.imageset/tick-circle@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/checkbox_on.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/checkbox_on.imageset/Contents.json deleted file mode 100644 index 7df9bd8a..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/checkbox_on.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "icon_yindao_change@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "icon_yindao_change@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/checkbox_on.imageset/icon_yindao_change@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/checkbox_on.imageset/icon_yindao_change@2x.png deleted file mode 100644 index d9495776..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/checkbox_on.imageset/icon_yindao_change@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/checkbox_on.imageset/icon_yindao_change@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/checkbox_on.imageset/icon_yindao_change@3x.png deleted file mode 100644 index 537ce9f2..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/checkbox_on.imageset/icon_yindao_change@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/count_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/count_bg.imageset/Contents.json deleted file mode 100644 index 46ca7373..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/count_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Rectangle 42116@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Rectangle 42116@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/count_bg.imageset/Rectangle 42116@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/count_bg.imageset/Rectangle 42116@2x.png deleted file mode 100644 index 954a2f5f..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/count_bg.imageset/Rectangle 42116@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/count_bg.imageset/Rectangle 42116@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/count_bg.imageset/Rectangle 42116@3x.png deleted file mode 100644 index 157e5c5a..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/count_bg.imageset/Rectangle 42116@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/create_count.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/create_count.imageset/Contents.json deleted file mode 100644 index 7b61b413..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/create_count.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "create_count@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "create_count@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/create_count.imageset/create_count@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/create_count.imageset/create_count@2x.png deleted file mode 100644 index 9bfc2e7e..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/create_count.imageset/create_count@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/create_count.imageset/create_count@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/create_count.imageset/create_count@3x.png deleted file mode 100644 index 46efb629..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/create_count.imageset/create_count@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/emoji.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/emoji.imageset/Contents.json deleted file mode 100644 index e1c26855..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/emoji.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 1864@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 1864@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/emoji.imageset/Group 1864@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/emoji.imageset/Group 1864@2x.png deleted file mode 100644 index 1bed3b0f..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/emoji.imageset/Group 1864@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/emoji.imageset/Group 1864@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/emoji.imageset/Group 1864@3x.png deleted file mode 100644 index 99d51550..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/emoji.imageset/Group 1864@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/expense.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/expense.imageset/Contents.json deleted file mode 100644 index 336fa3d8..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/expense.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "expense@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "expense@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/expense.imageset/expense@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/expense.imageset/expense@2x.png deleted file mode 100644 index 68f0a7e9..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/expense.imageset/expense@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/expense.imageset/expense@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/expense.imageset/expense@3x.png deleted file mode 100644 index ccb118dc..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/expense.imageset/expense@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/expense_on.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/expense_on.imageset/Contents.json deleted file mode 100644 index d3f0b1bc..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/expense_on.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "expense_on@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "expense_on@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/expense_on.imageset/expense_on@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/expense_on.imageset/expense_on@2x.png deleted file mode 100644 index 34286891..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/expense_on.imageset/expense_on@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/expense_on.imageset/expense_on@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/expense_on.imageset/expense_on@3x.png deleted file mode 100644 index 42402490..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/expense_on.imageset/expense_on@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/expense_tips.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/expense_tips.imageset/Contents.json deleted file mode 100644 index c6aa04ae..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/expense_tips.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Rectangle 868@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Rectangle 868@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/expense_tips.imageset/Rectangle 868@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/expense_tips.imageset/Rectangle 868@2x.png deleted file mode 100644 index 3e297a8f..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/expense_tips.imageset/Rectangle 868@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/expense_tips.imageset/Rectangle 868@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/expense_tips.imageset/Rectangle 868@3x.png deleted file mode 100644 index e3f37b98..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/expense_tips.imageset/Rectangle 868@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/header_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/header_bg.imageset/Contents.json deleted file mode 100644 index 3c4bace7..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/header_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "header_bg@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "header_bg@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/header_bg.imageset/header_bg@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/header_bg.imageset/header_bg@2x.png deleted file mode 100644 index e0ce026b..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/header_bg.imageset/header_bg@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/header_bg.imageset/header_bg@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/header_bg.imageset/header_bg@3x.png deleted file mode 100644 index 178f1bd6..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/header_bg.imageset/header_bg@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/join_count.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/join_count.imageset/Contents.json deleted file mode 100644 index 199fbabd..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/join_count.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "join_count@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "join_count@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/join_count.imageset/join_count@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/join_count.imageset/join_count@2x.png deleted file mode 100644 index 0945ec4d..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/join_count.imageset/join_count@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/join_count.imageset/join_count@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/join_count.imageset/join_count@3x.png deleted file mode 100644 index 40050c60..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/join_count.imageset/join_count@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/location.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/location.imageset/Contents.json deleted file mode 100644 index ff8627aa..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/location.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 1858@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 1858@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/location.imageset/Group 1858@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/location.imageset/Group 1858@2x.png deleted file mode 100644 index 2b40d9d2..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/location.imageset/Group 1858@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/location.imageset/Group 1858@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/location.imageset/Group 1858@3x.png deleted file mode 100644 index 5dc3b222..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/location.imageset/Group 1858@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/map.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/map.imageset/Contents.json deleted file mode 100644 index 63b3bb65..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/map.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 1859@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 1859@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/map.imageset/Group 1859@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/map.imageset/Group 1859@2x.png deleted file mode 100644 index bb12eed7..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/map.imageset/Group 1859@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/map.imageset/Group 1859@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/map.imageset/Group 1859@3x.png deleted file mode 100644 index 34129e61..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/map.imageset/Group 1859@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/member_count.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/member_count.imageset/Contents.json deleted file mode 100644 index 04df8642..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/member_count.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "member_count@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "member_count@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/member_count.imageset/member_count@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/member_count.imageset/member_count@2x.png deleted file mode 100644 index d6305b85..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/member_count.imageset/member_count@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/member_count.imageset/member_count@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/member_count.imageset/member_count@3x.png deleted file mode 100644 index a202edd1..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/member_count.imageset/member_count@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/pay_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/pay_bg.imageset/Contents.json deleted file mode 100644 index 66ed8100..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/pay_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "组 47671@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "组 47671@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/pay_bg.imageset/组 47671@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/pay_bg.imageset/组 47671@2x.png deleted file mode 100644 index 36bb627b..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/pay_bg.imageset/组 47671@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/pay_bg.imageset/组 47671@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/pay_bg.imageset/组 47671@3x.png deleted file mode 100644 index cd2a6ffb..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/pay_bg.imageset/组 47671@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/separator.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/separator.imageset/Contents.json deleted file mode 100644 index 39a9a68a..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/separator.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Rectangle 42118@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Rectangle 42118@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/separator.imageset/Rectangle 42118@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/separator.imageset/Rectangle 42118@2x.png deleted file mode 100644 index 55080d42..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/separator.imageset/Rectangle 42118@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/separator.imageset/Rectangle 42118@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/separator.imageset/Rectangle 42118@3x.png deleted file mode 100644 index 567a3bb6..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/separator.imageset/Rectangle 42118@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/service.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/service.imageset/Contents.json deleted file mode 100644 index 294d73d7..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/service.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 1865@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 1865@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/service.imageset/Group 1865@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/service.imageset/Group 1865@2x.png deleted file mode 100644 index 66efe732..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/service.imageset/Group 1865@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/service.imageset/Group 1865@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/service.imageset/Group 1865@3x.png deleted file mode 100644 index 97646094..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/service.imageset/Group 1865@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/sos.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/sos.imageset/Contents.json deleted file mode 100644 index b94f8483..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/sos.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Group 1860@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Group 1860@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/sos.imageset/Group 1860@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/sos.imageset/Group 1860@2x.png deleted file mode 100644 index ac2a024e..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/sos.imageset/Group 1860@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/sos.imageset/Group 1860@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/sos.imageset/Group 1860@3x.png deleted file mode 100644 index e7d450d1..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/sos.imageset/Group 1860@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/waive_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/waive_bg.imageset/Contents.json deleted file mode 100644 index 857db5c1..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/waive_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "waive_bg@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "waive_bg@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/waive_bg.imageset/waive_bg@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/waive_bg.imageset/waive_bg@2x.png deleted file mode 100644 index 16d72ff8..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/waive_bg.imageset/waive_bg@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/waive_bg.imageset/waive_bg@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/waive_bg.imageset/waive_bg@3x.png deleted file mode 100644 index 6a33d0b7..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/waive_bg.imageset/waive_bg@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/wechat.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRecharge/wechat.imageset/Contents.json deleted file mode 100644 index cb4bb44c..00000000 --- a/QuickLocation/Assets.xcassets/VipRecharge/wechat.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "wechat@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "wechat@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRecharge/wechat.imageset/wechat@2x.png b/QuickLocation/Assets.xcassets/VipRecharge/wechat.imageset/wechat@2x.png deleted file mode 100644 index c67ab4d6..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/wechat.imageset/wechat@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRecharge/wechat.imageset/wechat@3x.png b/QuickLocation/Assets.xcassets/VipRecharge/wechat.imageset/wechat@3x.png deleted file mode 100644 index d7d90524..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRecharge/wechat.imageset/wechat@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRights/Contents.json b/QuickLocation/Assets.xcassets/VipRights/Contents.json deleted file mode 100644 index 6e965652..00000000 --- a/QuickLocation/Assets.xcassets/VipRights/Contents.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "provides-namespace" : true - } -} diff --git a/QuickLocation/Assets.xcassets/VipRights/bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRights/bg.imageset/Contents.json deleted file mode 100644 index 36577ccf..00000000 --- a/QuickLocation/Assets.xcassets/VipRights/bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "bg@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "bg@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRights/bg.imageset/bg@2x.png b/QuickLocation/Assets.xcassets/VipRights/bg.imageset/bg@2x.png deleted file mode 100644 index 9fb0eefe..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRights/bg.imageset/bg@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRights/bg.imageset/bg@3x.png b/QuickLocation/Assets.xcassets/VipRights/bg.imageset/bg@3x.png deleted file mode 100644 index 5111c2c9..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRights/bg.imageset/bg@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRights/detail.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRights/detail.imageset/Contents.json deleted file mode 100644 index 250174bc..00000000 --- a/QuickLocation/Assets.xcassets/VipRights/detail.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "desc@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "desc@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRights/detail.imageset/desc@2x.png b/QuickLocation/Assets.xcassets/VipRights/detail.imageset/desc@2x.png deleted file mode 100644 index 24afb0ef..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRights/detail.imageset/desc@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRights/detail.imageset/desc@3x.png b/QuickLocation/Assets.xcassets/VipRights/detail.imageset/desc@3x.png deleted file mode 100644 index ae1d85a3..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRights/detail.imageset/desc@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRights/header_bg.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRights/header_bg.imageset/Contents.json deleted file mode 100644 index 3c4bace7..00000000 --- a/QuickLocation/Assets.xcassets/VipRights/header_bg.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "header_bg@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "header_bg@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRights/header_bg.imageset/header_bg@2x.png b/QuickLocation/Assets.xcassets/VipRights/header_bg.imageset/header_bg@2x.png deleted file mode 100644 index cf370e89..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRights/header_bg.imageset/header_bg@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRights/header_bg.imageset/header_bg@3x.png b/QuickLocation/Assets.xcassets/VipRights/header_bg.imageset/header_bg@3x.png deleted file mode 100644 index bb3fa4a0..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRights/header_bg.imageset/header_bg@3x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRights/logo.imageset/Contents.json b/QuickLocation/Assets.xcassets/VipRights/logo.imageset/Contents.json deleted file mode 100644 index 71810bb7..00000000 --- a/QuickLocation/Assets.xcassets/VipRights/logo.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "logo@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "logo@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/QuickLocation/Assets.xcassets/VipRights/logo.imageset/logo@2x.png b/QuickLocation/Assets.xcassets/VipRights/logo.imageset/logo@2x.png deleted file mode 100644 index 06d8ca23..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRights/logo.imageset/logo@2x.png and /dev/null differ diff --git a/QuickLocation/Assets.xcassets/VipRights/logo.imageset/logo@3x.png b/QuickLocation/Assets.xcassets/VipRights/logo.imageset/logo@3x.png deleted file mode 100644 index 3c56b5be..00000000 Binary files a/QuickLocation/Assets.xcassets/VipRights/logo.imageset/logo@3x.png and /dev/null differ diff --git a/QuickLocation/Common/Constant.swift b/QuickLocation/Common/Constant.swift index d7f08e00..836be69a 100644 --- a/QuickLocation/Common/Constant.swift +++ b/QuickLocation/Common/Constant.swift @@ -63,6 +63,8 @@ extension Notification.Name { static let RefreshGroupInfoNotification = Notification.Name("RefreshGroupInfoNotification") /// 刷新IM圈子列表数据 static let RefreshIMGroupListNotification = Notification.Name("RefreshIMGroupListNotification") + /// 圈子聊天记录已清空 + static let GroupChatHistoryDidClearNotification = Notification.Name("GroupChatHistoryDidClearNotification") /// 查看成员位置 static let ShowMemberLocationNotification = Notification.Name("ShowMemberLocationNotification") /// 支付宝/微信支付结果回调 diff --git a/QuickLocation/Manager/App/ApiManager.swift b/QuickLocation/Manager/App/ApiManager.swift index ad997872..7e596bc2 100644 --- a/QuickLocation/Manager/App/ApiManager.swift +++ b/QuickLocation/Manager/App/ApiManager.swift @@ -108,7 +108,9 @@ extension ApiManager { return result // case GatewayStatusCode.outdateVersion.rawValue: // 版本过低 // handleOutdateVersion(message) - case GatewayStatusCode.userLoginExpair.rawValue: // token失效 + case GatewayStatusCode.userLoginExpair.rawValue, + GatewayStatusCode.userLoginExpair2.rawValue, + GatewayStatusCode.userLoginExpair3.rawValue: // token失效 handleTokenExpired(msg: message) case GatewayStatusCode.failure.rawValue, GatewayStatusCode.noAuthority.rawValue: // 退出当前界面 handlePopView(message, handle) @@ -191,7 +193,7 @@ extension ApiManager { private func handleNeedVip(_ msg: String) { MainAsync { UIViewController.showConfirmPop(title: "温馨提示", message: msg, confirmText: "去开通", confirmBlock: { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) }, cancelText: "取消") } } diff --git a/QuickLocation/Manager/App/RouterManager.swift b/QuickLocation/Manager/App/RouterManager.swift index 7135e2a7..24ea7e38 100644 --- a/QuickLocation/Manager/App/RouterManager.swift +++ b/QuickLocation/Manager/App/RouterManager.swift @@ -25,10 +25,6 @@ enum Route: String { case groupIconList = "groupIconList" /// 头像图标 case avatarIconList = "avatarIconList" - /// 会员充值 - case vipRecharge = "vipRecharge" - /// 权益对比 - case vipRights = "vipRights" /// 群聊 case groupChat = "groupChat" /// 圈子资料 @@ -107,8 +103,6 @@ enum Route: String { case sosList = "sosList" /// 圈子消息 case mailbox = "mailbox" - /// 充值优惠弹窗 - case promotionalActivities = "promotionalActivities" } extension Route: RouterTarget { @@ -228,16 +222,6 @@ extension AppRouter: AppRouterProtocol { let vc = AvatarIconListVC(iconIndex: parameters["iconIndex"].safeString) return vc } - - // MARK: - 充值会员 - AppRouter.register(Route.vipRecharge) { url, parameters in - VipRechargeVC() - } - - // MARK: - 权益对比 - AppRouter.register(Route.vipRights) { url, parameters in - VipRightsVC() - } // MARK: - 群聊 AppRouter.register(Route.groupChat) { url, parameters in @@ -475,10 +459,5 @@ extension AppRouter: AppRouterProtocol { vc.isNeedLogin = true return vc } - - // MARK: - 充值优惠弹窗 - AppRouter.register(Route.promotionalActivities) { url, parameters in - PromotionalActivitiesVC() - } } } diff --git a/QuickLocation/Manager/URL/URLManager.swift b/QuickLocation/Manager/URL/URLManager.swift index f48fb543..d8b9c877 100644 --- a/QuickLocation/Manager/URL/URLManager.swift +++ b/QuickLocation/Manager/URL/URLManager.swift @@ -32,10 +32,12 @@ extension DefaultsKeys { var openIM_API = "" var openIM_WS = "" + /// + var homeUrl: String { "https://u.batiao8.com/ushare/10057" } /// 用户协议 var userAgreementUrl: String { "https://smartdrive.zuom8.cn/jisu/Agreement.html" } /// 隐私政策 - var privacyPolicyUrl: String { "https://smartdrive.zuom8.cn/jisu/Privacy.html" } + var privacyPolicyUrl: String { "https://smartdrive.zuom8.cn/jisu/Privacy-ios.html" } /// 儿童 var kidsPrivacyUrl: String { "https://smartdrive.zuom8.cn/jisu/KidsPrivacy.html" } /// 注销须知 diff --git a/QuickLocation/Model/GroupModel.swift b/QuickLocation/Model/GroupModel.swift index 938c1a82..088bf3b2 100644 --- a/QuickLocation/Model/GroupModel.swift +++ b/QuickLocation/Model/GroupModel.swift @@ -475,19 +475,6 @@ struct GroupMemberModel: Mappable, Equatable { var shouldShowVipAvatarFrame: Bool { AppContextManager.shared.systemConfig?.isIntercept != true && level != 1 } - var vipIcon: UIImage { - guard AppContextManager.shared.systemConfig?.isIntercept != true else { - return UIImage() - } - switch level { - case 2: // 白银 - return UIImage(named: "VipIcon/2") ?? UIImage() - case 3: // 永久 - return UIImage(named: "VipIcon/1") ?? UIImage() - default: - return UIImage() - } - } /// 状态:0、无状态 1、SOS 2、气泡等 var status: Int = 0 /// 入圈天数(若服务端下发) diff --git a/QuickLocation/Section/Explore/FeatureIntroVC.swift b/QuickLocation/Section/Explore/FeatureIntroVC.swift index 06577a45..3a406c11 100644 --- a/QuickLocation/Section/Explore/FeatureIntroVC.swift +++ b/QuickLocation/Section/Explore/FeatureIntroVC.swift @@ -81,7 +81,7 @@ extension FeatureIntroVC: SDCycleScrollViewDelegate { switch model.type { case "app": if model.url == "member" { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) } case "web": AppRouter.push(Route.web, userInfo: ["url": model.url]) diff --git a/QuickLocation/Section/Group/CreateGroup/CreateGroupVipPopView.swift b/QuickLocation/Section/Group/CreateGroup/CreateGroupVipPopView.swift index 51948373..f3443f00 100644 --- a/QuickLocation/Section/Group/CreateGroup/CreateGroupVipPopView.swift +++ b/QuickLocation/Section/Group/CreateGroup/CreateGroupVipPopView.swift @@ -48,7 +48,7 @@ class CreateGroupVipPopView: UIView { private func setupRx() { upgradedBtn.rx.tap.subscribe(onNext: { _ in CreateGroupVipPopView.dismiss() - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) }).disposed(by: disposeBag) closeBtn.rx.tap.subscribe(onNext: { _ in diff --git a/QuickLocation/Section/Group/GroupChat/GroupChatVC.swift b/QuickLocation/Section/Group/GroupChat/GroupChatVC.swift index f349868f..1669b826 100644 --- a/QuickLocation/Section/Group/GroupChat/GroupChatVC.swift +++ b/QuickLocation/Section/Group/GroupChat/GroupChatVC.swift @@ -268,6 +268,20 @@ final class GroupChatVC: BaseViewController { }) .disposed(by: disposeBag) + NotificationCenter.default.rx.notification(.GroupChatHistoryDidClearNotification) + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] notification in + guard let self, + let groupKey = notification.userInfo?[GroupDataChangeUserInfoKey.groupKey] as? String, + groupKey == self.viewModel.groupId else { return } + self.pendingOffsetRestore = nil + self.pendingMessageReloadAnchor = nil + self.needsInitialBottomScroll = false + self.rootView.tableView.mj_header?.endRefreshing() + self.viewModel.clearMessages() + }) + .disposed(by: disposeBag) + let emojiItems = UIView.emojiFileNames.map { $0 } Observable.just([SectionModel(model: "", items: emojiItems)]) .bind(to: rootView.emojiCollectionView.rx.items(dataSource: emojiDataSource)) @@ -578,7 +592,7 @@ final class GroupChatVC: BaseViewController { private func requireVipForMedia() -> Bool { guard isVipUnlocked else { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) return false } return true @@ -1419,12 +1433,16 @@ private final class ChatCurrentLocationAnnotationView: MAAnnotationView { final class ChatLocationPickerVC: BaseViewController { override var isNavigationBarHidden: Bool { true } + private let collapsedResultPanelHeight: CGFloat = 290 var onPickedLocation: ((ChatLocationPayload) -> Void)? private var rootView: ChatLocationPickerView! private var currentCoordinate: CLLocationCoordinate2D? private var selectedLocation: ChatLocationSuggestion? private var suggestions: [ChatLocationSuggestion] = [] private var searchWorkItem: DispatchWorkItem? + private var isResultPanelExpanded = false + private var keyboardManagerWasEnabled = true + private var keyboardManagerResignOnTouchOutside = true #if !targetEnvironment(simulator) private let searchAPI = AMapSearchAPI() @@ -1445,9 +1463,25 @@ final class ChatLocationPickerVC: BaseViewController { rootView.recenterBtn.addTarget(self, action: #selector(recenterToCurrentLocation), for: .touchUpInside) rootView.searchField.addTarget(self, action: #selector(searchChanged), for: .editingChanged) rootView.searchField.addTarget(self, action: #selector(search), for: .editingDidEndOnExit) + setupKeyboard() setupMap() } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + keyboardManagerWasEnabled = IQKeyboardManager.shared.isEnabled + keyboardManagerResignOnTouchOutside = IQKeyboardManager.shared.resignOnTouchOutside + IQKeyboardManager.shared.isEnabled = false + IQKeyboardManager.shared.resignOnTouchOutside = false + view.transform = .identity + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + IQKeyboardManager.shared.isEnabled = keyboardManagerWasEnabled + IQKeyboardManager.shared.resignOnTouchOutside = keyboardManagerResignOnTouchOutside + } + override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) if isMovingFromParent || isBeingDismissed { @@ -1502,6 +1536,33 @@ final class ChatLocationPickerVC: BaseViewController { #endif } + private func setupKeyboard() { + NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification) + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] notification in + guard let self, + self.isViewLoaded, + self.view.window != nil, + self.rootView.searchField.isFirstResponder else { return } + let duration = (notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double) ?? 0.25 + self.setResultPanelExpanded(true, duration: duration) + }) + .disposed(by: disposeBag) + + } + + private func setResultPanelExpanded(_ expanded: Bool, duration: TimeInterval = 0.25) { + guard isResultPanelExpanded != expanded else { return } + isResultPanelExpanded = expanded + let height = expanded ? view.bounds.height * 2 / 3 : collapsedResultPanelHeight + rootView.setResultPanelHeight(height, duration: duration) + } + + private func collapseResultPanel() { + setResultPanelExpanded(false) + rootView.searchField.resignFirstResponder() + } + @objc private func recenterToCurrentLocation() { guard let currentCoordinate else { DLToast.showError(text: "暂无当前位置") @@ -1637,6 +1698,11 @@ final class ChatLocationPickerVC: BaseViewController { extension ChatLocationPickerVC: UITableViewDataSource, UITableViewDelegate { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { suggestions.count } + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + guard scrollView === rootView.resultTableView else { return } + rootView.searchField.resignFirstResponder() + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "ChatLocationSuggestionCell", for: indexPath) as? ChatLocationSuggestionCell else { return UITableViewCell() @@ -1649,7 +1715,7 @@ extension ChatLocationPickerVC: UITableViewDataSource, UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) - rootView.searchField.resignFirstResponder() + collapseResultPanel() let location = suggestions[indexPath.row] select(location, recenterMap: true) } @@ -1704,11 +1770,21 @@ extension ChatLocationPickerVC: AMapSearchDelegate, MAMapViewDelegate { func mapView(_ mapView: MAMapView!, regionDidChangeAnimated animated: Bool, wasUserAction: Bool) { guard wasUserAction else { return } + collapseResultPanel() let center = CGPoint(x: mapView.bounds.midX, y: mapView.bounds.midY) let coordinate = mapView.convert(center, toCoordinateFrom: mapView) selectMapCenterLocation(coordinate) } + func mapView(_ mapView: MAMapView!, mapWillMoveByUser wasUserAction: Bool) { + guard wasUserAction else { return } + collapseResultPanel() + } + + func mapView(_ mapView: MAMapView!, didSingleTappedAt coordinate: CLLocationCoordinate2D) { + collapseResultPanel() + } + func mapView(_ mapView: MAMapView!, viewFor annotation: MAAnnotation!) -> MAAnnotationView! { guard annotation is ChatCurrentLocationAnnotation else { return nil } let identifier = "ChatCurrentLocation" @@ -1723,6 +1799,8 @@ extension ChatLocationPickerVC: AMapSearchDelegate, MAMapViewDelegate { #endif private final class ChatLocationPickerView: UIView { + private var resultPanelHeightConstraint: NSLayoutConstraint? + #if !targetEnvironment(simulator) lazy var mapView: MAMapView! = { let map = MAMapView() @@ -1846,6 +1924,7 @@ private final class ChatLocationPickerView: UIView { recenterBtn.layoutChain.left(13).bottomToTopOfView(selectedPanel, offset: -24).width(38).height(38) confirmBtn.layoutChain.right(14).width(50).height(30).centerY(backBtn) selectedPanel.layoutChain.edgesHorzontal().bottom().height(290) + resultPanelHeightConstraint = selectedPanel.layoutChain.constraint searchField.layoutChain.top(13).edgesHorzontal(15).height(38) resultTableView.layoutChain.topToBottomOfView(searchField, offset: 13).edgesHorzontal(0).bottom() emptyLabel.layoutChain.centerX().centerY().edgesHorzontal(40) @@ -1856,6 +1935,18 @@ private final class ChatLocationPickerView: UIView { #endif } + func setResultPanelHeight(_ height: CGFloat, duration: TimeInterval) { + guard let resultPanelHeightConstraint, + abs(resultPanelHeightConstraint.constant - height) > 0.5 else { return } + layoutIfNeeded() + resultPanelHeightConstraint.constant = height + UIView.animate(withDuration: duration, + delay: 0, + options: [.beginFromCurrentState, .curveEaseInOut]) { + self.layoutIfNeeded() + } + } + #if !targetEnvironment(simulator) func cleanupMap() { mapView?.delegate = nil @@ -1915,11 +2006,11 @@ final class ChatLocationDetailVC: BaseViewController { currentCoordinate = coordinate let distance = CLLocation(latitude: latitude, longitude: longitude) .distance(from: CLLocation(latitude: location.latitude, longitude: location.longitude)) - rootView.distanceLabel.text = "距离你约 \(chatDistanceText(distance))" + rootView.distanceLabel.setDistance(distance) } } if currentCoordinate == nil { - rootView.distanceLabel.text = "暂未获取当前位置" + rootView.distanceLabel.setDistance(nil) } #if !targetEnvironment(simulator) rootView.mapView.delegate = self @@ -1949,8 +2040,8 @@ final class ChatLocationDetailVC: BaseViewController { private func requestRoutes() { guard let currentCoordinate else { - rootView.drivingLabel.text = "驾车 暂无当前位置" - rootView.walkingLabel.text = "步行 暂无当前位置" + rootView.drivingLabel.setDuration(nil) + rootView.walkingLabel.setDuration(nil) return } let origin = AMapGeoPoint.location(withLatitude: CGFloat(currentCoordinate.latitude), longitude: CGFloat(currentCoordinate.longitude)) @@ -1971,21 +2062,27 @@ final class ChatLocationDetailVC: BaseViewController { #if !targetEnvironment(simulator) extension ChatLocationDetailVC: AMapSearchDelegate, MAMapViewDelegate { func onRouteSearchDone(_ request: AMapRouteSearchBaseRequest!, response: AMapRouteSearchResponse!) { - guard let path = response.route?.paths?.first as? AMapPath else { return } - let text = chatDurationText(TimeInterval(path.duration)) + guard let path = response.route?.paths?.first as? AMapPath else { + if request is AMapDrivingRouteSearchRequest { + rootView.drivingLabel.setDuration(nil) + } else if request is AMapWalkingRouteSearchRequest { + rootView.walkingLabel.setDuration(nil) + } + return + } if request is AMapDrivingRouteSearchRequest { - rootView.drivingLabel.text = "驾车 约\(text)" + rootView.drivingLabel.setDuration(TimeInterval(path.duration)) drawDrivingRoute(path) } else if request is AMapWalkingRouteSearchRequest { - rootView.walkingLabel.text = "步行 约\(text)" + rootView.walkingLabel.setDuration(TimeInterval(path.duration)) } } func aMapSearchRequest(_ request: Any!, didFailWithError error: Error!) { if request is AMapDrivingRouteSearchRequest { - rootView.drivingLabel.text = "驾车 路线加载失败" + rootView.drivingLabel.setDuration(nil) } else if request is AMapWalkingRouteSearchRequest { - rootView.walkingLabel.text = "步行 路线加载失败" + rootView.walkingLabel.setDuration(nil) } } @@ -2006,6 +2103,14 @@ extension ChatLocationDetailVC: AMapSearchDelegate, MAMapViewDelegate { if let overlay = MAPolyline(coordinates: &mutableCoordinates, count: UInt(coordinates.count)) { rootView.mapView.add(overlay) routeOverlays.append(overlay) + rootView.layoutIfNeeded() + let padding = UIEdgeInsets( + top: kNaviHeight + 18, + left: 36, + bottom: ChatLocationDetailView.bottomCardHeight + 24, + right: 36 + ) + rootView.mapView.showOverlays(routeOverlays, edgePadding: padding, animated: true) } } @@ -2040,6 +2145,8 @@ extension ChatLocationDetailVC: AMapSearchDelegate, MAMapViewDelegate { #endif private final class ChatLocationDetailView: UIView { + static let bottomCardHeight = 153 + kSafeBottomMargin + #if !targetEnvironment(simulator) lazy var mapView: MAMapView! = { let map = MAMapView() @@ -2069,32 +2176,24 @@ private final class ChatLocationDetailView: UIView { let nameLabel: UILabel = { let label = UILabel() label.font = .systemFont(ofSize: 19, weight: .semibold) - label.textColor = UIColor(hexStr: "#262626") + label.textColor = UIColor(hexStr: "#293445") return label }() let addressLabel: UILabel = { let label = UILabel() - label.font = .systemFont(ofSize: 13) - label.textColor = UIColor(hexStr: "#858585") + label.font = .systemFont(ofSize: 15) + label.textColor = UIColor(hexStr: "#293445") label.numberOfLines = 2 return label }() - let distanceLabel: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 13) - label.textColor = UIColor(hexStr: "#16B3FF") - label.textAlignment = .center - label.backgroundColor = UIColor(hexStr: "#F4F5F6") - label.cornerRadius = 8 - return label - }() - let drivingLabel: UILabel = routeLabel(icon: "驾", color: UIColor(hexStr: "#16B3FF")) - let walkingLabel: UILabel = routeLabel(icon: "步", color: UIColor(hexStr: "#21B573")) + let distanceLabel = ChatLocationMetricLabel() + let drivingLabel = ChatLocationMetricLabel(iconName: "IM/location_driving") + let walkingLabel = ChatLocationMetricLabel(iconName: "IM/location_walking") private let routeStack: UIStackView = { let stack = UIStackView() stack.axis = .horizontal - stack.alignment = .fill - stack.distribution = .fillEqually + stack.alignment = .center + stack.distribution = .fill stack.spacing = 8 return stack }() @@ -2126,12 +2225,18 @@ private final class ChatLocationDetailView: UIView { routeStack.addArrangedSubview(drivingLabel) routeStack.addArrangedSubview(walkingLabel) - backBtn.layoutChain.top(kStatusBarHeight + 12).left(18).width(32).height(32) + backBtn.layoutChain.top(kStatusBarHeight - 4).left(11).width(47).height(47) mapHintLabel.layoutChain.centerX().centerY().edgesHorzontal(40) - card.layoutChain.edgesHorzontal().bottom().height(210 + kSafeBottomMargin) - nameLabel.layoutChain.top(22).left(20).right(20) - addressLabel.layoutChain.topToBottomOfView(nameLabel, offset: 8).left(20).right(20) - routeStack.layoutChain.topToBottomOfView(addressLabel, offset: 18).edgesHorzontal(20).height(32) + card.layoutChain.edgesHorzontal().bottom().height(Self.bottomCardHeight) + nameLabel.layoutChain.top(24).left(16).right(16) + addressLabel.layoutChain.topToBottomOfView(nameLabel, offset: 8).left(16).right(16) + routeStack.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + routeStack.leadingAnchor.constraint(equalTo: card.leadingAnchor, constant: 16), + routeStack.trailingAnchor.constraint(lessThanOrEqualTo: card.trailingAnchor, constant: -16), + routeStack.topAnchor.constraint(equalTo: addressLabel.bottomAnchor, constant: 10), + routeStack.heightAnchor.constraint(equalToConstant: 30) + ]) } #if !targetEnvironment(simulator) @@ -2142,23 +2247,102 @@ private final class ChatLocationDetailView: UIView { } #endif - private static func routeLabel(icon: String, color: UIColor) -> UILabel { - let label = UILabel() - label.text = "\(icon) 路线计算中" - label.font = .systemFont(ofSize: 12, weight: .medium) - label.textAlignment = .center - label.textColor = color - label.backgroundColor = color.withAlphaComponent(0.1) - label.cornerRadius = 8 - return label +} + +private final class ChatLocationMetricLabel: UILabel { + private let iconName: String? + private let textInsets = UIEdgeInsets(top: 5, left: 8, bottom: 5, right: 8) + + init(iconName: String? = nil) { + self.iconName = iconName + super.init(frame: .zero) + backgroundColor = UIColor(hexStr: "#F7F7F7") + layer.cornerRadius = 8 + clipsToBounds = true + numberOfLines = 1 + setMetric(prefix: iconName == nil ? "距你 " : "", value: nil, suffix: "") + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + func setDistance(_ distance: CLLocationDistance?) { + guard let distance else { + setMetric(prefix: "距你 ", value: nil, suffix: "") + return + } + if distance >= 1000 { + setMetric(prefix: "距你 ", value: String(format: "%.1f", distance / 1000), suffix: " 公里") + } else { + setMetric(prefix: "距你 ", value: "\(Int(distance))", suffix: " 米") + } + } + + func setDuration(_ duration: TimeInterval?) { + guard let duration, duration > 0 else { + setMetric(prefix: "", value: nil, suffix: "") + return + } + let minutes = max(1, Int(ceil(duration / 60))) + if minutes >= 60 { + let hours = minutes / 60 + let remainingMinutes = minutes % 60 + if remainingMinutes > 0 { + setMetric(prefix: "", + value: "\(hours)", + suffix: " 小时 ", + secondaryValue: "\(remainingMinutes)", + secondarySuffix: " 分钟") + } else { + setMetric(prefix: "", value: "\(hours)", suffix: " 小时") + } + } else { + setMetric(prefix: "", value: "\(minutes)", suffix: " 分钟") + } + } + + override func drawText(in rect: CGRect) { + super.drawText(in: rect.inset(by: textInsets)) + } + + override var intrinsicContentSize: CGSize { + let size = super.intrinsicContentSize + return CGSize(width: size.width + textInsets.left + textInsets.right, + height: size.height + textInsets.top + textInsets.bottom) + } + + private func setMetric(prefix: String, + value: String?, + suffix: String, + secondaryValue: String? = nil, + secondarySuffix: String = "") { + let text = NSMutableAttributedString() + if let iconName, let image = UIImage(named: iconName) { + let attachment = NSTextAttachment() + attachment.image = image + attachment.bounds = CGRect(x: 0, y: -2, width: 14, height: 14) + text.append(NSAttributedString(attachment: attachment)) + text.append(NSAttributedString(string: " ")) + } + let normalAttributes: [NSAttributedString.Key: Any] = [ + .font: UIFont.systemFont(ofSize: 15), + .foregroundColor: UIColor(hexStr: "#293445") + ] + text.append(NSAttributedString(string: prefix, attributes: normalAttributes)) + if let value { + let highlightAttributes: [NSAttributedString.Key: Any] = [ + .font: UIFont.systemFont(ofSize: 15), + .foregroundColor: UIColor(hexStr: "#00AFFF") + ] + text.append(NSAttributedString(string: value, attributes: highlightAttributes)) + text.append(NSAttributedString(string: suffix, attributes: normalAttributes)) + if let secondaryValue { + text.append(NSAttributedString(string: secondaryValue, attributes: highlightAttributes)) + text.append(NSAttributedString(string: secondarySuffix, attributes: normalAttributes)) + } + } else { + text.append(NSAttributedString(string: "--", attributes: normalAttributes)) + } + attributedText = text + invalidateIntrinsicContentSize() } } - -private func chatDistanceText(_ distance: CLLocationDistance) -> String { - distance >= 1000 ? String(format: "%.1fkm", distance / 1000) : "\(Int(distance))m" -} - -private func chatDurationText(_ duration: TimeInterval) -> String { - let minutes = max(1, Int(ceil(duration / 60))) - return minutes >= 60 ? "\(minutes / 60)小时\(minutes % 60)分钟" : "\(minutes)分钟" -} diff --git a/QuickLocation/Section/Group/GroupChat/GroupChatView.swift b/QuickLocation/Section/Group/GroupChat/GroupChatView.swift index 7f507b81..faedf0f7 100644 --- a/QuickLocation/Section/Group/GroupChat/GroupChatView.swift +++ b/QuickLocation/Section/Group/GroupChat/GroupChatView.swift @@ -1582,7 +1582,7 @@ final class EmojiSendMsgCell: UITableViewCell { avatarView.layoutChain .topToBottomOfView(timeLabel, offset: 14) .right(12) - .width(30).height(30) + .width(38).height(38) lottieView.layoutChain .topToBottomOfView(senderNameView, offset: 5) diff --git a/QuickLocation/Section/Group/GroupChat/GroupChatViewModel.swift b/QuickLocation/Section/Group/GroupChat/GroupChatViewModel.swift index f772bd6e..bdc3a6e0 100644 --- a/QuickLocation/Section/Group/GroupChat/GroupChatViewModel.swift +++ b/QuickLocation/Section/Group/GroupChat/GroupChatViewModel.swift @@ -151,6 +151,7 @@ final class GroupChatViewModel { /// 是否还有更早历史 private(set) var hasMoreHistory = true private var isLoadingOlder = false + private var historyGeneration = 0 private let disposeBag = DisposeBag() private let emojiPattern = try? NSRegularExpression(pattern: "^js_emoji:(\\d+)$", options: []) @@ -532,8 +533,15 @@ final class GroupChatViewModel { } isLoadingOlder = true + let generation = historyGeneration fetchOlderHistory(startClientMsgID: oldest) { [weak self] list, isEnd, success in guard let self = self else { return } + guard generation == self.historyGeneration else { + DispatchQueue.main.async { + completion?(LoadOlderResult(prependedCount: 0, hasMore: self.hasMoreHistory)) + } + return + } self.isLoadingOlder = false guard success else { DispatchQueue.main.async { @@ -652,12 +660,15 @@ final class GroupChatViewModel { let param = OIMGetAdvancedHistoryMessageListParam() param.conversationID = conversationID param.count = historyPageSize + let generation = historyGeneration OIMManager.manager.getAdvancedHistoryMessageList( param, onSuccess: { [weak self] result in guard let self = self, - let list = result?.messageList else { return } + generation == self.historyGeneration else { return } + let list = result?.messageList ?? [] + self.messageCache.removeAll() var items: [ChatSectionItem] = [] for msg in list { self.cacheMessage(msg) @@ -674,11 +685,10 @@ final class GroupChatViewModel { items[i] = self.setShowTime(items[i], true) } } - if let last = items.last { - self.lastTimeGap = self.timestampFrom(item: last) - } + self.lastTimeGap = items.last.map { self.timestampFrom(item: $0) } ?? 0 let isEnd = result?.isEnd ?? (list.count < self.historyPageSize) DispatchQueue.main.async { + guard generation == self.historyGeneration else { return } self.hasMoreHistory = !isEnd && !list.isEmpty self.messagesSubject.accept(items) self.markAsRead() @@ -689,6 +699,17 @@ final class GroupChatViewModel { }) } + func clearMessages() { + historyGeneration += 1 + isLoadingOlder = false + hasMoreHistory = false + suppressAutoScroll = false + lastTimeGap = 0 + messageCache.removeAll() + clearPendingQuote() + messagesSubject.accept([]) + } + func markAsRead() { guard !conversationID.isEmpty else { return } OIMManager.manager.markConversationMessage(asRead: conversationID, diff --git a/QuickLocation/Section/Group/GroupIMService.swift b/QuickLocation/Section/Group/GroupIMService.swift index b40b57d3..6ea63630 100644 --- a/QuickLocation/Section/Group/GroupIMService.swift +++ b/QuickLocation/Section/Group/GroupIMService.swift @@ -316,19 +316,23 @@ final class GroupIMService { } // MARK: - Conversation List (for unread count & last msg time) - func getConversationList(completion: @escaping ([OIMConversationInfo]) -> Void) { + func getConversationList(completion: @escaping ([OIMConversationInfo]) -> Void, + onFailure: (() -> Void)? = nil) { OIMManager.manager.getAllConversationListWith(onSuccess: { list in completion(list ?? []) }, onFailure: { code, msg in - completion([]) + print("GroupIMService: getConversationList failed: \(code) \(msg ?? "")") + onFailure?() }) } // MARK: - Conversation Listener private var conversationListener: ConversationListenerProxy? - func setConversationListener(_ handler: @escaping ([OIMConversationInfo]) -> Void) { - conversationListener = ConversationListenerProxy(handler: handler) + func setConversationListener(_ handler: @escaping ([OIMConversationInfo]) -> Void, + onNeedsRefresh: @escaping () -> Void) { + conversationListener = ConversationListenerProxy(handler: handler, + onNeedsRefresh: onNeedsRefresh) OIMManager.callbacker.addConversationListener(listener: conversationListener!) } @@ -366,9 +370,16 @@ private class GroupListenerProxy: NSObject, OIMGroupListener { // MARK: - ConversationListenerProxy private class ConversationListenerProxy: NSObject, OIMConversationListener { private let handler: ([OIMConversationInfo]) -> Void + private let onNeedsRefresh: () -> Void - init(handler: @escaping ([OIMConversationInfo]) -> Void) { + init(handler: @escaping ([OIMConversationInfo]) -> Void, + onNeedsRefresh: @escaping () -> Void) { self.handler = handler + self.onNeedsRefresh = onNeedsRefresh + } + + func onSyncServerFinish(_ reInstall: Bool) { + onNeedsRefresh() } func onConversationChanged(_ conversations: [OIMConversationInfo]) { @@ -378,4 +389,8 @@ private class ConversationListenerProxy: NSObject, OIMConversationListener { func onNewConversation(_ conversations: [OIMConversationInfo]) { handler(conversations) } + + func onTotalUnreadMessageCountChanged(_ totalUnreadCount: Int) { + onNeedsRefresh() + } } diff --git a/QuickLocation/Section/Group/GroupSetting/GroupSettingVC.swift b/QuickLocation/Section/Group/GroupSetting/GroupSettingVC.swift index c9e20b8b..519d3abc 100644 --- a/QuickLocation/Section/Group/GroupSetting/GroupSettingVC.swift +++ b/QuickLocation/Section/Group/GroupSetting/GroupSettingVC.swift @@ -110,10 +110,6 @@ class GroupSettingVC: BaseViewController { self?.showRemoveMember() } - rootView.groupNicknameView.rx.tapGesture.subscribe(onNext: { [weak self] _ in - self?.editGroupNickname() - }).disposed(by: disposeBag) - rootView.clearHistoryView.rx.tapGesture.subscribe(onNext: { [weak self] _ in self?.confirmClearHistory() }).disposed(by: disposeBag) @@ -169,10 +165,8 @@ class GroupSettingVC: BaseViewController { self.viewModel.groupModel = model self.viewModel.members = response.list self.rootView.setupData(model, - members: response.list, - groupNickname: self.viewModel.displayGroupNickname) + members: response.list) self.rootView.setAuditBadgeVisible(model.is_owner && response.reviewCount > 0) - self.requestGroupNickname() self.requestReviewBadge() }, onError: { error in DLToast.dismiss() @@ -262,6 +256,11 @@ class GroupSettingVC: BaseViewController { let groupId = viewModel.groupModel?.group_key ?? viewModel.groupId OIMManager.manager.clearConversationAndDeleteAllMsg("sg_\(groupId)", onSuccess: { _ in DispatchQueue.main.async { + NotificationCenter.default.post( + name: .GroupChatHistoryDidClearNotification, + object: nil, + userInfo: [GroupDataChangeUserInfoKey.groupKey: groupId] + ) DLToast.show(text: "聊天记录已清空") } }, onFailure: { _, message in @@ -271,59 +270,6 @@ class GroupSettingVC: BaseViewController { }) } - private func requestGroupNickname() { - let groupId = viewModel.groupModel?.group_key ?? viewModel.groupId - let userId = AppContextManager.shared.userId - guard !groupId.isEmpty, !userId.isEmpty else { return } - - OIMManager.manager.getSpecifiedGroupMembersInfo(groupId, usersID: [userId], onSuccess: { [weak self] members in - guard let self = self else { return } - let nickname = members?.first?.nickname?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" - DispatchQueue.main.async { - self.viewModel.groupNickname = nickname - self.rootView.updateGroupNickname(self.viewModel.displayGroupNickname) - } - }, onFailure: { _, _ in - // The account nickname remains the visible fallback when OpenIM data is unavailable. - }) - } - - private func editGroupNickname() { - let vc = TextInputViewController(title: "我在本群昵称", - maxLength: 20, - initialText: viewModel.displayGroupNickname) { [weak self] nickname in - self?.updateGroupNickname(nickname) - } - present(vc, animated: true) - } - - private func updateGroupNickname(_ nickname: String) { - let trimmedNickname = nickname.trimmingCharacters(in: .whitespacesAndNewlines) - guard !trimmedNickname.isEmpty else { return } - let groupId = viewModel.groupModel?.group_key ?? viewModel.groupId - let userId = AppContextManager.shared.userId - guard !groupId.isEmpty, !userId.isEmpty else { - DLToast.showError(text: "修改群昵称失败") - return - } - - OIMManager.manager.setGroupMemberNickname(groupId, - userID: userId, - groupNickname: trimmedNickname, - onSuccess: { [weak self] _ in - DispatchQueue.main.async { - guard let self = self else { return } - self.viewModel.groupNickname = trimmedNickname - self.rootView.updateGroupNickname(trimmedNickname) - DLToast.show(text: "修改成功") - } - }, onFailure: { _, message in - DispatchQueue.main.async { - DLToast.showError(text: message ?? "修改群昵称失败") - } - }) - } - // MARK: - Init init(groupId: String) { self.viewModel = GroupSettingViewModel(groupId: groupId) diff --git a/QuickLocation/Section/Group/GroupSetting/GroupSettingView.swift b/QuickLocation/Section/Group/GroupSetting/GroupSettingView.swift index 729374cd..6f5ae469 100644 --- a/QuickLocation/Section/Group/GroupSetting/GroupSettingView.swift +++ b/QuickLocation/Section/Group/GroupSetting/GroupSettingView.swift @@ -16,12 +16,10 @@ final class GroupSettingView: UIView { var onMembersTapped: (() -> Void)? func setupData(_ model: GroupInfoModel, - members: [GroupMemberModel], - groupNickname: String) { + members: [GroupMemberModel]) { groupNameView.setValue(model.name) groupTypeView.setValue(model.groupTemplateName) groupDescView.setValue(model.description.isEmpty ? "暂无描述" : model.description) - groupNicknameView.setValue(groupNickname) tagView.configure(tags: model.labels, editable: model.is_owner) switchBtn.isOn = model.review @@ -37,7 +35,6 @@ final class GroupSettingView: UIView { groupNameView.setShowsArrow(model.is_owner) groupTypeView.setShowsArrow(false) groupDescView.setShowsArrow(model.is_owner) - groupNicknameView.setShowsArrow(true) auditMemberView.setShowsArrow(model.is_owner) let total = model.people_no > 0 ? model.people_no : members.count @@ -47,10 +44,6 @@ final class GroupSettingView: UIView { setNeedsLayout() } - func updateGroupNickname(_ nickname: String) { - groupNicknameView.setValue(nickname) - } - func setAuditBadgeVisible(_ visible: Bool) { auditMemberView.setShowsBadge(visible) } @@ -203,7 +196,6 @@ final class GroupSettingView: UIView { infoStackView.addArrangedSubview(groupNameView) infoStackView.addArrangedSubview(groupTypeView) infoStackView.addArrangedSubview(groupDescView) - infoStackView.addArrangedSubview(groupNicknameView) infoStackView.addArrangedSubview(auditSwitchView) infoStackView.addArrangedSubview(auditMemberView) infoStackView.addArrangedSubview(tagView) @@ -329,7 +321,6 @@ final class GroupSettingView: UIView { let groupNameView = GroupSettingInfoRow(title: "圈子昵称", style: .text) let groupTypeView = GroupSettingInfoRow(title: "圈子类型", style: .text) let groupDescView = GroupSettingInfoRow(title: "圈子描述", style: .multilineText) - let groupNicknameView = GroupSettingInfoRow(title: "我在本群昵称", style: .text) let auditSwitchView = GroupSettingInfoRow(title: "审核开关", style: .toggle) let auditMemberView = GroupSettingInfoRow(title: "审核成员", style: .text) let tagView = GroupSettingTagRow() diff --git a/QuickLocation/Section/Group/GroupSetting/GroupSettingViewModel.swift b/QuickLocation/Section/Group/GroupSetting/GroupSettingViewModel.swift index 2b91d416..e82d70d7 100644 --- a/QuickLocation/Section/Group/GroupSetting/GroupSettingViewModel.swift +++ b/QuickLocation/Section/Group/GroupSetting/GroupSettingViewModel.swift @@ -13,11 +13,6 @@ struct GroupSettingViewModel { var groupModel: GroupInfoModel? var members: [GroupMemberModel] = [] - var groupNickname: String = "" - - var displayGroupNickname: String { - groupNickname.isEmpty ? AppContextManager.shared.name : groupNickname - } init(groupId: String) { self.groupId = groupId diff --git a/QuickLocation/Section/Group/GroupViewController.swift b/QuickLocation/Section/Group/GroupViewController.swift index acae4557..9eaa6ec3 100644 --- a/QuickLocation/Section/Group/GroupViewController.swift +++ b/QuickLocation/Section/Group/GroupViewController.swift @@ -22,6 +22,7 @@ final class GroupViewController: BaseViewController { private var itinerarySchedules: [ScheduleModel] = [] private var itineraryGroupKey: String = "" private var groupRefreshWorkItem: DispatchWorkItem? + private var imRefreshWorkItem: DispatchWorkItem? private var groupInfoRequestID = UUID() private var hasAppeared = false private var isEnteringGroupChat = false @@ -48,6 +49,7 @@ final class GroupViewController: BaseViewController { super.viewWillAppear(animated) if hasAppeared { scheduleGroupInfoRefresh() + loadIMData() } else { hasAppeared = true } @@ -59,22 +61,26 @@ final class GroupViewController: BaseViewController { private var isRequestingIMData = false /// 进入页面加载 IM 会话:圈子集合已由业务接口给出,这里只补未读/最后一条 - private func loadIMData() { + private func loadIMData(showsLoading: Bool = false) { guard !AppContextManager.shared.isGuest, !isRequestingIMData else { return } isRequestingIMData = true - DLToast.showLoading() + if showsLoading { + DLToast.showLoading() + } GroupIMService.shared.ensureLogin { [weak self] success in DispatchQueue.main.async { guard let self else { return } self.isRequestingIMData = false guard success else { - DLToast.dismiss() - DLToast.showError(text: "IM登录失败") + if showsLoading { + DLToast.dismiss() + DLToast.showError(text: "IM登录失败") + } return } self.hasRequestedIMData = true self.setupIMListenersIfNeeded() - self.refreshIMData() + self.refreshIMData(showsLoading: showsLoading) } } } @@ -84,11 +90,15 @@ final class GroupViewController: BaseViewController { guard !hasSetupIMListeners else { return } hasSetupIMListeners = true - GroupIMService.shared.setConversationListener { [weak self] conversations in + GroupIMService.shared.setConversationListener({ [weak self] conversations in DispatchQueue.main.async { self?.viewModel.updateConversations(conversations) } - } + }, onNeedsRefresh: { [weak self] in + DispatchQueue.main.async { + self?.scheduleIMDataRefresh() + } + }) GroupIMService.shared.setGroupListener { [weak self] in GroupIMService.shared.getConversationList { conversations in @@ -99,15 +109,32 @@ final class GroupViewController: BaseViewController { } } - private func refreshIMData() { + private func refreshIMData(showsLoading: Bool = false) { GroupIMService.shared.getConversationList { [weak self] conversations in DispatchQueue.main.async { - DLToast.dismiss() + if showsLoading { + DLToast.dismiss() + } self?.viewModel.loadConversations(conversations) } + } onFailure: { + DispatchQueue.main.async { + if showsLoading { + DLToast.dismiss() + } + } } } + private func scheduleIMDataRefresh() { + imRefreshWorkItem?.cancel() + let work = DispatchWorkItem { [weak self] in + self?.refreshIMData() + } + imRefreshWorkItem = work + DispatchQueue.main.asyncAfter(deadline: .now() + 0.15, execute: work) + } + // MARK: - Bindings private func bindViewModel() { viewModel.output.hotGroups @@ -427,7 +454,7 @@ final class GroupViewController: BaseViewController { self.viewModel.applyBusinessGroups(model.groups) self.applyItineraryGroupModel(model) if refreshIM || !self.hasRequestedIMData { - self.loadIMData() + self.loadIMData(showsLoading: refreshIM) } }) .disposed(by: disposeBag) diff --git a/QuickLocation/Section/Home/Bubble/CreateBubblePopView.swift b/QuickLocation/Section/Home/Bubble/CreateBubblePopView.swift index 68c222f2..33a67aef 100644 --- a/QuickLocation/Section/Home/Bubble/CreateBubblePopView.swift +++ b/QuickLocation/Section/Home/Bubble/CreateBubblePopView.swift @@ -48,7 +48,7 @@ class CreateBubblePopView: UIView { private func setupRx() { upgradedBtn.rx.tap.subscribe(onNext: { _ in CreateBubblePopView.dismiss() - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) }).disposed(by: disposeBag) closeBtn.rx.tap.subscribe(onNext: { _ in diff --git a/QuickLocation/Section/Home/Bubble/CreateBubbleVC.swift b/QuickLocation/Section/Home/Bubble/CreateBubbleVC.swift index 438e7540..621c60ab 100644 --- a/QuickLocation/Section/Home/Bubble/CreateBubbleVC.swift +++ b/QuickLocation/Section/Home/Bubble/CreateBubbleVC.swift @@ -50,7 +50,7 @@ class CreateBubbleVC: BaseViewController { .subscribe(onNext: { [weak self] in guard let self else { return } guard self.isVipUnlocked else { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) return } let hours = self.rootView.setupView.selectedHour.value @@ -87,7 +87,7 @@ class CreateBubbleVC: BaseViewController { private func submitCreate() { guard isVipUnlocked else { rootView.setupView.dismissNotifySheet() - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) return } let hours = rootView.setupView.selectedHour.value diff --git a/QuickLocation/Section/Home/GroupMemberView.swift b/QuickLocation/Section/Home/GroupMemberView.swift index 44ea7819..bc87149e 100644 --- a/QuickLocation/Section/Home/GroupMemberView.swift +++ b/QuickLocation/Section/Home/GroupMemberView.swift @@ -157,8 +157,6 @@ class GroupMemberCell: UITableViewCell { func configure(model: GroupMemberModel, isCurrentUser: Bool, isOwn: Bool) { ownView.isHidden = !isOwn avaterImgView.setHeadPic(model.displayHeadPic) - vipIcon.image = model.vipIcon - vipIcon.isHidden = !model.shouldShowVipAvatarFrame nameLab.text = model.showName // 位置 locationLab.text = "在 " + model.lastLocation @@ -197,7 +195,6 @@ class GroupMemberCell: UITableViewCell { private func setupSubviews() { contentView.addSubview(selectedBgView) contentView.addSubview(avaterImgView) - contentView.addSubview(vipIcon) contentView.addSubview(batteryInfoView) batteryInfoView.addSubview(cornerView) cornerView.addSubview(batteryView) @@ -247,12 +244,6 @@ class GroupMemberCell: UITableViewCell { .right(5) .centerY() - vipIcon.layoutChain - .topToView(avaterImgView, offset: -8) - .leftToView(avaterImgView, offset: -6) - .width(25) - .height(21) - nameLab.layoutChain .topToView(avaterImgView, offset: 6) .leftToRightOfView(avaterImgView, offset: 8) @@ -336,10 +327,6 @@ class GroupMemberCell: UITableViewCell { return label }() - lazy var vipIcon: UIImageView = { - let view = UIImageView() - return view - }() lazy var nameLab: UILabel = { let label = UILabel() diff --git a/QuickLocation/Section/Home/GroupMemberView2.swift b/QuickLocation/Section/Home/GroupMemberView2.swift index 6fd867bb..93b8a569 100644 --- a/QuickLocation/Section/Home/GroupMemberView2.swift +++ b/QuickLocation/Section/Home/GroupMemberView2.swift @@ -305,7 +305,7 @@ class GroupMemberView2: UIView { } @objc private func handlePhoneDeviceVipTap() { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) } private static func isCurrentUser(_ userId: String?) -> Bool { @@ -444,7 +444,8 @@ class GroupMemberView2: UIView { private func updateFeatureVisibilityLayout() { let hidesPhoneReport = AppContextManager.shared.systemConfig?.isIntercept == true phoneReportView.isHidden = hidesPhoneReport - + appUsageView.isHidden = hidesPhoneReport + appUsageTopToPhoneReportConstraint?.isActive = !hidesPhoneReport appUsageTopToTodayTrackConstraint?.isActive = hidesPhoneReport phoneReportBottomConstraint?.isActive = !hidesPhoneReport && !isAppUsageVisible diff --git a/QuickLocation/Section/Home/HomeViewController.swift b/QuickLocation/Section/Home/HomeViewController.swift index 4d38ce70..4fde6ccf 100644 --- a/QuickLocation/Section/Home/HomeViewController.swift +++ b/QuickLocation/Section/Home/HomeViewController.swift @@ -332,7 +332,7 @@ class HomeViewController: BaseViewController { rootView.groupMemberView.todayTrackView.rx.tapGesture.subscribe(onNext: { [weak self] _ in guard let self else { return } if self.rootView.groupMemberView.isTodayTrackVipRequired { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) } else { self.openTodayTrackDetail() } @@ -351,7 +351,7 @@ class HomeViewController: BaseViewController { rootView.groupMemberView.phoneReportView.rx.tapGesture.subscribe(onNext: { [weak self] _ in guard let self else { return } if self.rootView.groupMemberView.isPhoneReportVipRequired { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) return } guard !self.rootView.groupMemberView.isPhoneReportDenied else { return } @@ -362,7 +362,7 @@ class HomeViewController: BaseViewController { rootView.groupMemberView.appUsageView.rx.tapGesture.subscribe(onNext: { [weak self] _ in guard let self else { return } if self.rootView.groupMemberView.isAppUsageVipRequired { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) return } guard !self.rootView.groupMemberView.isAppUsageDenied else { return } @@ -403,7 +403,7 @@ class HomeViewController: BaseViewController { self.refreshPigeonInbox() self.popupQueue = nil self.popupQueue = PopupQueueManager() - self.popupQueue?.start(from: self) +// self.popupQueue?.start(from: self) }).disposed(by: disposeBag) // 圈子刷新 @@ -1578,6 +1578,7 @@ extension HomeViewController { guard let self = self else { return } self.viewModel.updateMemberStatus(userId: userId, status: 1) guard let member = self.viewModel.memberList.first(where: { $0.user_id == userId }) else { return } + self.restoreAnnotationForSOS(member: member) self.showSOSReceiveAlert(for: member) } @@ -1629,6 +1630,23 @@ extension HomeViewController { } } + private func restoreAnnotationForSOS(member: GroupMemberModel) { + let mapMember = members.first(where: { $0.id == member.user_id }) + let (lastCoordinate, lastAddress) = CircleMember.parsePosition(member.last_position) + let coordinate = [ + trueCoordinateByUserId[member.user_id], + mapMember?.coordinate, + lastCoordinate + ] + .compactMap { $0 } + .first(where: CLLocationCoordinate2DIsValid) + + guard let coordinate else { return } + let mapAddress = mapMember?.address ?? "" + let address = mapAddress.isEmpty ? lastAddress : mapAddress + updateAnnotation(userId: member.user_id, coordinate: coordinate, address: address) + } + /// 更新成员在线计数显示 private func updateOnlineCount() { let total = viewModel.memberCount diff --git a/QuickLocation/Section/Home/SOS/SOSView.swift b/QuickLocation/Section/Home/SOS/SOSView.swift index a837ee0f..9938efec 100644 --- a/QuickLocation/Section/Home/SOS/SOSView.swift +++ b/QuickLocation/Section/Home/SOS/SOSView.swift @@ -396,6 +396,7 @@ final class SOSView: UIView { contentStack.axis = .horizontal contentStack.alignment = .center contentStack.spacing = 8 + contentStack.isUserInteractionEnabled = false control.addSubview(contentStack) contentStack.translatesAutoresizingMaskIntoConstraints = false diff --git a/QuickLocation/Section/Home/SearchLocation/SearchLocationResultVC.swift b/QuickLocation/Section/Home/SearchLocation/SearchLocationResultVC.swift index d3ec9131..47534589 100644 --- a/QuickLocation/Section/Home/SearchLocation/SearchLocationResultVC.swift +++ b/QuickLocation/Section/Home/SearchLocation/SearchLocationResultVC.swift @@ -53,13 +53,13 @@ class SearchLocationResultVC: BaseViewController { private func reactiveAction() { rootView.vipMaskView.rx.tap .subscribe(onNext: { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) }) .disposed(by: disposeBag) rootView.actionBtn.rx.tap.subscribe(onNext: { _ in guard self.isVipUnlocked() else { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) return } switch self.code { diff --git a/QuickLocation/Section/Home/SignIn/SignInVC.swift b/QuickLocation/Section/Home/SignIn/SignInVC.swift index 86809744..68c8ab7c 100644 --- a/QuickLocation/Section/Home/SignIn/SignInVC.swift +++ b/QuickLocation/Section/Home/SignIn/SignInVC.swift @@ -63,20 +63,11 @@ class SignInVC: BaseViewController { geocoder.reverseGeocodeLocation(loc) { [weak self] placemarks, _ in DispatchQueue.main.async { guard let self else { return } - DLToast.dismiss() let address = placemarks?.first?.name ?? placemarks?.first?.thoroughfare ?? placemarks?.first?.locality ?? "" - MQTTService.shared.reportSignIn( - lat: loc.coordinate.latitude, - lon: loc.coordinate.longitude, - addr: address - ) - DLToast.show(text: "签到成功") { - self.isSigning = false - self.requestSignInInfo() - } + self.requestSignIn(location: loc, address: address) } } } @@ -93,6 +84,25 @@ class SignInVC: BaseViewController { } // MARK: - API + private func requestSignIn(location: CLLocation, address: String) { + UserService.signIn( + latitude: location.coordinate.latitude, + longitude: location.coordinate.longitude, + address: address + ).subscribe(onNext: { [weak self] _ in + guard let self else { return } + self.isSignIn = true + self.isSigning = false + DLToast.show(text: "签到成功") { + self.requestSignInInfo() + } + }, onError: { [weak self] _ in + guard let self else { return } + self.isSigning = false + self.rootView.signInBtn.isEnabled = true + }).disposed(by: disposeBag) + } + private func requestSignInInfo() { DLToast.showLoading() UserService.signInInfo().subscribe(onNext: { [weak self] response in diff --git a/QuickLocation/Section/Home/TodayTrackDetail/TodayTrackDetailVC.swift b/QuickLocation/Section/Home/TodayTrackDetail/TodayTrackDetailVC.swift index 73191533..4cc642c2 100644 --- a/QuickLocation/Section/Home/TodayTrackDetail/TodayTrackDetailVC.swift +++ b/QuickLocation/Section/Home/TodayTrackDetail/TodayTrackDetailVC.swift @@ -132,7 +132,7 @@ final class TodayTrackDetailVC: BaseViewController { rootView.vipRequiredBtn.rx.tap .subscribe(onNext: { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) }) .disposed(by: disposeBag) diff --git a/QuickLocation/Section/Launch/LaunchViewController.swift b/QuickLocation/Section/Launch/LaunchViewController.swift index 97bc0465..75121958 100644 --- a/QuickLocation/Section/Launch/LaunchViewController.swift +++ b/QuickLocation/Section/Launch/LaunchViewController.swift @@ -66,7 +66,7 @@ class LaunchViewController: BaseViewController { AppContextManager.shared.systemConfig = model.config - if let upgrade = model.config?.versionUpgradeModel { + if let upgrade = AppContextManager.shared.systemConfig?.versionUpgradeModel { self.showVersionUpgrade(upgrade, model: model) return } @@ -75,11 +75,11 @@ class LaunchViewController: BaseViewController { DLAlert.show(title: error.localizedDescription, defaultTitle: "重试") { [weak self] in guard let this = self else { return } - #if DEBUG || AdHoc - this.showServerSwitchAlert() - #else +// #if DEBUG || AdHoc +// this.showServerSwitchAlert() +// #else this.getUserConfig() - #endif +// #endif } }).disposed(by: disposeBag) } @@ -126,24 +126,9 @@ class LaunchViewController: BaseViewController { } private func showVersionUpgrade(_ upgrade: VersionUpgradeModel, model: UserConfigModel) { - self.showConfirmPop( - showCloseBtn: !upgrade.force, - title: upgrade.title + upgrade.version, - message: upgrade.description, - confirmText: "立即更新", - confirmBlock: { - if let url = URL(string: upgrade.url) { - UIApplication.shared.open(url) - } - if !upgrade.force { - self.continueAfterConfig(model: model) - } - }, - cancelText: upgrade.force ? nil : "稍后再说", - cancelBlock: upgrade.force ? nil : { [weak self] in - self?.continueAfterConfig(model: model) - } - ) + showVersionUpgradePop(upgrade: upgrade) { [weak self] in + self?.continueAfterConfig(model: model) + } } // MARK: - Init diff --git a/QuickLocation/Section/LockDistract/LockDistractVC.swift b/QuickLocation/Section/LockDistract/LockDistractVC.swift index ee78245e..408359e6 100644 --- a/QuickLocation/Section/LockDistract/LockDistractVC.swift +++ b/QuickLocation/Section/LockDistract/LockDistractVC.swift @@ -369,7 +369,7 @@ final class LockDistractVC: BaseViewController { private func performPrimaryAction() { if rootView.primaryAction == .lock, !isAppLockVipUnlocked { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) return } switch rootView.primaryAction { @@ -386,7 +386,7 @@ final class LockDistractVC: BaseViewController { private func lockSelectedApps() { guard isAppLockVipUnlocked else { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) return } guard let member = selectedMember, !activeGroupKey.isEmpty else { diff --git a/QuickLocation/Section/Map/MemberAnnotationView.swift b/QuickLocation/Section/Map/MemberAnnotationView.swift index b70a66ec..7491000e 100644 --- a/QuickLocation/Section/Map/MemberAnnotationView.swift +++ b/QuickLocation/Section/Map/MemberAnnotationView.swift @@ -87,10 +87,10 @@ final class MemberAnnotationView: MAAnnotationView { let v = UIView() v.backgroundColor = .white v.layer.cornerRadius = bubbleCorner - v.layer.shadowColor = UIColor.black.cgColor + v.layer.shadowColor = UIColor.black.withAlphaComponent(0.3).cgColor v.layer.shadowOffset = CGSize(width: 0, height: 2) - v.layer.shadowRadius = 4 - v.layer.shadowOpacity = 0.18 + v.layer.shadowRadius = 3 + v.layer.shadowOpacity = 0.1 return v }() @@ -113,7 +113,7 @@ final class MemberAnnotationView: MAAnnotationView { let v = UIView() v.backgroundColor = .white v.layer.cornerRadius = dotOuterSize / 2 - v.layer.shadowColor = UIColor.black.cgColor + v.layer.shadowColor = UIColor.black.withAlphaComponent(0.3).cgColor v.layer.shadowOffset = CGSize(width: 0, height: 1) v.layer.shadowRadius = 2 v.layer.shadowOpacity = 0.2 diff --git a/QuickLocation/Section/Mine/About/AboutView.swift b/QuickLocation/Section/Mine/About/AboutView.swift index 528e1b26..17d1eb1b 100644 --- a/QuickLocation/Section/Mine/About/AboutView.swift +++ b/QuickLocation/Section/Mine/About/AboutView.swift @@ -17,7 +17,7 @@ final class AboutView: UIView { return iv }() - let logoImage = UIImageView(image: UIImage(named: "Mine/")) + let logoImage = UIImageView(image: UIImage(named: "Common/logo108")) let nameImage = UIImageView(image: UIImage(named: "Mine/about_logo")) let versionLab = UILabel() diff --git a/QuickLocation/Section/Mine/Account/AccountVC.swift b/QuickLocation/Section/Mine/Account/AccountVC.swift index 18bf5b16..0155464c 100644 --- a/QuickLocation/Section/Mine/Account/AccountVC.swift +++ b/QuickLocation/Section/Mine/Account/AccountVC.swift @@ -195,19 +195,7 @@ class AccountVC: BaseViewController { DLToast.show(text: "已是最新版本") return } - self.showConfirmPop( - showCloseBtn: !upgrade.force, - title: upgrade.title, - message: upgrade.description, - confirmText: "立即更新", - confirmBlock: { - if let url = URL(string: upgrade.url) { - UIApplication.shared.open(url) - } - }, - cancelText: upgrade.force ? nil : "稍后再说", - cancelBlock: nil - ) + showVersionUpgradePop(upgrade: upgrade) } private func clearCache() { diff --git a/QuickLocation/Section/Mine/Account/CancellationPopView.swift b/QuickLocation/Section/Mine/Account/CancellationPopView.swift deleted file mode 100644 index bf446e33..00000000 --- a/QuickLocation/Section/Mine/Account/CancellationPopView.swift +++ /dev/null @@ -1,261 +0,0 @@ -// -// CancellationPopView.swift -// QuickLocation -// -// Created by 八条 on 2026/6/11. -// - -import UIKit -import RxSwift -import RxCocoa - -class CancellationPopView: UIView { - - private static let shared = CancellationPopView(frame: CGRect(origin: .zero, size: kScreenSize)) - - var disposeBag = DisposeBag() - - private var completion: (() -> Void)? - - static func show(completion: @escaping (() -> Void)) { - guard let superView = kKeyWindow else { - return - } - - if CancellationPopView.shared.superview != nil { - CancellationPopView.shared.removeFromSuperview() - CancellationPopView.shared.bgView.frame = .zero - } - - CancellationPopView.shared.bgView.alpha = 1 - CancellationPopView.shared.bgView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight) - superView.addSubview(CancellationPopView.shared) - superView.bringSubviewToFront(CancellationPopView.shared) - - UIView.animate(withDuration: 0.25) { - CancellationPopView.shared.bgView.alpha = 1 - } - - CancellationPopView.shared.completion = { - completion() - CancellationPopView.dismiss() - } - } - - /// 关闭 - static func dismiss() { - guard CancellationPopView.shared.superview != nil else { return } - - UIView.animate(withDuration: 0.25, delay: 0, options: [.curveEaseIn]) { - CancellationPopView.shared.bgView.alpha = 0 - } completion: { _ in - CancellationPopView.shared.removeFromSuperview() - } - } - - private func setupRx() { - - checkBox.rx.tap - .subscribe(onNext: { [weak self] in - guard let self = self else { return } - self.checkBox.isSelected = !self.checkBox.isSelected - self.confirmBtn.isEnabled = self.checkBox.isSelected - }) - .disposed(by: disposeBag) - - agreementLab.rx.tapGesture.subscribe { _ in - CancellationPopView.dismiss() - AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.cancellationNoticeUrl]) - }.disposed(by: disposeBag) - - confirmBtn.rx.tap.subscribe(onNext: { _ in - self.completion?() - }).disposed(by: disposeBag) - - closeBtn.rx.tap.subscribe(onNext: { _ in - CancellationPopView.dismiss() - - }).disposed(by: disposeBag) - } - - private lazy var bgView: UIView = { - let view = UIView() - view.backgroundColor = .black.withAlphaComponent(0.5) - return view - }() - - lazy var popView: UIView = { - let view = UIView() - view.backgroundColor = .clear - return view - }() - - lazy var popBgView: UIView = { - let view = UIView() - view.backgroundColor = .white - view.cornerRadius = 30 - return view - }() - - lazy var logoImgView: UIImageView = { - let view = UIImageView(image: UIImage(named: "Popup/bell")) - return view - }() - - lazy var headerBgImg: UIImageView = { - let view = UIImageView(image: UIImage(named: "Popup/header_bg")) - view.contentMode = .scaleAspectFill - return view - }() - - lazy var titleLab: UILabel = { - let label = UILabel() - label.text = "删除账户" - label.font = .systemFont(ofSize: 20, weight: .semibold) - label.textColor = UIColor(hexStr: "#0F2846") - label.textAlignment = .center - label.numberOfLines = 0 - return label - }() - - lazy var contentLab: UILabel = { - let label = UILabel() - label.text = "申请删除账号后,账号将在15日后自动删除,若在15日内登录账号,删除账号申请将被取消!您确定要删除吗?" - label.font = .systemFont(ofSize: 14, weight: .medium) - label.textColor = UIColor(hexStr: "#333333") - label.textAlignment = .center - label.numberOfLines = 0 - return label - }() - - lazy var agreementView: UIView = { - let view = UIView() - view.backgroundColor = .clear - - view.addSubview(checkBox) - checkBox.layoutChain - .left() - .width(12) - .height(12) - .centerY() - - view.addSubview(agreementLab) - agreementLab.layoutChain - .leftToRightOfView(checkBox, offset: 5) - .edgesVertical() - .right() - - return view - }() - - lazy var checkBox: UIButton = { - let btn = UIButton(type: .custom) - btn.setImage(UIImage(named: "Login/checkbox"), for: .normal) - btn.setImage(UIImage(named: "Login/selected"), for: .selected) - btn.extendEdgeInsets = UIEdgeInsets(top: 100, left: 100, bottom: 100, right: 0) - return btn - }() - - lazy var agreementLab: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 10, weight: .medium) - label.textColor = UIColor(hexStr: "#333333") - label.isUserInteractionEnabled = true - - let text = "阅读并同意《账号注销协议》" - let attr = NSMutableAttributedString(string: text) - let range = (text as NSString).range(of: "《账号注销协议》") - attr.addAttribute(.foregroundColor, value: UIColor(hexStr: "#FFC006"), range: range) - label.attributedText = attr - return label - }() - - lazy var confirmBtn: UIButton = { - let btn = UIButton(type: .custom) - btn.setTitle("确认", for: .normal) - btn.setTitleColor(UIColor(hexStr: "#16B3FF"), for: .normal) - btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) - btn.backgroundColor = .clear - btn.isEnabled = false - return btn - }() - - lazy var closeBtn: UIButton = { - let btn = UIButton(type: .custom) - btn.setTitle("取消", for: .normal) - btn.setTitleColor(.white, for: .normal) - btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) - btn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal) - btn.cornerRadius = 25 - return btn - }() - - // MARK: - Init - override init(frame: CGRect) { - super.init(frame: frame) - backgroundColor = .clear - addSubview(bgView) - bgView.addSubview(popView) - popView.addSubview(popBgView) - popView.addSubview(logoImgView) - popBgView.addSubview(headerBgImg) - popBgView.addSubview(titleLab) - popBgView.addSubview(contentLab) - popBgView.addSubview(agreementView) - popBgView.addSubview(closeBtn) - popBgView.addSubview(confirmBtn) - - popView.layoutChain - .centerY() - .centerX() - .width(315) - - popBgView.layoutChain.edges() - - logoImgView.layoutChain - .left(16) - .top(-45) - .width(109) - .height(109) - - headerBgImg.layoutChain - .edges(excludingEdge: .bottom) - .heightToWidth(100/315) - - titleLab.layoutChain - .top(53) - .centerX() - - contentLab.layoutChain - .topToBottomOfView(titleLab, offset: 10) - .edgesHorzontal(20) - - agreementView.layoutChain - .topToBottomOfView(contentLab, offset: 24) - .centerX() - .height(14) - - closeBtn.layoutChain - .topToBottomOfView(agreementView, offset: 20) - .edgesHorzontal(20) - .height(50) - - confirmBtn.layoutChain - .topToBottomOfView(closeBtn, offset: 10) - .edgesHorzontal(20) - .height(50) - .bottom(10) - - setupRx() - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func layoutSubviews() { - super.layoutSubviews() - - } - -} diff --git a/QuickLocation/Section/Mine/CancelAccount/CancelAccountVC.swift b/QuickLocation/Section/Mine/CancelAccount/CancelAccountVC.swift index ac47ad3f..3991b68c 100644 --- a/QuickLocation/Section/Mine/CancelAccount/CancelAccountVC.swift +++ b/QuickLocation/Section/Mine/CancelAccount/CancelAccountVC.swift @@ -45,6 +45,15 @@ final class CancelAccountVC: BaseViewController { }) .disposed(by: disposeBag) + rootView.agreementBtn.rx.tap + .subscribe(onNext: { + AppRouter.push( + Route.web, + userInfo: ["url": URLManager.shared.cancellationNoticeUrl] + ) + }) + .disposed(by: disposeBag) + rootView.saveBtn.rx.tap .subscribe(onNext: { [weak self] in self?.submit() diff --git a/QuickLocation/Section/Mine/CancelAccount/CancelAccountView.swift b/QuickLocation/Section/Mine/CancelAccount/CancelAccountView.swift index 27c8c305..1db67d23 100644 --- a/QuickLocation/Section/Mine/CancelAccount/CancelAccountView.swift +++ b/QuickLocation/Section/Mine/CancelAccount/CancelAccountView.swift @@ -16,6 +16,7 @@ final class CancelAccountView: UIView { let card = UIView() let confirmInput = UITextField() let saveBtn = UIButton(type: .custom) + let agreementBtn = UIButton(type: .custom) private(set) var checkItems: [CancelCheckItemView] = [] @@ -90,19 +91,31 @@ final class CancelAccountView: UIView { previous = item } - let tip5 = UILabel() - tip5.text = "5. 请在输入框中输入以下文字" - tip5.font = .systemFont(ofSize: 16, weight: .medium) - tip5.textColor = UIColor(hexStr: "#293445") - card.addSubview(tip5) - tip5.layoutChain.topToBottomOfView(previous!, offset: 12).left(14).right(14) + agreementBtn.setTitle("查看协议", for: .normal) + agreementBtn.setTitleColor(UIColor(hexStr: "#08B5FF"), for: .normal) + agreementBtn.titleLabel?.font = .systemFont(ofSize: 13, weight: .medium) + agreementBtn.contentHorizontalAlignment = .left + let agreementItem = CancelCheckItemView( + title: "5. 账号注销协议", + actionButton: agreementBtn + ) + checkItems.append(agreementItem) + card.addSubview(agreementItem) + agreementItem.layoutChain.topToBottomOfView(previous!).edgesHorzontal(14) + + let tip6 = UILabel() + tip6.text = "6. 请在输入框中输入以下文字" + tip6.font = .systemFont(ofSize: 16, weight: .medium) + tip6.textColor = UIColor(hexStr: "#293445") + card.addSubview(tip6) + tip6.layoutChain.topToBottomOfView(agreementItem, offset: 12).left(14).right(14) let phrase = UILabel() phrase.text = "我自愿注销本账号" phrase.font = .systemFont(ofSize: 16, weight: .medium) phrase.textColor = UIColor(hexStr: "#F64545") card.addSubview(phrase) - phrase.layoutChain.topToBottomOfView(tip5, offset: 8).leftToView(tip5, offset: 16) + phrase.layoutChain.topToBottomOfView(tip6, offset: 8).leftToView(tip6, offset: 16) confirmInput.backgroundColor = UIColor(hexStr: "#F5F5F5") confirmInput.layer.cornerRadius = 8 @@ -134,10 +147,12 @@ final class CancelCheckItemView: UIView { let checkBtn = UIButton(type: .custom) private let titleLab = UILabel() private let subLab = UILabel() + private let actionButton: UIButton? var isChecked: Bool { checkBtn.isSelected } - init(title: String, subtitle: String) { + init(title: String, subtitle: String? = nil, actionButton: UIButton? = nil) { + self.actionButton = actionButton super.init(frame: .zero) titleLab.text = title titleLab.font = .systemFont(ofSize: 15, weight: .medium) @@ -145,20 +160,34 @@ final class CancelCheckItemView: UIView { titleLab.numberOfLines = 0 addSubview(titleLab) - subLab.text = subtitle - subLab.font = .systemFont(ofSize: 13, weight: .medium) - subLab.textColor = UIColor(hexStr: "#767676") - subLab.numberOfLines = 0 - addSubview(subLab) - checkBtn.setBackgroundImage(UIImage(named: "Common/checkbox"), for: .normal) checkBtn.setBackgroundImage(UIImage(named: "Common/checkbox_on"), for: .selected) checkBtn.extendEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 20, right: 20) addSubview(checkBtn) titleLab.layoutChain.top(10).left(0).rightToLeftOfView(checkBtn, offset: 8) - subLab.layoutChain.topToBottomOfView(titleLab, offset: 4).left(0).rightToLeftOfView(checkBtn, offset: 12).bottom(10) checkBtn.layoutChain.right(0).centerY(titleLab).width(24).height(24) + + if let actionButton { + addSubview(actionButton) + actionButton.layoutChain + .topToBottomOfView(titleLab) + .left(0) + .width(100) + .height(44) + .bottom(4) + } else { + subLab.text = subtitle + subLab.font = .systemFont(ofSize: 13, weight: .medium) + subLab.textColor = UIColor(hexStr: "#767676") + subLab.numberOfLines = 0 + addSubview(subLab) + subLab.layoutChain + .topToBottomOfView(titleLab, offset: 4) + .left(0) + .rightToLeftOfView(checkBtn, offset: 12) + .bottom(10) + } } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } diff --git a/QuickLocation/Section/Mine/MineViewController.swift b/QuickLocation/Section/Mine/MineViewController.swift index 732af8c6..69004a26 100644 --- a/QuickLocation/Section/Mine/MineViewController.swift +++ b/QuickLocation/Section/Mine/MineViewController.swift @@ -58,7 +58,7 @@ final class MineViewController: BaseViewController { private func reactiveAction() { rootView.vipActivateButton.rx.tap .subscribe(onNext: { _ in - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) }) .disposed(by: disposeBag) diff --git a/QuickLocation/Section/PigeonMessage/PigeonMessageVC.swift b/QuickLocation/Section/PigeonMessage/PigeonMessageVC.swift index 7d7f4600..43cdceba 100644 --- a/QuickLocation/Section/PigeonMessage/PigeonMessageVC.swift +++ b/QuickLocation/Section/PigeonMessage/PigeonMessageVC.swift @@ -517,7 +517,7 @@ final class PigeonMessageVC: BaseViewController { @objc private func sendMessage() { guard isPigeonVipUnlocked else { - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) return } if let wait = pigeonSendWaitSeconds() { diff --git a/QuickLocation/Section/PopupWindow/PopupQueueManager.swift b/QuickLocation/Section/PopupWindow/PopupQueueManager.swift index 60eb3390..33f83ac5 100644 --- a/QuickLocation/Section/PopupWindow/PopupQueueManager.swift +++ b/QuickLocation/Section/PopupWindow/PopupQueueManager.swift @@ -89,11 +89,7 @@ class PopupQueueManager { let gen = stepGeneration startCountdown(seconds: timeConfig.pay_pop_time) { [weak self] in guard let self = self, self.currentStep == 0, self.stepGeneration == gen else { return } - let vc = PromotionalActivitiesVC() - vc.onDismiss = { [weak self] in - self?.skipToNext() - } - self.push(vc) + /// TODO } } diff --git a/QuickLocation/Section/PopupWindow/PopupWindow.swift b/QuickLocation/Section/PopupWindow/PopupWindow.swift index 09aad3e0..2b3d65e0 100644 --- a/QuickLocation/Section/PopupWindow/PopupWindow.swift +++ b/QuickLocation/Section/PopupWindow/PopupWindow.swift @@ -186,10 +186,7 @@ class PopupWindow: UIView { vip1UnlockBtn.rx.tap .subscribe(onNext: { [weak self] _ in self?.slideOutUnlockVip1Popup() - let topVC = UIViewController.currentViewController() - if !(topVC is VipRechargeVC) { - AppRouter.push(Route.vipRecharge) - } + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) }) .disposed(by: disposeBag) @@ -202,10 +199,7 @@ class PopupWindow: UIView { unlockVip2Btn.rx.tap .subscribe(onNext: { [weak self] _ in self?.slideOutUnlockVip2Popup() - let topVC = UIViewController.currentViewController() - if !(topVC is VipRechargeVC) { - AppRouter.push(Route.vipRecharge) - } + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) }) .disposed(by: disposeBag) @@ -218,10 +212,7 @@ class PopupWindow: UIView { unlockVip3Btn.rx.tap .subscribe(onNext: { [weak self] _ in self?.slideOutUnlockVip3Popup() - let topVC = UIViewController.currentViewController() - if !(topVC is VipRechargeVC) { - AppRouter.push(Route.vipRecharge) - } + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) }) .disposed(by: disposeBag) @@ -234,10 +225,7 @@ class PopupWindow: UIView { unlockVip4Btn.rx.tap .subscribe(onNext: { [weak self] _ in self?.slideOutUnlockVip4Popup() - let topVC = UIViewController.currentViewController() - if !(topVC is VipRechargeVC) { - AppRouter.push(Route.vipRecharge) - } + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) }) .disposed(by: disposeBag) } diff --git a/QuickLocation/Section/PopupWindow/PromotionalActivitiesVC.swift b/QuickLocation/Section/PopupWindow/PromotionalActivitiesVC.swift deleted file mode 100644 index ab386547..00000000 --- a/QuickLocation/Section/PopupWindow/PromotionalActivitiesVC.swift +++ /dev/null @@ -1,243 +0,0 @@ -// -// PromotionalActivitiesVC.swift -// QuickLocation -// -// Created by 八条 on 2026/7/3. -// - -import UIKit -import RxSwift -import RxCocoa -import RxDataSources - -extension PromotionalActivitiesItem: Equatable { - static func == (lhs: Self, rhs: Self) -> Bool { - switch (lhs, rhs) { - case (.recommend(let a), .recommend(let b)): return a == b - case (.normal(let a), .normal(let b)): return a == b - default: return false - } - } -} - -extension PromotionalActivitiesItem: IdentifiableType { - typealias Identity = String - var identity: String { - switch self { - case .recommend(let model): return model.goods_id - case .normal(let model): return model.goods_id - } - } -} - -class PromotionalActivitiesVC: BaseViewController { - - fileprivate var rootView: PromotionalActivitiesView! - var onDismiss: (() -> Void)? - private var selectedGoodsId: String = "" - private let itemsRelay = BehaviorRelay<[PromotionalActivitiesItem]>(value: []) - - var items: [PromotionalActivitiesItem] { - get { itemsRelay.value } - set { itemsRelay.accept(newValue) } - } - - override func loadView() { - rootView = PromotionalActivitiesView(frame: UIScreen.main.bounds) - view = rootView - } - - override func viewDidLoad() { - super.viewDidLoad() - fd_interactivePopDisabled = true - setupTableView() - requestRechargeInfo() - - rootView.confirmBtn.rx.tap.subscribe(onNext: { _ in - self.requestOrderPayParams() - }).disposed(by: disposeBag) - - NotificationCenter.default.rx.notification(.RequestOrderPayStatusNotification) - .subscribe(onNext: { [weak self] _ in - self?.handlePaymentSuccess() - }).disposed(by: disposeBag) - } - - private func selectedGoodsName() -> String { - for item in itemsRelay.value { - switch item { - case .recommend(let m): if m.goods_id == selectedGoodsId { return m.goods_name } - case .normal(let m): if m.goods_id == selectedGoodsId { return m.goods_name } - } - } - return "" - } - - private func handlePaymentSuccess() { - UserService.userInfo().subscribe { [weak self] response in - if let model = response.model { - AppContextManager.shared.saveAccount(model) - } - self?.showPayResultPop(showCloseBtn: false, - status: true, - title: "支付成功", - message: "恭喜您!成功开通\(self?.selectedGoodsName() ?? "")", - confirmText: "确定", confirmBlock: { - AppRouter.shared.popOrDismiss() - }, cancelBlock: { }) - }.disposed(by: disposeBag) - } - - private func setupTableView() { - typealias Section = SectionModel - let dataSource = RxTableViewSectionedReloadDataSource
{ _, tableView, indexPath, item in - let isSelected = item.identity == self.selectedGoodsId - switch item { - case .recommend(let model): - let cell: PromotionalRecommendCell = tableView.dequeueReusableCell(for: indexPath) - cell.configure(model: model, isSelected: isSelected) - return cell - case .normal(let model): - let cell: PromotionalNormalCell = tableView.dequeueReusableCell(for: indexPath) - cell.configure(model: model, isSelected: isSelected) - return cell - } - } - - itemsRelay - .map { [SectionModel(model: "", items: $0)] } - .bind(to: rootView.tableView.rx.items(dataSource: dataSource)) - .disposed(by: disposeBag) - - itemsRelay - .subscribe(onNext: { [weak self] items in - self?.rootView.tableView.layoutChain.height(CGFloat(items.count) * 106 + 5) - self?.rootView.scrollContentView.layoutIfNeeded() - }) - .disposed(by: disposeBag) - - rootView.tableView.rx.itemSelected - .subscribe(onNext: { [weak self] indexPath in - guard let self = self else { return } - let item = self.itemsRelay.value[indexPath.row] - self.selectedGoodsId = item.identity - self.rootView.tableView.reloadData() - }) - .disposed(by: disposeBag) - } - - override func viewDidDisappear(_ animated: Bool) { - super.viewDidDisappear(animated) - if isMovingFromParent { - onDismiss?() - } - } - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - navigationController?.setNavigationBarHidden(true, animated: false) - } - - // MARK: - API - private func requestRechargeInfo() { - DLToast.showLoading() - OrderService.rechargeInfo(type: "member").subscribe(onNext: { [weak self] response in - guard let self = self else { return } - if let checkedId = response.list.first(where: { $0.checked })?.goods_id { - self.selectedGoodsId = checkedId - } - let items = response.list.map { model in - model.goods_id == "20042" - ? PromotionalActivitiesItem.recommend(model: model) - : PromotionalActivitiesItem.normal(model: model) - } - self.items = items - self.rootView.startCountdown() - }).disposed(by: disposeBag) - } - - private func requestOrderPayParams() { - guard let systemConfig = AppContextManager.shared.systemConfig, let timeConfig = systemConfig.timeConfig else { - return - } - -// if timeConfig.pay_pop_type == 3 { -// IAPManager.shared.purchase(goodsId: selectedGoodsId) { [weak self] success, msg in -// guard let self = self else { return } -// if success { -// self.showPayResultPop(showCloseBtn: false, -// status: true, -// title: "支付成功", -// message: "恭喜您!成功开通!", -// confirmText: "确定", confirmBlock: { -// AppRouter.shared.popOrDismiss() -// }, cancelBlock: { }) -// } else { -// self.showPayResultPop(status: false, -// title: "支付失败", -// message: msg ?? "很抱歉,请您重新支付!", -// confirmText: "重新支付", confirmBlock: { }, -// cancelText: "取消", cancelBlock: { -// AppRouter.shared.popOrDismiss() -// }) -// } -// } -// return -// } - - let payType = timeConfig.pay_pop_type == 1 ? "alipay" : "weixin" - dl.showLoading() - OrderService.orderPayParams(goodsId: selectedGoodsId, - payType: payType).subscribe(onNext: { response in - self.dl.dismiss() - guard let data = response.data else { return } - - if payType == "weixin" { // 微信 - guard let partnerId = data["partnerId"] as? String, - let prepayId = data["prepayId"] as? String, - let package = data["package"] as? String, - let nonceStr = data["nonceStr"] as? String, - let timeStamp = data["timeStamp"] as? String, - let sign = data["sign"] as? String else { return } - let request: PayReq = PayReq() - request.partnerId = partnerId - request.prepayId = prepayId - request.package = package - request.nonceStr = nonceStr - request.timeStamp = UInt32(timeStamp) ?? 0 - request.sign = sign - WXApi.send(request) - } - else if payType == "alipay" { // 支付宝 - if let payParam = data["payParam"] as? String, let appId = data["appId"] as? String { - AlipaySDK.defaultService().payOrder(payParam, fromScheme: "Alipay\(appId)") { resultDic in -// print("支付宝callback -> \(resultDic)") - guard let result = resultDic, - let resultStatus = result["resultStatus"] as? String else { return } - /** - 9000 订单支付成功。 - 8000 正在处理中,支付结果未知(有可能已经支付成功),请查询商家订单列表中订单的支付状态。 - 4000 订单支付失败。 - 5000 重复请求。 - 6001 用户中途取消。 - 6002 网络连接出错。 - 6004 支付结果未知(有可能已经支付成功),请查询商家订单列表中订单的支付状态。 - 其它 其它支付错误。 - */ - if resultStatus == "9000" { - self.handlePaymentSuccess() - } - else { - self.showPayResultPop(status: false, - title: "支付失败", - message: "很抱歉,请您重新支付!", - confirmText: "重新支付", confirmBlock: { }, cancelText: "取消", cancelBlock: { - AppRouter.shared.popOrDismiss() - }) - } - } - } - } - }, onError: { _ in }).disposed(by: disposeBag) - } -} diff --git a/QuickLocation/Section/PopupWindow/PromotionalActivitiesView.swift b/QuickLocation/Section/PopupWindow/PromotionalActivitiesView.swift deleted file mode 100644 index 0e6e86f2..00000000 --- a/QuickLocation/Section/PopupWindow/PromotionalActivitiesView.swift +++ /dev/null @@ -1,639 +0,0 @@ -// -// PromotionalActivitiesView.swift -// QuickLocation -// -// Created by 八条 on 2026/7/3. -// - -import UIKit -import RxSwift -import RxCocoa - -enum PromotionalActivitiesItem { - case recommend(model: VipExpenseModel) - case normal(model: VipExpenseModel) -} - -class PromotionalActivitiesView: UIView { - - var disposeBag = DisposeBag() - - private func setupRx() { - navView.onBackTapped = { VipWaivePopView.show() } - - backBtn.rx.tap.subscribe(onNext: { _ in - AppRouter.shared.popOrDismiss() - }) - .disposed(by: disposeBag) - } - - private func setupUI() { - addSubview(scrollView) - addSubview(backBtn) - addSubview(navView) - - backBtn.layoutChain - .top(kStatusBarHeight + 5) - .left(15) - .width(36) - .height(36) - - navView.layoutChain - .edges(excludingEdge: .bottom) - .height(kNaviHeight) - navView.alpha = 0 - - addSubview(bottomView) - bottomView.layoutChain - .edges(excludingEdge: .top) - .height(120) - - scrollView.layoutChain - .edges(excludingEdge: .bottom) - .bottomToTopOfView(bottomView) - } - - lazy var navView = BaseNavigationView(title: "超值优惠") - - lazy var backBtn: UIButton = { - let btn = UIButton(type: .custom) - btn.setImage(UIImage(named: "Common/back"), for: .normal) - btn.extendEdgeInsets = UIEdgeInsets(top: 54, left: 15, bottom: 100, right: 100) - return btn - }() - - lazy var scrollView: UIScrollView = { - let view = UIScrollView() - view.backgroundColor = UIColor(hexStr: "#F6F9FB") - view.showsVerticalScrollIndicator = false - view.delegate = self - view.bounces = false - view.contentInsetAdjustmentBehavior = .never - - view.addSubview(scrollContentView) - scrollContentView.layoutChain - .edges().widthToView(view) - - let headerBgImgView = UIImageView(image: UIImage(named: "PromotionalActivities/header_bg")) - headerBgImgView.contentMode = .scaleAspectFill - - scrollContentView.addSubview(headerBgImgView) - headerBgImgView.layoutChain - .edges(excludingEdge: .bottom) - .heightToWidth(285/375) - - let infoView = UIView() - infoView.backgroundColor = UIColor(hexStr: "#F6F9FB") - infoView.layer.cornerRadius = 30 - - scrollContentView.addSubview(infoView) - infoView.layoutChain - .topToBottomOfView(headerBgImgView, offset: -65) - .edges(excludingEdge: .top) - - let iconView = UIImageView(image: UIImage(named: "PromotionalActivities/vip_icon")) - infoView.addSubview(iconView) - iconView.layoutChain - .top(20) - .left(15) - .width(20) - .heightToWidth(1) - - let titleLab = UILabel() - titleLab.text = "即刻加入会员" - titleLab.font = .systemFont(ofSize: 16, weight: .semibold) - titleLab.textColor = UIColor(hexStr: "#333333") - infoView.addSubview(titleLab) - titleLab.layoutChain - .leftToRightOfView(iconView, offset: 4) - .centerY(iconView) - - scrollContentView.addSubview(tableView) - tableView.layoutChain - .topToBottomOfView(titleLab, offset: 0) - .edgesHorzontal() - - let agreementView = UIView() - infoView.addSubview(agreementView) - agreementView.layoutChain - .topToBottomOfView(tableView, offset: 15) - .left(15) - .right(15) - .height(16) - - agreementView.addSubview(agreementCheckBtn) - agreementCheckBtn.layoutChain - .left(0) - .centerY() - .width(16) - .height(16) - - agreementView.addSubview(agreementTextView) - agreementTextView.layoutChain - .leftToRightOfView(agreementCheckBtn, offset: 3) - .right(0) - .centerY() - .bottom(0) - - let benefitsImgView = UIImageView(image: UIImage(named: "PromotionalActivities/benefits")) - benefitsImgView.contentMode = .scaleAspectFill - infoView.addSubview(benefitsImgView) - benefitsImgView.layoutChain - .topToBottomOfView(agreementView, offset: 20) - .edgesHorzontal(15) - .bottom(15, relation: .greaterThanOrEqual) - .heightToWidth(148/375) - - return view - }() - - lazy var scrollContentView: UIView = { - let view = UIView() - view.backgroundColor = .clear - return view - }() - - lazy var tableView: UITableView = { - let tableView = UITableView(frame: .zero, style: .plain) - tableView.backgroundColor = .clear - tableView.separatorStyle = .none - tableView.estimatedRowHeight = 106 - tableView.isScrollEnabled = false - tableView.showsVerticalScrollIndicator = false - tableView.register(PromotionalNormalCell.self) - tableView.register(PromotionalRecommendCell.self) - return tableView - }() - - lazy var bottomView: UIView = { - let view = UIView() - view.backgroundColor = .white - - view.addSubview(countdownContainer) - countdownContainer.layoutChain - .top(11) - .centerX() - - view.addSubview(confirmBtn) - confirmBtn.layoutChain - .edgesHorzontal(30) - .bottom(35) - .height(50) - - return view - }() - - lazy var agreementCheckBtn: UIButton = { - let btn = UIButton(type: .custom) - btn.setImage(UIImage(named: "Common/checkbox"), for: .normal) - btn.setImage(UIImage(named: "Common/checkbox_on"), for: .selected) - btn.rx.tap.subscribe(onNext: { [weak btn] in - btn?.isSelected.toggle() - }).disposed(by: disposeBag) - btn.isSelected = true - return btn - }() - - lazy var agreementTextView: UITextView = { - let tv = UITextView() - tv.isEditable = false - tv.isScrollEnabled = false - tv.backgroundColor = .clear - tv.textContainerInset = .zero - tv.textContainer.lineFragmentPadding = 0 - tv.delegate = self - let text = "购买前请先阅读隐私政策和服务条款" - let attr = NSMutableAttributedString(string: text, attributes: [ - .font: UIFont.systemFont(ofSize: 12), - .foregroundColor: UIColor(hexStr: "#999999") - ]) - let privacyRange = (text as NSString).range(of: "隐私政策") - let termsRange = (text as NSString).range(of: "服务条款") - let linkColor = UIColor(hexStr: "#16B3FF") - attr.addAttributes([.foregroundColor: linkColor, .link: URLManager.shared.privacyPolicyUrl], range: privacyRange) - attr.addAttributes([.foregroundColor: linkColor, .link: URLManager.shared.userAgreementUrl], range: termsRange) - tv.attributedText = attr - tv.linkTextAttributes = [.foregroundColor: linkColor] - return tv - }() - - lazy var countdownContainer: UIStackView = { - let stack = UIStackView(arrangedSubviews: [countdownPrefixLabel, countdownMinLabel, countdownColonLabel, countdownSecLabel, countdownSuffixLabel]) - stack.axis = .horizontal - stack.alignment = .center - stack.spacing = 0 - return stack - }() - - lazy var countdownPrefixLabel: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 12) - label.textColor = UIColor(hexStr: "#FD501B") - label.text = "优惠活动倒计时 " - return label - }() - - lazy var countdownMinLabel: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 12) - label.textColor = .white - label.backgroundColor = UIColor(hexStr: "#FD501B") - label.layer.cornerRadius = 2 - label.clipsToBounds = true - label.textAlignment = .center - label.text = "15" - return label - }() - - lazy var countdownColonLabel: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 12) - label.textColor = UIColor(hexStr: "#FD501B") - label.text = ":" - return label - }() - - lazy var countdownSecLabel: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 12) - label.textColor = .white - label.backgroundColor = UIColor(hexStr: "#FD501B") - label.layer.cornerRadius = 2 - label.clipsToBounds = true - label.textAlignment = .center - label.text = "00" - return label - }() - - lazy var countdownSuffixLabel: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 12) - label.textColor = UIColor(hexStr: "#FD501B") - label.text = " 限时特惠" - return label - }() - - lazy var confirmBtn: UIButton = { - let btn = UIButton(type: .custom) - btn.setTitle("立即开通", for: .normal) - btn.setTitleColor(.white, for: .normal) - btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) - btn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal) - btn.cornerRadius = 25 - return btn - }() - - private var countdownRemaining: Int = 15 * 60 - private var countdownTimer: Timer? - - func startCountdown() { - countdownRemaining = 15 * 60 - updateCountdown() - countdownTimer?.invalidate() - countdownTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in - self?.updateCountdown() - } - } - - private func stopCountdown() { - countdownTimer?.invalidate() - countdownTimer = nil - } - - private func updateCountdown() { - if countdownRemaining > 0 { - countdownRemaining -= 1 - } - else { - AppRouter.shared.popOrDismiss() - return - } - let min = countdownRemaining / 60 - let sec = countdownRemaining % 60 - countdownMinLabel.text = String(format: "%02d", min) - countdownSecLabel.text = String(format: "%02d", sec) - } - - override func layoutSubviews() { - super.layoutSubviews() - } - - override func willMove(toSuperview newSuperview: UIView?) { - super.willMove(toSuperview: newSuperview) - if newSuperview == nil { - stopCountdown() - } - } - - override init(frame: CGRect) { - super.init(frame: .zero) - backgroundColor = .white - setupUI() - setupRx() - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} - -// MARK: - UIScrollViewDelegate -extension PromotionalActivitiesView: UIScrollViewDelegate { - func scrollViewDidScroll(_ scrollView: UIScrollView) { - let maxY = scrollView.contentOffset.y - let alpha = maxY / kNaviHeight - navView.alpha = alpha < 0.0 ? 0.0 : alpha - } -} - -// MARK: - UITextViewDelegate -extension PromotionalActivitiesView: UITextViewDelegate { - func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { - AppRouter.push(Route.web, userInfo: ["url": URL.absoluteString]) - return false - } -} - -// MARK: - PromotionalNormalCell -class PromotionalNormalCell: UITableViewCell { - - func configure(model: VipExpenseModel, isSelected: Bool) { - priceLab.text = model.price - originPriceLab.text = "原价" + model.origin_price - originPriceLab.setupStrikethroughStyle() - goodsNameLab.text = model.goods_name - tipsLab.text = model.tips2 - bgView.image = UIImage(named: isSelected ? "PromotionalActivities/normal_on_bg" : "PromotionalActivities/normal_bg") - priceLab.textColor = isSelected ? UIColor(hexStr: "#FF383C") : ThemeManager.shared.color.titleAuxColor - unitLab.textColor = isSelected ? UIColor(hexStr: "#FF383C") : ThemeManager.shared.color.titleAuxColor - } - - override init(style: CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - selectionStyle = .none - backgroundColor = .clear - setupSubviews() - } - - private func setupSubviews() { - contentView.addSubview(bgView) - bgView.addSubview(unitLab) - bgView.addSubview(priceLab) - bgView.addSubview(originPriceLab) - bgView.addSubview(goodsNameLab) - bgView.addSubview(tipsLab) - - bgView.layoutChain - .top(22) - .edgesHorzontal(15) - .bottom() - - priceLab.layoutChain - .leftToRightOfView(unitLab, offset: 0) - .centerY() - - unitLab.layoutChain - .left(32) - .centerY(bgView, offset: 9) - - originPriceLab.layoutChain - .topToBottomOfView(priceLab, offset: -5) - .centerX(priceLab) - - goodsNameLab.layoutChain - .leftToRightOfView(priceLab, offset: 27) - .bottomToCenterYOfView(bgView) - - tipsLab.layoutChain - .leftToView(goodsNameLab) - .topToCenterYOfView(bgView, offset: 3) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func awakeFromNib() { - super.awakeFromNib() - // Initialization code - } - - override func setSelected(_ selected: Bool, animated: Bool) { - super.setSelected(selected, animated: animated) - - // Configure the view for the selected state - } - - lazy var bgView: UIImageView = { - let view = UIImageView() - view.backgroundColor = .clear - view.contentMode = .scaleAspectFill - - return view - }() - - lazy var priceLab: UILabel = { - let label = UILabel() - label.textColor = UIColor(hexStr: "#FF383C") - label.font = .systemFont(ofSize: 40, weight: .bold) - return label - }() - - lazy var unitLab: UILabel = { - let label = UILabel() - label.text = "¥" - label.textColor = UIColor(hexStr: "#FF383C") - label.font = .systemFont(ofSize: 12, weight: .regular) - return label - }() - - lazy var originPriceLab: UILabel = { - let label = UILabel() - label.textColor = UIColor(hexStr: "#999999") - label.font = .systemFont(ofSize: 10, weight: .regular) - return label - }() - - lazy var goodsNameLab: UILabel = { - let label = UILabel() - label.textColor = ThemeManager.shared.color.titleAuxColor - label.font = .systemFont(ofSize: 18, weight: .semibold) - return label - }() - - lazy var tipsLab: UILabel = { - let label = UILabel() - label.textColor = ThemeManager.shared.color.contentColor - label.font = .systemFont(ofSize: 14, weight: .regular) - return label - }() -} - -// MARK: - PromotionalRecommendCell -class PromotionalRecommendCell: UITableViewCell { - - func configure(model: VipExpenseModel, isSelected: Bool) { - tipsTitleLab.text = model.tips - priceLab.text = model.price - originPriceLab.text = "原价" + model.origin_price - originPriceLab.setupStrikethroughStyle() - goodsNameLab.text = model.goods_name - tipsLab.text = model.tips2 - bgView.image = UIImage(named: isSelected ? "PromotionalActivities/recommend_on_bg" : "PromotionalActivities/recommend_bg") - priceLab.textColor = isSelected ? UIColor(hexStr: "#FF383C") : ThemeManager.shared.color.titleAuxColor - unitLab.textColor = isSelected ? UIColor(hexStr: "#FF383C") : ThemeManager.shared.color.titleAuxColor - } - - override init(style: CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - selectionStyle = .none - backgroundColor = .clear - setupSubviews() - } - - private func setupSubviews() { - contentView.addSubview(bgView) - bgView.addSubview(unitLab) - bgView.addSubview(priceLab) - bgView.addSubview(originPriceLab) - bgView.addSubview(goodsNameLab) - bgView.addSubview(tipsLab) - bgView.addSubview(recommendLab) - bgView.addSubview(recommendIcon) - bgView.addSubview(tipsTitleView) - tipsTitleView.addSubview(tipsTitleLab) - - bgView.layoutChain - .top(22) - .edgesHorzontal(15) - .bottom() - - tipsTitleView.layoutChain - .topToView(bgView, offset: -8) - .leftToView(bgView, offset: -6) - .width(94) - .height(35) - - tipsTitleLab.layoutChain - .centerX() - .top(7) - - priceLab.layoutChain - .leftToRightOfView(unitLab, offset: 0) - .centerY() - - unitLab.layoutChain - .left(32) - .centerY(bgView, offset: 9) - - originPriceLab.layoutChain - .topToBottomOfView(priceLab, offset: -5) - .centerX(priceLab) - - goodsNameLab.layoutChain - .leftToRightOfView(priceLab, offset: 27) - .bottomToCenterYOfView(bgView, offset: -5) - - tipsLab.layoutChain - .leftToView(goodsNameLab) - .topToCenterYOfView(bgView, offset: 8) - - recommendLab.layoutChain - .top(8) - .right(24) - - recommendIcon.layoutChain - .rightToLeftOfView(recommendLab, offset: -3) - .centerY(recommendLab) - .width(13) - .height(11) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func awakeFromNib() { - super.awakeFromNib() - // Initialization code - } - - override func setSelected(_ selected: Bool, animated: Bool) { - super.setSelected(selected, animated: animated) - - // Configure the view for the selected state - } - - lazy var bgView: UIImageView = { - let view = UIImageView() - view.backgroundColor = .clear - view.contentMode = .scaleAspectFill - - return view - }() - - lazy var priceLab: UILabel = { - let label = UILabel() - label.textColor = UIColor(hexStr: "#FF383C") - label.font = .systemFont(ofSize: 40, weight: .bold) - return label - }() - - lazy var unitLab: UILabel = { - let label = UILabel() - label.text = "¥" - label.textColor = UIColor(hexStr: "#FF383C") - label.font = .systemFont(ofSize: 12, weight: .regular) - return label - }() - - lazy var originPriceLab: UILabel = { - let label = UILabel() - label.textColor = UIColor(hexStr: "#999999") - label.font = .systemFont(ofSize: 10, weight: .regular) - return label - }() - - lazy var goodsNameLab: UILabel = { - let label = UILabel() - label.textColor = ThemeManager.shared.color.titleAuxColor - label.font = .systemFont(ofSize: 18, weight: .semibold) - return label - }() - - lazy var tipsTitleView: UIImageView = { - let view = UIImageView() - view.backgroundColor = .clear - view.image = UIImage(named: "PromotionalActivities/tips_bg") - return view - }() - - lazy var tipsTitleLab: UILabel = { - let label = UILabel() - label.textColor = .white - label.font = .systemFont(ofSize: 12, weight: .semibold) - return label - }() - - lazy var tipsLab: UILabel = { - let label = UILabel() - label.textColor = ThemeManager.shared.color.contentColor - label.font = .systemFont(ofSize: 14, weight: .regular) - return label - }() - - lazy var recommendIcon: UIImageView = { - let view = UIImageView() - view.contentMode = .scaleAspectFill - view.image = UIImage(named: "PromotionalActivities/recommend_icon") - return view - }() - - lazy var recommendLab: UILabel = { - let label = UILabel() - label.text = "80%的用户选择" - label.textColor = .white - label.font = .systemFont(ofSize: 12, weight: .medium) - return label - }() -} diff --git a/QuickLocation/Section/Schedule/CreateSchedule/CreateScheduleVipPopView.swift b/QuickLocation/Section/Schedule/CreateSchedule/CreateScheduleVipPopView.swift index 7e3fba55..979b0558 100644 --- a/QuickLocation/Section/Schedule/CreateSchedule/CreateScheduleVipPopView.swift +++ b/QuickLocation/Section/Schedule/CreateSchedule/CreateScheduleVipPopView.swift @@ -48,7 +48,7 @@ class CreateScheduleVipPopView: UIView { private func setupRx() { upgradedBtn.rx.tap.subscribe(onNext: { _ in CreateScheduleVipPopView.dismiss() - AppRouter.push(Route.vipRecharge) + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.homeUrl]) }).disposed(by: disposeBag) closeBtn.rx.tap.subscribe(onNext: { _ in diff --git a/QuickLocation/Section/Share/SharePopView.swift b/QuickLocation/Section/Share/SharePopView.swift index a6916f7d..99f8ee4b 100644 --- a/QuickLocation/Section/Share/SharePopView.swift +++ b/QuickLocation/Section/Share/SharePopView.swift @@ -11,7 +11,12 @@ import Kingfisher class SharePopView: UIView { private static let shared = SharePopView(frame: CGRect(origin: .zero, size: kScreenSize)) - private var shareURL: String = "" + private var shareURL: String { + guard let config = AppContextManager.shared.systemConfig, + let shareConfig = config.shareConfig else { return "" } + + return shareConfig.link + } private let contentHeight: CGFloat = 191 + kSafeBottomMargin diff --git a/QuickLocation/Section/TextInput/TextInputViewController.swift b/QuickLocation/Section/TextInput/TextInputViewController.swift index 3777b401..00dbd4d2 100644 --- a/QuickLocation/Section/TextInput/TextInputViewController.swift +++ b/QuickLocation/Section/TextInput/TextInputViewController.swift @@ -104,6 +104,8 @@ final class TextInputViewController: UIViewController { private func setupBinding() { textView.text = textRelay.value updateCommittedText() + textView.rx.setDelegate(self) + .disposed(by: disposeBag) Observable.merge( textView.rx.didChange.asObservable(), @@ -127,15 +129,6 @@ final class TextInputViewController: UIViewController { private func updateCommittedText() { guard !textView.isComposingText else { return } - if textView.text.last == "\n" { - textView.text = String(textView.text.dropLast()) - textView.selectedRange = NSRange( - location: (textView.text as NSString).length, - length: 0 - ) - textView.resignFirstResponder() - } - let text: String if maxLength > 0 { text = textView.limitCommittedText(to: maxLength) ?? textView.text @@ -202,3 +195,13 @@ final class TextInputViewController: UIViewController { return btn }() } + +extension TextInputViewController: UITextViewDelegate { + func textView(_ textView: UITextView, + shouldChangeTextIn range: NSRange, + replacementText text: String) -> Bool { + guard text == "\n" else { return true } + textView.resignFirstResponder() + return false + } +} diff --git a/QuickLocation/Section/VipRecharge/VipExpenseModel.swift b/QuickLocation/Section/VipRecharge/VipExpenseModel.swift deleted file mode 100644 index 6c82e41f..00000000 --- a/QuickLocation/Section/VipRecharge/VipExpenseModel.swift +++ /dev/null @@ -1,88 +0,0 @@ -// -// VipExpenseModel.swift -// QuickLocation -// -// Created by 八条 on 2026/6/3. -// - -import ObjectMapper -import RxDataSources - -struct VipExpenseResponse: BaseModelProtocol { - // 状态码 - var code: String? - // 消息 - var message: String? - // - var list: [VipExpenseModel] = [] - - init?(map: Map) {} - - mutating func mapping(map: Map) { - code <- map["code"] - message <- map["msg"] - list <- map["data"] - } -} - -struct VipExpenseModel: Mappable, Equatable { - /// - var goods_id: String = "" - /// 资费名字 - var goods_name: String = "" - /// 资费 - var price: String = "" - /// 资费原价 - var origin_price: String = "" - /// 资费标签 - var tips: String = "" - /// 资费说明 - var tips2: String = "" - /// 单位 月1m 年 12m 得换算 - var value: String = "" - var unit: String { - guard value.hasSuffix("m") else { return "" } - let monthStr = value.replacingOccurrences(of: "m", with: "") - guard !monthStr.isEmpty, let month = Int(monthStr) else { return "" } - - if month >= 12 { - let num = month / 12 - return num > 1 ? "/\(num)年" : "/年" - } else if month % 3 == 0 { - let num = month / 3 - return num > 1 ? "/\(num)季" : "/季" - } else { - return month > 1 ? "/\(month)月" : "/月" - } - } - - /// 支付方式 - var pay_type: String = "" - - /// 选中状态 - var checked: Bool = false - - init?(map: Map) { - - } - - mutating func mapping(map: Map) { - goods_id <- map["goods_id"] - goods_name <- map["goods_name"] - price <- map["price"] - origin_price <- map["origin_price"] - tips <- map["tips"] - tips2 <- map["tips2"] - value <- map["value"] - checked <- map["checked"] - pay_type <- map["pay_type"] - } -} - -extension VipExpenseModel: IdentifiableType { - public typealias Identity = String - - public var identity: String { - return goods_id - } -} diff --git a/QuickLocation/Section/VipRecharge/VipRechargeVC.swift b/QuickLocation/Section/VipRecharge/VipRechargeVC.swift deleted file mode 100644 index 63117ebf..00000000 --- a/QuickLocation/Section/VipRecharge/VipRechargeVC.swift +++ /dev/null @@ -1,208 +0,0 @@ -// -// VipRechargeVC.swift -// QuickLocation -// -// Created by 八条 on 2026/6/3. -// - -import UIKit -import RxSwift -import RxCocoa -import RxDataSources - -class VipRechargeVC: BaseViewController { - - fileprivate var rootView: VipRechargeView! - - override func loadView() { - rootView = VipRechargeView(frame: UIScreen.main.bounds) - view = rootView - } - - private var viewModel = VipRechargeVM() - - override func viewDidLoad() { - super.viewDidLoad() - fd_interactivePopDisabled = true - bindViewModel() - reactiveAction() - requestRechargeInfo() - - NotificationCenter.default.rx.notification(.RequestOrderPayStatusNotification) - .subscribe(onNext: { [weak self] _ in - self?.handlePaymentSuccess() - }).disposed(by: disposeBag) - } - - private func handlePaymentSuccess() { - UserService.userInfo().subscribe { [weak self] response in - if let model = response.model { - AppContextManager.shared.saveAccount(model) - } - self?.showPayResultPop(showCloseBtn: false, - status: true, - title: "支付成功", - message: "恭喜您!成功开通\(self?.viewModel.goodsName ?? "")", - confirmText: "确定", confirmBlock: { - AppRouter.shared.popOrDismiss() - }, cancelBlock: { }) - }.disposed(by: disposeBag) - } - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - navigationController?.setNavigationBarHidden(true, animated: false) - } - - private func bindViewModel() { - viewModel.output.sectionedItems - .bind(to: rootView.expenseCollectionView.rx.items(dataSource: dataSource)) - .disposed(by: disposeBag) - - viewModel.output.vipRightItems - .bind(to: rootView.vipRightsCollectionView.rx.items(dataSource: vipRightsDataSource)) - .disposed(by: disposeBag) - - viewModel.createCount.asObservable() - .bind(to: rootView.createCountLab.rx.text) - .disposed(by: disposeBag) - - viewModel.groupCount.asObservable() - .bind(to: rootView.groupCountLab.rx.text) - .disposed(by: disposeBag) - - viewModel.joinCount.asObservable() - .bind(to: rootView.joinCountLab.rx.text) - .disposed(by: disposeBag) - } - - private func reactiveAction() { - rootView.payBtnView.rx.tapGesture.subscribe(onNext: { _ in - self.requestOrderPayParams() - }).disposed(by: disposeBag) - - Observable.zip( - rootView.expenseCollectionView.rx.itemSelected, - rootView.expenseCollectionView.rx.modelSelected(VipExpenseModel.self) - ).subscribe(onNext: { indexPath, model in - self.viewModel.selectedIndex = indexPath.row - self.rootView.setupPayTypes(model.pay_type) - self.rootView.animatePrice(to: model.price) - self.rootView.discountLab.text = self.viewModel.discountPriceString - }) - .disposed(by: disposeBag) - } - - // MARK: - dataSource - private lazy var dataSource: RxCollectionViewSectionedReloadDataSource = { - RxCollectionViewSectionedReloadDataSource { datasource, collectionView, indexPath, model in - let cell: ExpenseCell = collectionView.dequeueReusableCell(for: indexPath) - cell.configure(model: model, isSelected: self.viewModel.selectedIndex == indexPath.row) - return cell - } - }() - - private lazy var vipRightsDataSource: RxCollectionViewSectionedReloadDataSource = { - RxCollectionViewSectionedReloadDataSource { datasource, collectionView, indexPath, model in - let cell: VipRightsCell = collectionView.dequeueReusableCell(for: indexPath) - cell.configure(model) - return cell - } - }() - - // MARK: - API - private func requestRechargeInfo() { - DLToast.showLoading() - OrderService.rechargeInfo(type: "member").subscribe(onNext: { [weak self] response in - guard let self = self else { return } - self.viewModel.loadData(list: response.list) - self.rootView.setupPayTypes(self.viewModel.payType) - self.rootView.animatePrice(to: self.viewModel.price) - self.rootView.discountLab.text = self.viewModel.discountPriceString - }).disposed(by: disposeBag) - } - - // MARK: - API支付参数 - private func requestOrderPayParams() { - let types = viewModel.payType.components(separatedBy: ",").map { $0.trimmingCharacters(in: .whitespaces) } - let payType = types[rootView.selectedPayTypeTag] - -// if payType == "apple" { -// IAPManager.shared.purchase(goodsId: viewModel.goodsId) { [weak self] success, msg in -// guard let self = self else { return } -// if success { -// self.showPayResultPop(showCloseBtn: false, -// status: true, -// title: "支付成功", -// message: "恭喜您!成功开通\(self.viewModel.goodsName)", -// confirmText: "确定", confirmBlock: { -// AppRouter.shared.popOrDismiss() -// }, cancelBlock: { }) -// } else { -// self.showPayResultPop(status: false, -// title: "支付失败", -// message: msg ?? "很抱歉,请您重新支付!", -// confirmText: "重新支付", confirmBlock: { }, -// cancelText: "取消", cancelBlock: { -// AppRouter.shared.popOrDismiss() -// }) -// } -// } -// return -// } - - DLToast.showLoading() - OrderService.orderPayParams(goodsId: viewModel.goodsId, - payType: types[rootView.selectedPayTypeTag]).subscribe(onNext: { response in - guard let data = response.data else { return } - - let payType = types[self.rootView.selectedPayTypeTag] - if payType == "weixin" { // 微信 - guard let partnerId = data["partnerId"] as? String, - let prepayId = data["prepayId"] as? String, - let package = data["package"] as? String, - let nonceStr = data["nonceStr"] as? String, - let timeStamp = data["timeStamp"] as? String, - let sign = data["sign"] as? String else { return } - let request: PayReq = PayReq() - request.partnerId = partnerId - request.prepayId = prepayId - request.package = package - request.nonceStr = nonceStr - request.timeStamp = UInt32(timeStamp) ?? 0 - request.sign = sign - WXApi.send(request) - } - else if payType == "alipay" { // 支付宝 - if let payParam = data["payParam"] as? String, let appId = data["appId"] as? String { - AlipaySDK.defaultService().payOrder(payParam, fromScheme: "Alipay\(appId)") { resultDic in -// print("支付宝callback -> \(resultDic)") - guard let result = resultDic, - let resultStatus = result["resultStatus"] as? String else { return } - /** - 9000 订单支付成功。 - 8000 正在处理中,支付结果未知(有可能已经支付成功),请查询商家订单列表中订单的支付状态。 - 4000 订单支付失败。 - 5000 重复请求。 - 6001 用户中途取消。 - 6002 网络连接出错。 - 6004 支付结果未知(有可能已经支付成功),请查询商家订单列表中订单的支付状态。 - 其它 其它支付错误。 - */ - if resultStatus == "9000" { - self.handlePaymentSuccess() - } - else { - self.showPayResultPop(status: false, - title: "支付失败", - message: "很抱歉,请您重新支付!", - confirmText: "重新支付", confirmBlock: { }, cancelText: "取消", cancelBlock: { - AppRouter.shared.popOrDismiss() - }) - } - } - } - } - }, onError: { _ in }).disposed(by: disposeBag) - } -} diff --git a/QuickLocation/Section/VipRecharge/VipRechargeVM.swift b/QuickLocation/Section/VipRecharge/VipRechargeVM.swift deleted file mode 100644 index 34ac31a4..00000000 --- a/QuickLocation/Section/VipRecharge/VipRechargeVM.swift +++ /dev/null @@ -1,140 +0,0 @@ -// -// VipRechargeVM.swift -// QuickLocation -// -// Created by 八条 on 2026/6/3. -// - -import RxSwift -import RxCocoa -import RxDataSources -import SwiftyUserDefaults - -typealias ExpenseListSectionModel = SectionModel -typealias VipRightsListSectionModel = SectionModel - -class VipRechargeVM { - struct Input { - - } - struct Output { - var sectionedItems: Observable<[ExpenseListSectionModel]> - var vipRightItems: Observable<[VipRightsListSectionModel]> - } - - let input: Input - let output: Output - var disposeBag = DisposeBag() - - var createCount = BehaviorRelay(value: "0") - var groupCount = BehaviorRelay(value: "0") - var joinCount = BehaviorRelay(value: "0") - - private let sectionedItems = PublishSubject<[ExpenseListSectionModel]>() - private let vipRightsItems = PublishSubject<[VipRightsListSectionModel]>() - - private let vipRightsList: [VipRightsModel] = [ - VipRightsModel(icon: "VipRecharge/location", title: "定位查询"), - VipRightsModel(icon: "VipRecharge/map", title: "地图样式"), - VipRightsModel(icon: "VipRecharge/sos", title: "SOS求救"), - VipRightsModel(icon: "VipRecharge/bubble", title: "创建气泡"), - VipRightsModel(icon: "VipRecharge/ad", title: "无广告"), - VipRightsModel(icon: "VipRecharge/battery", title: "电池电量"), - VipRightsModel(icon: "VipRecharge/emoji", title: "趣味表情"), - VipRightsModel(icon: "VipRecharge/service", title: "专属客服") - ] - - var selectedIndex: Int = -1 { - didSet { - refreshData() - loadVipRightsData() - } - } - var list: [VipExpenseModel] = [] - - var goodsId: String { - guard list.count > 0 else { return "" } - return list[selectedIndex].goods_id - } - - var goodsName: String { - guard list.count > 0 else { return "" } - return list[selectedIndex].goods_name - } - - var payType: String { - guard list.count > 0 else { return "" } - return list[selectedIndex].pay_type - } - - var price: String { - guard list.count > 0 else { return "" } - return list[selectedIndex].price - } - - var discountPriceString: String { - guard list.count > 0 else { return "已优惠0元" } - - let price = list[selectedIndex].price - let oPrice = list[selectedIndex].origin_price - - guard oPrice.int >= price.int else { return "已优惠0元" } - - let diff = oPrice.double - price.double - let diffStr = diff.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", diff) : String(diff) - return "已优惠\(diffStr)元" - } - - // MARK: - 加载数据 - func loadData(list: [VipExpenseModel]) { - self.list = list - selectedIndex = list.firstIndex(where: { $0.checked == true }) ?? 0 - sectionedItems.onNext(list.mapSection()) - } - - func refreshData() { - sectionedItems.onNext(list.mapSection()) - } - - func loadVipRightsData() { - // 20040(没有专属客服): 5 10 5 20041: 10 20 10 20042: 15 30 15 - let model = list[selectedIndex] - var tmpList = vipRightsList - - switch model.goods_id { - case "20040": - createCount.accept("5") - groupCount.accept("10") - joinCount.accept("5") - let _ = tmpList.popLast() - case "20041": - createCount.accept("10") - groupCount.accept("20") - joinCount.accept("10") - case "20042": - createCount.accept("15") - groupCount.accept("30") - joinCount.accept("15") - default: - createCount.accept("5") - groupCount.accept("10") - joinCount.accept("5") - } - - vipRightsItems.onNext(tmpList.mapSection()) - } - - // MARK: - init - init() { - input = Input() - output = Output( - sectionedItems: sectionedItems.asObservable(), - vipRightItems: vipRightsItems.asObservable() - ) - } -} - -struct VipRightsModel { - var icon: String - var title: String -} diff --git a/QuickLocation/Section/VipRecharge/VipRechargeView.swift b/QuickLocation/Section/VipRecharge/VipRechargeView.swift deleted file mode 100644 index bfa4f47c..00000000 --- a/QuickLocation/Section/VipRecharge/VipRechargeView.swift +++ /dev/null @@ -1,926 +0,0 @@ -// -// VipRechargeView.swift -// QuickLocation -// -// Created by 八条 on 2026/6/3. -// - -import UIKit -import RxSwift -import RxCocoa - -class VipRechargeView: UIView { - - var disposeBag = DisposeBag() - - private func setupRx() { - navView.onBackTapped = { VipWaivePopView.show() } - - backBtn.rx.tap.subscribe { _ in - VipWaivePopView.show() - }.disposed(by: disposeBag) - - agreementLab.rx.tapGesture.subscribe { _ in - AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.userAgreementUrl]) - }.disposed(by: disposeBag) - - vipRightsDetailView.rx.tapGesture.subscribe { _ in - AppRouter.push(Route.vipRights) - }.disposed(by: disposeBag) - } - - private func setupUI() { - addSubview(scrollView) - scrollView.addSubview(scrollContentView) - scrollContentView.addSubview(headerBgImgView) - scrollContentView.addSubview(vipRightsDetailView) - scrollContentView.addSubview(cornerView) - scrollContentView.addSubview(expenseCollectionView) - scrollContentView.addSubview(vipRightsView) - scrollContentView.addSubview(agreementLab) - scrollContentView.addSubview(tipsLab) - - vipRightsView.addSubview(vipRightsTitleView) - vipRightsView.addSubview(groupCountView) - vipRightsView.addSubview(vipRightsCollectionView) - - addSubview(bottomView) - bottomView.addSubview(payTypeStackView) - bottomView.addSubview(payBtnView) - bottomView.addSubview(payPriceView) - - addSubview(backBtn) - addSubview(navView) - - backBtn.layoutChain - .top(kStatusBarHeight + 5) - .left(15) - .width(44) - .height(44) - - navView.layoutChain - .edges(excludingEdge: .bottom) - .height(kNaviHeight) - navView.backgroundColor = .white - navView.alpha = 0 - - bottomView.layoutChain - .edgesHorzontal() - .heightToWidth(144/375) - .bottom() - - payBtnView.layoutChain - .edgesHorzontal(16) - .heightToWidth(50/343) - .centerY() - - payTypeStackView.layoutChain - .top(13) - .edgesHorzontal(16) - .bottomToTopOfView(payBtnView) - - payPriceView.layoutChain - .left(32) - .centerY(payBtnView, offset: -7) - .height(30) - - scrollView.layoutChain - .edges(excludingEdge: .bottom) - .bottomToTopOfView(bottomView) - - scrollContentView.layoutChain - .edges() - .widthToView(scrollView) - - headerBgImgView.layoutChain - .edges(excludingEdge: .bottom) - .heightToWidth(267/375) - - vipRightsDetailView.layoutChain - .top(36 + kStatusBarHeight) - .right() - .height(24) - - cornerView.layoutChain - .topToBottomOfView(headerBgImgView, offset: -20) - .edges(excludingEdge: .top) - - let expenseCollectionViewHeight = (kScreenWidth - 32 - 32) / 3 * (144/110) + 10 - expenseCollectionView.layoutChain - .topToView(cornerView, offset: -43) - .edgesHorzontal() - .height(expenseCollectionViewHeight * 1.1) - - vipRightsView.layoutChain - .topToBottomOfView(expenseCollectionView, offset: 18) - .edgesHorzontal(16) - - vipRightsTitleView.layoutChain - .top(14) - .centerX() - - groupCountView.layoutChain - .topToBottomOfView(vipRightsTitleView, offset: 9) - .edgesHorzontal() - - vipRightsCollectionView.layoutChain - .topToBottomOfView(groupCountView, offset: 14) - .edgesHorzontal() - .bottom(14) - .height(150) - - agreementLab.layoutChain - .topToBottomOfView(vipRightsView, offset: 6) - .leftToView(vipRightsView) - .rightToView(vipRightsView) - - tipsLab.layoutChain - .topToBottomOfView(agreementLab, offset: 4) - .leftToView(vipRightsView) - .rightToView(vipRightsView) - .bottom(10) - } - - lazy var navView = BaseNavigationView(title: "升级会员") - - lazy var backBtn: UIButton = { - let btn = UIButton(type: .custom) - btn.setImage(UIImage(named: "Common/back"), for: .normal) - btn.extendEdgeInsets = UIEdgeInsets(top: 54, left: 15, bottom: 100, right: 100) - return btn - }() - - lazy var scrollView: UIScrollView = { - let view = UIScrollView() - view.backgroundColor = UIColor(hexStr: "#F5FBFB") - view.showsVerticalScrollIndicator = false - view.delegate = self - view.bounces = false - view.contentInsetAdjustmentBehavior = .never - return view - }() - - lazy var scrollContentView: UIView = { - let view = UIView() - view.backgroundColor = .clear - return view - }() - - lazy var headerBgImgView: UIImageView = { - let view = UIImageView() - view.image = UIImage(named: "VipRecharge/header_bg") - return view - }() - - lazy var vipRightsDetailView: UIView = { - let view = UIView() - view.backgroundColor = UIColor(hexStr: "#FFFFFF", alpha: 0.7) - - let label = UILabel() - label.text = "权益对比" - label.font = .systemFont(ofSize: 11, weight: .bold) - label.textColor = UIColor(hexStr: "#224E92") - - view.addSubview(label) - label.layoutChain - .edgesVertical(4) - .edgesHorzontal(8) - - return view - }() - - lazy var cornerView: UIView = { - let view = UIView() - view.backgroundColor = UIColor(hexStr: "#F5FBFB") - view.clipsToBounds = false - return view - }() - - /// 资费 - lazy var expenseCollectionView: UICollectionView = { - let layout = UICollectionViewFlowLayout() - let spacing: CGFloat = 16 - let cvWidth = kScreenWidth - 32 - let itemW = (cvWidth - spacing * 2) / 3 - layout.itemSize = CGSize(width: itemW, height: itemW * (144/110) + 10) - layout.sectionInset = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16) - layout.minimumLineSpacing = spacing - layout.scrollDirection = .horizontal - - let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) - cv.backgroundColor = .clear - cv.showsHorizontalScrollIndicator = false - cv.register(ExpenseCell.self) - return cv - }() - - /// 会员权益 - lazy var vipRightsView: UIView = { - let view = UIView() - view.backgroundColor = .white - view.cornerRadius = 10 - return view - }() - - lazy var vipRightsTitleView: UIView = { - let view = UIView() - view.backgroundColor = .clear - - let titleLab = UILabel() - titleLab.text = "会员权益" - titleLab.font = .systemFont(ofSize: 14, weight: .bold) - titleLab.textColor = UIColor(hexStr: "#3D3D3D") - titleLab.textAlignment = .center - view.addSubview(titleLab) - titleLab.layoutChain - .edgesVertical() - .centerX() - - let leftLine1 = UIView() - leftLine1.backgroundColor = UIColor(hexStr: "#B7F34E") - leftLine1.cornerRadius = 1 - view.addSubview(leftLine1) - leftLine1.layoutChain - .left() - .width(2) - .height(10) - .centerY() - - let leftLine2 = UIView() - leftLine2.backgroundColor = UIColor(hexStr: "#B7F34E") - leftLine2.cornerRadius = 1 - view.addSubview(leftLine2) - leftLine2.layoutChain - .leftToRightOfView(leftLine1, offset: 4) - .width(2) - .edgesVertical() - .rightToLeftOfView(titleLab, offset: -10) - - let leftLine3 = UIView() - leftLine3.backgroundColor = UIColor(hexStr: "#B7F34E") - leftLine3.cornerRadius = 1 - view.addSubview(leftLine3) - leftLine3.layoutChain - .leftToRightOfView(titleLab, offset: 10) - .width(2) - .edgesVertical() - - let leftLine4 = UIView() - leftLine4.backgroundColor = UIColor(hexStr: "#B7F34E") - leftLine4.cornerRadius = 1 - view.addSubview(leftLine4) - leftLine4.layoutChain - .leftToRightOfView(leftLine3, offset: 4) - .width(2) - .height(10) - .centerY() - - return view - }() - - lazy var groupCountView: UIView = { - let view = UIView() - view.backgroundColor = .clear - - // 创建圈子 - let createCountView = UIView() - createCountView.backgroundColor = .clear - - let createIcon = UIImageView(image: UIImage(named: "VipRecharge/create_count")) - - let createBgImg = UIImageView(image: UIImage(named: "VipRecharge/count_bg")) - - let createUnitLab = UILabel() - createUnitLab.text = "个" - createUnitLab.font = .systemFont(ofSize: 10, weight: .medium) - createUnitLab.textColor = UIColor(hexStr: "#1A1A1A") - - let createTitleLab = UILabel() - createTitleLab.text = "创建圈子" - createTitleLab.font = .systemFont(ofSize: 12, weight: .medium) - createTitleLab.textColor = UIColor(hexStr: "#1A1A1A") - - createCountView.addSubview(createIcon) - createCountView.addSubview(createBgImg) - createCountView.addSubview(createUnitLab) - createCountView.addSubview(createTitleLab) - createCountView.addSubview(createCountLab) - - createIcon.layoutChain - .top() - .centerX() - .width(34).height(34) - - createBgImg.layoutChain - .top(8) - .edges(excludingEdge: .top) - - createCountLab.layoutChain - .topToBottomOfView(createIcon, offset: 2) - .centerX() - - createUnitLab.layoutChain - .leftToRightOfView(createCountLab) - .bottomToView(createCountLab, offset: 0) - - createTitleLab.layoutChain - .centerX() - .bottom(4) - - // 分隔线 - let separator1 = UIImageView(image: UIImage(named: "VipRecharge/separator")) - - // 圈子人数 - let groupCountView = UIView() - groupCountView.backgroundColor = .clear - - let groupCountIcon = UIImageView(image: UIImage(named: "VipRecharge/member_count")) - - let groupCountBgImg = UIImageView(image: UIImage(named: "VipRecharge/count_bg")) - - let groupCountUnitLab = UILabel() - groupCountUnitLab.text = "个" - groupCountUnitLab.font = .systemFont(ofSize: 10, weight: .medium) - groupCountUnitLab.textColor = UIColor(hexStr: "#1A1A1A") - - let groupCountTitleLab = UILabel() - groupCountTitleLab.text = "圈子人数" - groupCountTitleLab.font = .systemFont(ofSize: 12, weight: .medium) - groupCountTitleLab.textColor = UIColor(hexStr: "#1A1A1A") - - groupCountView.addSubview(groupCountIcon) - groupCountView.addSubview(groupCountBgImg) - groupCountView.addSubview(groupCountUnitLab) - groupCountView.addSubview(groupCountTitleLab) - groupCountView.addSubview(groupCountLab) - - groupCountIcon.layoutChain - .top() - .centerX() - .width(34).height(34) - - groupCountBgImg.layoutChain - .top(8) - .edges(excludingEdge: .top) - - groupCountLab.layoutChain - .topToBottomOfView(groupCountIcon, offset: 2) - .centerX() - - groupCountUnitLab.layoutChain - .leftToRightOfView(groupCountLab) - .bottomToView(groupCountLab, offset: 0) - - groupCountTitleLab.layoutChain - .centerX() - .bottom(4) - - // 分隔线 - let separator2 = UIImageView(image: UIImage(named: "VipRecharge/separator")) - - // 加入圈子 - let joinCountView = UIView() - joinCountView.backgroundColor = .clear - - let joinCountIcon = UIImageView(image: UIImage(named: "VipRecharge/join_count")) - - let joinCountBgImg = UIImageView(image: UIImage(named: "VipRecharge/count_bg")) - - let joinCountUnitLab = UILabel() - joinCountUnitLab.text = "个" - joinCountUnitLab.font = .systemFont(ofSize: 10, weight: .medium) - joinCountUnitLab.textColor = UIColor(hexStr: "#1A1A1A") - - let joinCountTitleLab = UILabel() - joinCountTitleLab.text = "加入圈子" - joinCountTitleLab.font = .systemFont(ofSize: 12, weight: .medium) - joinCountTitleLab.textColor = UIColor(hexStr: "#1A1A1A") - - joinCountView.addSubview(joinCountIcon) - joinCountView.addSubview(joinCountBgImg) - joinCountView.addSubview(joinCountUnitLab) - joinCountView.addSubview(joinCountTitleLab) - joinCountView.addSubview(joinCountLab) - - joinCountIcon.layoutChain - .top() - .centerX() - .width(34).height(34) - - joinCountBgImg.layoutChain - .top(8) - .edges(excludingEdge: .top) - - joinCountLab.layoutChain - .topToBottomOfView(joinCountIcon, offset: 2) - .centerX() - - joinCountUnitLab.layoutChain - .leftToRightOfView(joinCountLab) - .bottomToView(joinCountLab, offset: 0) - - joinCountTitleLab.layoutChain - .centerX() - .bottom(4) - - view.addSubview(createCountView) - view.addSubview(separator1) - view.addSubview(groupCountView) - view.addSubview(separator2) - view.addSubview(joinCountView) - - groupCountView.layoutChain - .top() - .centerX() - .width(69) - .height(90) - .bottom() - - separator1.layoutChain - .rightToLeftOfView(groupCountView, offset: -26) - .centerY() - .height(85) - .width(1) - - createCountView.layoutChain - .topToView(groupCountView) - .rightToLeftOfView(separator1, offset: -26) - .width(69) - .height(90) - - separator2.layoutChain - .leftToRightOfView(groupCountView, offset: 26) - .centerY() - .height(85) - .width(1) - - joinCountView.layoutChain - .topToView(groupCountView) - .leftToRightOfView(separator2, offset: 26) - .width(69) - .height(90) - - return view - }() - - lazy var createCountLab: UILabel = { - let label = UILabel() - label.text = "0" - label.font = .systemFont(ofSize: 24, weight: .bold) - label.textColor = UIColor(hexStr: "#FF4F44") - return label - }() - - lazy var groupCountLab: UILabel = { - let label = UILabel() - label.text = "0" - label.font = .systemFont(ofSize: 24, weight: .bold) - label.textColor = UIColor(hexStr: "#FF4F44") - return label - }() - - lazy var joinCountLab: UILabel = { - let label = UILabel() - label.text = "0" - label.font = .systemFont(ofSize: 24, weight: .bold) - label.textColor = UIColor(hexStr: "#FF4F44") - return label - }() - - lazy var vipRightsCollectionView: UICollectionView = { - let layout = UICollectionViewFlowLayout() - let spacing: CGFloat = 35 - let cvWidth = kScreenWidth - 64 - let itemW = (cvWidth - spacing * 3) / 4 - layout.itemSize = CGSize(width: itemW, height: 65) - layout.sectionInset = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16) - layout.minimumLineSpacing = 20 - layout.minimumInteritemSpacing = spacing - layout.scrollDirection = .vertical - - let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) - cv.backgroundColor = .clear - cv.showsHorizontalScrollIndicator = false - cv.register(VipRightsCell.self) - return cv - }() - - lazy var agreementLab: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 10, weight: .medium) - label.textColor = UIColor(hexStr: "#767676") - label.isUserInteractionEnabled = true - - let text = "*开通前请阅读《会员服务协议》" - let attr = NSMutableAttributedString(string: text) - let range = (text as NSString).range(of: "《会员服务协议》") - attr.addAttribute(.foregroundColor, value: UIColor(hexStr: "#2DBBFF"), range: range) - label.attributedText = attr - return label - }() - - lazy var tipsLab: UILabel = { - let label = UILabel() - label.text = "*根据相关隐私保护的规定,本产品功能需双方下载并授权同意后再使用,请在自己的设备上使用,不得在未经过对方同意和授权的情况下使用,仅限家庭/亲人/朋友/情侣等熟人间使用。" - label.font = .systemFont(ofSize: 10, weight: .medium) - label.textColor = UIColor(hexStr: "#767676") - label.numberOfLines = 0 - return label - }() - - lazy var payTypeStackView: UIStackView = { - let stack = UIStackView() - stack.axis = .horizontal - stack.spacing = 30 -// stack.distribution = .fill - stack.alignment = .leading - return stack - }() - - var selectedPayTypeTag: Int = 0 - - /// 根据 pay_type 字符串动态构建支付方式 (格式: "alipay,weixin") - func setupPayTypes(_ payTypeStr: String) { - payTypeStackView.arrangedSubviews.forEach { $0.removeFromSuperview() } - let types = payTypeStr.components(separatedBy: ",").map { $0.trimmingCharacters(in: .whitespaces) } - let payTypeMap: [(String, String)] = types.compactMap { - if $0 == "weixin" { return ("wechat", "微信支付") } - if $0 == "alipay" { return ("alipay", "支付宝支付") } -// if $0 == "apple" { return ("apple", "苹果支付") } - return nil - } - guard !payTypeMap.isEmpty else { return } - - selectedPayTypeTag = 0 - for (idx, (icon, name)) in payTypeMap.enumerated() { - let isSelected = idx == 0 - let view = makePayTypeView(tag: idx, icon: icon, name: name, isSelected: isSelected) - view.layoutChain.width(110).height(22) - payTypeStackView.addArrangedSubview(view) - } - } - - private func makePayTypeView(tag: Int, icon: String, name: String, isSelected: Bool) -> UIView { - let view = UIView() - view.tag = tag - view.isUserInteractionEnabled = true - - let checkbox = UIImageView(image: UIImage(named: isSelected ? "VipRecharge/checkbox_on" : "VipRecharge/checkbox")) - checkbox.contentMode = .scaleAspectFit - checkbox.tag = 100 - view.addSubview(checkbox) - checkbox.layoutChain.left().centerY().width(18).height(18) - - let payIcon = UIImageView(image: UIImage(named: "VipRecharge/\(icon)")) - payIcon.contentMode = .scaleAspectFit - view.addSubview(payIcon) - payIcon.layoutChain.leftToRightOfView(checkbox, offset: 8).centerY().width(22).height(22) - - let nameLab = UILabel() - nameLab.text = name - nameLab.font = .systemFont(ofSize: 14, weight: .medium) - nameLab.textColor = UIColor(hexStr: "#1A1A1A") - view.addSubview(nameLab) - nameLab.layoutChain.leftToRightOfView(payIcon, offset: 6).centerY() - - let tap = UITapGestureRecognizer(target: self, action: #selector(onPayTypeTap(_:))) - view.addGestureRecognizer(tap) - return view - } - - @objc private func onPayTypeTap(_ gesture: UITapGestureRecognizer) { - guard let tag = gesture.view?.tag, tag != selectedPayTypeTag else { return } - selectedPayTypeTag = tag - for view in payTypeStackView.arrangedSubviews { - let isSelected = view.tag == tag - if let checkbox = view.viewWithTag(100) as? UIImageView { - checkbox.image = UIImage(named: isSelected ? "VipRecharge/checkbox_on" : "VipRecharge/checkbox") - } - } - } - - lazy var bottomView: UIView = { - let view = UIView() - view.backgroundColor = .white - view.layer.shadowColor = UIColor.black.cgColor - view.layer.shadowOffset = CGSize(width: 0, height: -3) - view.layer.shadowOpacity = 0.06 - return view - }() - - lazy var payBtnView: UIView = { - let view = UIView() - view.backgroundColor = .clear - - let bgImg = UIImageView() - bgImg.image = UIImage(named: "VipRecharge/pay_bg") - view.addSubview(bgImg) - bgImg.layoutChain.edges() - - let unlockLab = UILabel() - unlockLab.text = "解锁会员" - unlockLab.font = .systemFont(ofSize: 16, weight: .heavy) - unlockLab.textColor = .white - view.addSubview(unlockLab) - unlockLab.layoutChain.right(21).centerY() - - return view - }() - - lazy var payPriceView: UIView = { - let view = UIView() - view.backgroundColor = .clear - - let titleLab = UILabel() - titleLab.text = "合计" - titleLab.font = .systemFont(ofSize: 14, weight: .bold) - titleLab.textColor = UIColor(hexStr: "#1A1A1A") - view.addSubview(titleLab) - titleLab.layoutChain - .left() - .bottom() - - let symbolLab = UILabel() - symbolLab.text = "¥" - symbolLab.font = .systemFont(ofSize: 12, weight: .heavy) - symbolLab.textColor = UIColor(hexStr: "#FF3B05") - view.addSubview(symbolLab) - symbolLab.layoutChain - .leftToRightOfView(titleLab) - .bottomToView(titleLab) - - view.addSubview(priceLab) - priceLab.layoutChain - .leftToRightOfView(symbolLab) - .bottomToView(titleLab, offset: 3) - - view.addSubview(discountLab) - discountLab.layoutChain - .leftToRightOfView(priceLab, offset: 5) - .bottomToView(titleLab) - .right() - - return view - }() - - lazy var priceLab: UILabel = { - let label = UILabel() - label.text = "0" - label.font = .systemFont(ofSize: 24, weight: .heavy) - label.textColor = UIColor(hexStr: "#FF3B05") - return label - }() - - /// 数字翻滚动画 — 每位数字独立向上或向下滚动 - func animatePrice(to newValue: String) { - guard let target = Double(newValue) else { - priceLab.text = newValue - return - } - let current = Double(priceLab.text ?? "0") ?? 0 - let diff = target - current - let duration = 0.6 - let steps = 30 - var step = 0 - - Timer.scheduledTimer(withTimeInterval: duration / Double(steps), repeats: true) { [weak self] t in - step += 1 - guard let self = self else { t.invalidate(); return } - if step >= steps { - t.invalidate() - self.priceLab.text = newValue - } else { - let progress = Double(step) / Double(steps) - // ease out + overshoot on increase - let eased = diff > 0 - ? 1 - pow(1 - progress, 3) - : pow(progress, 0.5) - let value = current + diff * eased - self.priceLab.text = String(format: "%.0f", value) - } - } - } - - lazy var discountLab: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 14, weight: .bold) - label.textColor = UIColor(hexStr: "#1A1A1A") - return label - }() - - override func layoutSubviews() { - super.layoutSubviews() - cornerView.setNeedsLayout() - cornerView.layoutIfNeeded() - cornerView.setCornerRadius(corners: [.topLeft, .topRight], withCornerRadii: CGSize(width: 10, height: 10)) - - vipRightsDetailView.setNeedsLayout() - vipRightsDetailView.layoutIfNeeded() - vipRightsDetailView.setCornerRadius(corners: [.topLeft, .bottomLeft], withCornerRadii: CGSize(width: 6, height: 6)) - } - - override init(frame: CGRect) { - super.init(frame: .zero) - backgroundColor = .white - setupUI() - setupRx() - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} - -// MARK: - UIScrollViewDelegate -extension VipRechargeView: UIScrollViewDelegate { - func scrollViewDidScroll(_ scrollView: UIScrollView) { - let maxY = scrollView.contentOffset.y - let alpha = maxY / (kNaviHeight / 2) - navView.alpha = alpha < 0.0 ? 0.0 : alpha - } -} - -// MARK: - ExpenseCell -final class ExpenseCell: UICollectionViewCell { - - private let tagBadgeView: UIView = { - let iv = UIView() -// iv.image = UIImage(named: "VipRecharge/expense_tips") -// iv.contentMode = .scaleAspectFill - iv.backgroundColor = UIColor(hexStr: "#FF6643") - iv.isHidden = true - return iv - }() - - private let tagLabel: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 10, weight: .bold) - label.textColor = .white - label.textAlignment = .center - return label - }() - - private let bgImgView: UIImageView = { - let iv = UIImageView() - iv.image = UIImage(named: "VipRecharge/expense") - iv.contentMode = .scaleAspectFill - return iv - }() - - private let titleLab: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 14, weight: .bold) - label.textColor = UIColor(hexStr: "#1A1A1A") - label.textAlignment = .center - return label - }() - - lazy var priceLab: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 12, weight: .bold) - label.textColor = UIColor(hexStr: "#1A1A1A") - label.textAlignment = .center - return label - }() - - lazy var originPriceLab: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 12, weight: .bold) - label.textColor = UIColor(hexStr: "#767676") - label.textAlignment = .center - return label - }() - - lazy var tipsLab: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 10, weight: .bold) - label.textColor = UIColor(hexStr: "#1A1A1A") - label.textAlignment = .center - return label - }() - - override init(frame: CGRect) { - super.init(frame: frame) - contentView.addSubview(bgImgView) - contentView.addSubview(tagBadgeView) - tagBadgeView.addSubview(tagLabel) - contentView.addSubview(titleLab) - contentView.addSubview(priceLab) - contentView.addSubview(originPriceLab) - contentView.addSubview(tipsLab) - - tagBadgeView.layoutChain - .top().left() - - tagLabel.layoutChain - .edgesHorzontal(10) - .edgesVertical(3) - - bgImgView.layoutChain - .top(10) - .left().right().bottom() - - titleLab.layoutChain - .centerX() - .top(30) - .edgesHorzontal(2) - - priceLab.layoutChain - .centerY() - .edgesHorzontal(2) - - originPriceLab.layoutChain - .topToBottomOfView(priceLab, offset: 5) - .edgesHorzontal(2) - - tipsLab.layoutChain - .edgesHorzontal(2) - .bottom(7) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - func configure(model: VipExpenseModel, isSelected: Bool) { - titleLab.text = model.goods_name - tagBadgeView.isHidden = model.tips.isEmpty - tagLabel.text = model.tips - tipsLab.text = model.tips2 - let priceAttr = NSMutableAttributedString(string: "¥", attributes: [.font: UIFont.systemFont(ofSize: 12, weight: .medium)]) - priceAttr.append(NSAttributedString(string: model.price, attributes: [.font: UIFont.systemFont(ofSize: 30, weight: .medium)])) - priceAttr.append(NSAttributedString(string: model.unit, attributes: [.font: UIFont.systemFont(ofSize: 12, weight: .medium)])) - priceLab.attributedText = priceAttr - originPriceLab.text = "¥" + model.origin_price - originPriceLab.setupStrikethroughStyle() - setSelected(isSelected, animated: false) - } - - func setSelected(_ selected: Bool, animated: Bool) { - let scale: CGFloat = selected ? 1.1 : 1.0 - let imageName = selected ? "VipRecharge/expense_on" : "VipRecharge/expense" - bgImgView.image = UIImage(named: imageName) - titleLab.textColor = selected ? UIColor(hexStr: "#16B3FF") : UIColor(hexStr: "#1A1A1A") - priceLab.textColor = selected ? UIColor(hexStr: "#FF4F44") : UIColor(hexStr: "#1A1A1A") - - let animations = { - self.transform = CGAffineTransform(scaleX: scale, y: scale) - } - if animated { - UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseOut, animations: animations) - } else { - animations() - } - } - - override func layoutSubviews() { - super.layoutSubviews() - tagBadgeView.setNeedsLayout() - tagBadgeView.layoutIfNeeded() - tagBadgeView.setCornerRadius(corners: [.topLeft, .bottomRight], withCornerRadii: CGSize(width: 10, height: 10)) - } -} - -// MARK: - ExpenseCell -final class VipRightsCell: UICollectionViewCell { - - func configure(_ model: VipRightsModel) { - iconView.image = UIImage(named: model.icon) - titleLabel.text = model.title - } - - private let titleLabel: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 12, weight: .medium) - label.textColor = ThemeManager.shared.color.titleAuxColor - label.textAlignment = .center - return label - }() - - private let iconView: UIImageView = { - let iv = UIImageView() - iv.contentMode = .scaleAspectFill - return iv - }() - - override init(frame: CGRect) { - super.init(frame: frame) - contentView.addSubview(titleLabel) - contentView.addSubview(iconView) - - iconView.layoutChain - .top().centerX() - .width(40) - .height(40) - - titleLabel.layoutChain - .edgesHorzontal() - .bottom() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} - - diff --git a/QuickLocation/Section/VipRecharge/VipRightsVC.swift b/QuickLocation/Section/VipRecharge/VipRightsVC.swift deleted file mode 100644 index e83b8695..00000000 --- a/QuickLocation/Section/VipRecharge/VipRightsVC.swift +++ /dev/null @@ -1,105 +0,0 @@ -// -// VipRightsVC.swift -// QuickLocation -// -// Created by 八条 on 2026/6/4. -// - -import UIKit -import RxSwift -import RxCocoa - -class VipRightsVC: BaseViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - // Do any additional setup after loading the view. - setupUI() - setupRx() - } - - private func setupRx() { - } - - private func setupUI() { - view.addSubview(bgImgView) - view.addSubview(scrollView) - view.addSubview(headerBgImg) - view.addSubview(scrollView) - scrollView.addSubview(scrollContentView) - scrollContentView.addSubview(logoImg) - scrollContentView.addSubview(detailImg) - - view.addSubview(navView) - - navView.layoutChain - .edges(excludingEdge: .bottom) - .height(kNaviHeight) - - bgImgView.layoutChain.edges() - - headerBgImg.layoutChain - .edges(excludingEdge: .bottom) - .heightToWidth(233/375) - - scrollView.layoutChain - .topToBottomOfView(navView) - .edges(excludingEdge: .top) - - scrollContentView.layoutChain - .edges() - .widthToView(scrollView) - - logoImg.layoutChain - .top() - .left(9) - .width(337).height(126) - - detailImg.layoutChain - .topToBottomOfView(logoImg, offset: 40) - .edgesHorzontal(15) - .bottom(kSafeBottomMargin + 34) - .heightToWidth(1081/345) - } - - lazy var navView = BaseNavigationView(title: "会员权益") - - lazy var bgImgView: UIImageView = { - let view = UIImageView(image: UIImage(named: "VipRights/bg")) - view.contentMode = .scaleAspectFill - return view - }() - - lazy var scrollView: UIScrollView = { - let view = UIScrollView() - view.backgroundColor = .clear - view.showsVerticalScrollIndicator = false - view.bounces = false - return view - }() - - lazy var scrollContentView: UIView = { - let view = UIView() - view.backgroundColor = .clear - return view - }() - - lazy var headerBgImg: UIImageView = { - let view = UIImageView(image: UIImage(named: "VipRights/header_bg")) - view.contentMode = .scaleAspectFill - return view - }() - - lazy var logoImg: UIImageView = { - let view = UIImageView(image: UIImage(named: "VipRights/logo")) - view.contentMode = .scaleAspectFill - return view - }() - - lazy var detailImg: UIImageView = { - let view = UIImageView(image: UIImage(named: "VipRights/detail")) - view.contentMode = .scaleAspectFill - return view - }() -} diff --git a/QuickLocation/Section/VipRecharge/VipWaivePopView.swift b/QuickLocation/Section/VipRecharge/VipWaivePopView.swift deleted file mode 100644 index 841a761d..00000000 --- a/QuickLocation/Section/VipRecharge/VipWaivePopView.swift +++ /dev/null @@ -1,148 +0,0 @@ -// -// VipWaivePopView.swift -// QuickLocation -// -// Created by 八条 on 2026/6/4. -// - -import UIKit -import RxSwift -import RxCocoa - -class VipWaivePopView: UIView { - - private static let shared = VipWaivePopView(frame: CGRect(origin: .zero, size: kScreenSize)) - - var disposeBag = DisposeBag() - - static func show() { - guard let superView = kKeyWindow else { - return - } - - if VipWaivePopView.shared.superview != nil { - VipWaivePopView.shared.removeFromSuperview() - VipWaivePopView.shared.bgView.frame = .zero - } - VipWaivePopView.shared.bgView.alpha = 1 - VipWaivePopView.shared.bgView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight) - superView.addSubview(VipWaivePopView.shared) - superView.bringSubviewToFront(VipWaivePopView.shared) - - UIView.animate(withDuration: 0.25) { - VipWaivePopView.shared.bgView.alpha = 1 - } - } - - /// 关闭 - static func dismiss() { - guard VipWaivePopView.shared.superview != nil else { return } - - UIView.animate(withDuration: 0.25, delay: 0, options: [.curveEaseIn]) { - VipWaivePopView.shared.bgView.alpha = 0 - } completion: { _ in - VipWaivePopView.shared.removeFromSuperview() - } - } - - private func setupRx() { - confirmBtn.rx.tap.subscribe(onNext: { _ in - VipWaivePopView.dismiss() - - }).disposed(by: disposeBag) - - closeBtn.rx.tap.subscribe(onNext: { _ in - VipWaivePopView.dismiss() - AppRouter.shared.popOrDismiss() - }).disposed(by: disposeBag) - } - - private lazy var bgView: UIView = { - let view = UIView() - view.backgroundColor = .black.withAlphaComponent(0.5) - return view - }() - - lazy var popView: UIView = { - let view = UIView() - view.backgroundColor = .clear - return view - }() - - lazy var bgImgView: UIImageView = { - let view = UIImageView() - view.image = UIImage(named: "VipRecharge/waive_bg") - view.contentMode = .scaleAspectFill - return view - }() - - lazy var confirmBtn: UIButton = { - let btn = UIButton(type: .custom) - btn.setTitle("确认开通", for: .normal) - btn.setTitleColor(.white, for: .normal) - btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .bold) -// btn.backgroundColor = UIColor(hexStr: "#00ADFE") -// btn.setBackgroundImage(UIImage(named: "Common/gradient_bg"), for: .normal) - btn.cornerRadius = 25 - return btn - }() - - lazy var closeBtn: UIButton = { - let btn = UIButton(type: .custom) - btn.setTitle("残忍放弃", for: .normal) - btn.setTitleColor(UIColor(hexStr: "#00ADFE"), for: .normal) - btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) - btn.backgroundColor = .white - btn.borderWidth = 1 - btn.borderColor = UIColor(hexStr: "#00ADFE") - btn.cornerRadius = 25 - return btn - }() - - // MARK: - Init - override init(frame: CGRect) { - super.init(frame: frame) - backgroundColor = .clear - addSubview(bgView) - bgView.addSubview(popView) - popView.addSubview(bgImgView) - popView.addSubview(confirmBtn) - popView.addSubview(closeBtn) - - popView.layoutChain - .centerY() - .edgesHorzontal(30) - .heightToWidth(389/315) - - bgImgView.layoutChain.edges() - - closeBtn.layoutChain - .left(18) - .bottom(18) - .width(100) - .height(50) - - confirmBtn.layoutChain - .topToView(closeBtn) - .leftToRightOfView(closeBtn, offset: 19) - .right(18) - .height(50) - - setupRx() - self.layoutIfNeeded() - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func layoutSubviews() { - super.layoutSubviews() - popView.layoutIfNeeded() - confirmBtn.setGradientLayer(frame: confirmBtn.bounds, - startPoint: CGPoint(x: 0.5, y: 0.5), - endPoint: CGPoint(x: 1, y: 0), - colors: [UIColor(hexStr: "#00ADFE"), UIColor(hexStr: "#46C8FF")], - locations: [0.1, 1]) - } -} diff --git a/QuickLocation/Service/OrderService.swift b/QuickLocation/Service/OrderService.swift index a62a369d..c5479dbb 100644 --- a/QuickLocation/Service/OrderService.swift +++ b/QuickLocation/Service/OrderService.swift @@ -11,15 +11,15 @@ import Moya struct OrderService { static let disposeBag = DisposeBag() - /// 充值内容 - /// - Parameters: - /// - type: 类型 member - static func rechargeInfo(type: String) -> Observable { - let api = OrderAPI.rechargeInfo(type: type).multiTarget - return APIProvider.request(token: api) - .map(VipExpenseResponse.self) - .asObservable() - } +// /// 充值内容 +// /// - Parameters: +// /// - type: 类型 member +// static func rechargeInfo(type: String) -> Observable { +// let api = OrderAPI.rechargeInfo(type: type).multiTarget +// return APIProvider.request(token: api) +// .map(VipExpenseResponse.self) +// .asObservable() +// } /// 支付参数 /// - Parameters: diff --git a/QuickLocation/Service/UserService.swift b/QuickLocation/Service/UserService.swift index 5fd5e4fd..d604f8bb 100644 --- a/QuickLocation/Service/UserService.swift +++ b/QuickLocation/Service/UserService.swift @@ -225,6 +225,14 @@ struct UserService { .asObservable() } + /// 签到 + static func signIn(latitude: Double, longitude: Double, address: String) -> Observable { + let api = UserAPI.signIn(latitude: latitude, longitude: longitude, address: address).multiTarget + return APIProvider.request(token: api) + .map(ResponseModel.self) + .asObservable() + } + /// 更换手机 static func changePhone(timestamp: String, phone: String, code: String) -> Observable { let api = UserAPI.changePhone(timestamp: timestamp, phone: phone, code: code).multiTarget diff --git a/QuickLocation/UIKit/Pop/VersionUpgradePopVC.swift b/QuickLocation/UIKit/Pop/VersionUpgradePopVC.swift new file mode 100644 index 00000000..0cdc6ee3 --- /dev/null +++ b/QuickLocation/UIKit/Pop/VersionUpgradePopVC.swift @@ -0,0 +1,364 @@ +// +// VersionUpgradePopVC.swift +// QuickLocation +// + +import UIKit + +final class VersionUpgradePopVC: UIViewController { + + var completion: (() -> Void)? + var dismissHandler: ((VersionUpgradePopVC, @escaping () -> Void) -> Void)? + + private let upgrade: VersionUpgradeModel + private var isOpeningURL = false + private var hasFinished = false + private var contentTextViewHeightConstraint: NSLayoutConstraint? + + init(upgrade: VersionUpgradeModel) { + self.upgrade = upgrade + super.init(nibName: nil, bundle: nil) + modalPresentationStyle = .overFullScreen + modalTransitionStyle = .crossDissolve + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + setupUI() + configureContent() + } + + func showAnimated() { + view.layoutIfNeeded() + dimmingView.alpha = 0 + popupContainerView.alpha = 0 + popupContainerView.transform = CGAffineTransform(scaleX: 0.94, y: 0.94) + UIView.animate(withDuration: 0.25, delay: 0, options: [.curveEaseOut]) { + self.dimmingView.alpha = 1 + self.popupContainerView.alpha = 1 + self.popupContainerView.transform = .identity + } + } + + private func setupUI() { + view.backgroundColor = .clear + + view.addSubview(dimmingView) + dimmingView.translatesAutoresizingMaskIntoConstraints = false + + if !upgrade.force { + dimmingView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(cancelUpgrade))) + } + + view.addSubview(popupContainerView) + popupContainerView.addSubview(cardView) + popupContainerView.addSubview(headerImageView) + popupContainerView.addSubview(cancelButton) + cardView.addSubview(contentTextView) + cardView.addSubview(upgradeButton) + + [popupContainerView, cardView, headerImageView, cancelButton, contentTextView, upgradeButton].forEach { + $0.translatesAutoresizingMaskIntoConstraints = false + } + + let contentTextViewHeightConstraint = contentTextView.heightAnchor.constraint(equalToConstant: 96) + self.contentTextViewHeightConstraint = contentTextViewHeightConstraint + + NSLayoutConstraint.activate([ + dimmingView.topAnchor.constraint(equalTo: view.topAnchor), + dimmingView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + dimmingView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + dimmingView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + + popupContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor), + popupContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor), + popupContainerView.widthAnchor.constraint(equalToConstant: 325), + popupContainerView.leadingAnchor.constraint(greaterThanOrEqualTo: view.leadingAnchor, constant: 20), + popupContainerView.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor, constant: -20), + + headerImageView.topAnchor.constraint(equalTo: popupContainerView.topAnchor), + headerImageView.leadingAnchor.constraint(equalTo: cardView.leadingAnchor), + headerImageView.widthAnchor.constraint(equalTo: cardView.widthAnchor, constant: 10), + headerImageView.heightAnchor.constraint(equalTo: headerImageView.widthAnchor, multiplier: 132 / 325), + + cardView.topAnchor.constraint(equalTo: popupContainerView.topAnchor, constant: 88), + cardView.centerXAnchor.constraint(equalTo: popupContainerView.centerXAnchor), + cardView.widthAnchor.constraint(equalToConstant: 315), + + contentTextView.topAnchor.constraint(equalTo: cardView.topAnchor, constant: 40), + contentTextView.leadingAnchor.constraint(equalTo: cardView.leadingAnchor, constant: 20), + contentTextView.trailingAnchor.constraint(equalTo: cardView.trailingAnchor, constant: -20), + contentTextViewHeightConstraint, + + upgradeButton.topAnchor.constraint(equalTo: contentTextView.bottomAnchor, constant: 28), + upgradeButton.leadingAnchor.constraint(equalTo: contentTextView.leadingAnchor), + upgradeButton.trailingAnchor.constraint(equalTo: contentTextView.trailingAnchor), + upgradeButton.heightAnchor.constraint(equalToConstant: 50), + upgradeButton.bottomAnchor.constraint(equalTo: cardView.bottomAnchor, constant: -20), + + cancelButton.topAnchor.constraint(equalTo: cardView.bottomAnchor, constant: 14), + cancelButton.centerXAnchor.constraint(equalTo: popupContainerView.centerXAnchor), + cancelButton.heightAnchor.constraint(equalToConstant: 28), + cancelButton.widthAnchor.constraint(greaterThanOrEqualToConstant: 80), + cancelButton.bottomAnchor.constraint(equalTo: popupContainerView.bottomAnchor) + ]) + } + + private func configureContent() { + cancelButton.isHidden = upgrade.force + + let title = upgrade.title + upgrade.version + let description = upgrade.description + let content = NSMutableAttributedString() + + if !title.isEmpty { + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineSpacing = 3 + content.append(NSAttributedString( + string: title, + attributes: [ + .font: UIFont.systemFont(ofSize: 15, weight: .medium), + .foregroundColor: UIColor(hexStr: "#273246"), + .paragraphStyle: paragraphStyle + ] + )) + } + + if !description.isEmpty { + if !content.string.isEmpty { + content.append(NSAttributedString(string: "\n")) + } + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineSpacing = 5 + content.append(NSAttributedString( + string: description, + attributes: [ + .font: UIFont.systemFont(ofSize: 15, weight: .regular), + .foregroundColor: UIColor(hexStr: "#273246"), + .paragraphStyle: paragraphStyle + ] + )) + } + + contentTextView.attributedText = content + contentTextView.setContentOffset(.zero, animated: false) + let fittingSize = contentTextView.sizeThatFits( + CGSize(width: 275, height: CGFloat.greatestFiniteMagnitude) + ) + contentTextViewHeightConstraint?.constant = max(96, ceil(fittingSize.height)) + } + + @objc private func openUpgradeURL() { + guard !isOpeningURL else { return } + let urlString = upgrade.url.trimmingCharacters(in: .whitespacesAndNewlines) + guard let url = URL(string: urlString), + let scheme = url.scheme, + !scheme.isEmpty else { + DLToast.show(text: "下载地址不可用") + return + } + + isOpeningURL = true + UIApplication.shared.open(url, options: [:]) { [weak self] opened in + DispatchQueue.main.async { + guard let self else { return } + self.isOpeningURL = false + guard opened else { + DLToast.show(text: "下载地址不可用") + return + } + if !self.upgrade.force { + self.finishUpgrade() + } + } + } + } + + @objc private func cancelUpgrade() { + guard !upgrade.force else { return } + finishUpgrade() + } + + private func finishUpgrade() { + guard !hasFinished else { return } + hasFinished = true + let finish = { [weak self] in + guard let self else { return } + let completion = self.completion + self.completion = nil + completion?() + } + guard let dismissHandler else { + dismiss(animated: true, completion: finish) + return + } + dismissHandler(self, finish) + } + + private lazy var dimmingView: UIView = { + let view = UIView() + view.backgroundColor = UIColor.black.withAlphaComponent(0.68) + return view + }() + + private let popupContainerView = UIView() + + private lazy var cardView: UIView = { + let cardView = UIView() + cardView.backgroundColor = .white + cardView.layer.cornerRadius = 36 + cardView.layer.masksToBounds = true + return cardView + }() + + private lazy var headerImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "VersionUpgrade/header")) + imageView.contentMode = .scaleAspectFit + return imageView + }() + + private lazy var contentTextView: UITextView = { + let textView = UITextView() + textView.backgroundColor = UIColor(hexStr: "#F0FAFF") + textView.layer.cornerRadius = 26 + textView.layer.masksToBounds = true + textView.isEditable = false + textView.isSelectable = false + textView.isScrollEnabled = false + textView.showsVerticalScrollIndicator = false + textView.textContainerInset = UIEdgeInsets(top: 15, left: 35, bottom: 15, right: 35) + textView.textContainer.lineFragmentPadding = 0 + return textView + }() + + private lazy var upgradeButton: VersionUpgradeGradientButton = { + let button = VersionUpgradeGradientButton(type: .custom) + button.setTitle("立即体验", for: .normal) + button.setTitleColor(.white, for: .normal) + button.titleLabel?.font = .systemFont(ofSize: 18, weight: .medium) + button.addTarget(self, action: #selector(openUpgradeURL), for: .touchUpInside) + return button + }() + + private lazy var cancelButton: UIButton = { + let button = UIButton(type: .custom) + button.setTitle("取消", for: .normal) + button.setTitleColor(.white, for: .normal) + button.titleLabel?.font = .systemFont(ofSize: 17, weight: .regular) + button.addTarget(self, action: #selector(cancelUpgrade), for: .touchUpInside) + return button + }() +} + +private final class VersionUpgradeGradientButton: UIButton { + + private let gradientLayer = CAGradientLayer() + + override init(frame: CGRect) { + super.init(frame: frame) + gradientLayer.colors = [ + UIColor(hexStr: "#08B5FF").cgColor, + UIColor(hexStr: "#48C7FF").cgColor + ] + gradientLayer.startPoint = CGPoint(x: 0, y: 0.5) + gradientLayer.endPoint = CGPoint(x: 1, y: 0.5) + layer.insertSublayer(gradientLayer, at: 0) + layer.masksToBounds = true + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + gradientLayer.frame = bounds + layer.cornerRadius = 16 + } +} + +extension UIViewController { + + func showVersionUpgradePop( + upgrade: VersionUpgradeModel, + completion: (() -> Void)? = nil + ) { + VersionUpgradeWindowPresenter.show( + upgrade: upgrade, + preferredScene: viewIfLoaded?.window?.windowScene, + completion: completion + ) + } +} + +private enum VersionUpgradeWindowPresenter { + + private static var hostWindow: UIWindow? + private static weak var previousKeyWindow: UIWindow? + + static func show( + upgrade: VersionUpgradeModel, + preferredScene: UIWindowScene?, + completion: (() -> Void)? + ) { + let showBlock = { + guard hostWindow == nil, + let windowScene = preferredScene ?? activeWindowScene() else { return } + + previousKeyWindow = windowScene.windows.first { $0.isKeyWindow } + + let viewController = VersionUpgradePopVC(upgrade: upgrade) + viewController.completion = completion + viewController.dismissHandler = { viewController, finish in + dismiss(viewController, finish: finish) + } + + let window = UIWindow(windowScene: windowScene) + window.frame = windowScene.coordinateSpace.bounds + window.windowLevel = .alert + 1 + window.backgroundColor = .clear + window.rootViewController = viewController + hostWindow = window + window.makeKeyAndVisible() + viewController.showAnimated() + } + + if Thread.isMainThread { + showBlock() + } else { + DispatchQueue.main.async(execute: showBlock) + } + } + + private static func dismiss( + _ viewController: VersionUpgradePopVC, + finish: @escaping () -> Void + ) { + guard hostWindow?.rootViewController === viewController else { + finish() + return + } + + UIView.animate(withDuration: 0.2, delay: 0, options: [.curveEaseIn]) { + viewController.view.alpha = 0 + } completion: { _ in + hostWindow?.isHidden = true + hostWindow?.rootViewController = nil + hostWindow = nil + previousKeyWindow?.makeKey() + previousKeyWindow = nil + finish() + } + } + + private static func activeWindowScene() -> UIWindowScene? { + let scenes = UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene } + return scenes.first { $0.activationState == .foregroundActive } + ?? scenes.first { $0.activationState == .foregroundInactive } + ?? scenes.first + } +}