Keep Delete

This commit is contained in:
edwinQQQ
2025-10-17 14:03:50 +08:00
parent dde7c934ad
commit 22185d799e
103 changed files with 85 additions and 5960 deletions

View File

@@ -7,9 +7,6 @@ project 'YuMi.xcodeproj'
target 'YuMi' do
use_frameworks!
# 滑动标签栏
pod 'JXCategoryView'
pod 'JXPagingView/Pager'
#模型转化
pod 'MJExtension', '3.4.2'
#图片加载
@@ -19,8 +16,7 @@ target 'YuMi' do
pod 'SDWebImageFLPlugin' # 对FLAnimatedImage和SDWebImage的桥接
pod 'AFNetworking'
#文字自动滚动
pod 'MarqueeLabel'
pod 'YYText'
pod 'Masonry'
#输入
pod 'SZTextView'

View File

@@ -19,9 +19,6 @@ PODS:
- FLAnimatedImage (1.0.17)
- GKCycleScrollView (1.2.3)
- IQKeyboardManager (6.5.19)
- JXCategoryView (1.6.8)
- JXPagingView/Pager (2.1.3)
- MarqueeLabel (4.5.3)
- Masonry (1.1.0)
- MBProgressHUD (1.2.0)
- MJExtension (3.4.2)
@@ -60,7 +57,6 @@ PODS:
- YYImage (1.0.4):
- YYImage/Core (= 1.0.4)
- YYImage/Core (1.0.4)
- YYText (1.0.7)
- YYWebImage (1.0.5):
- YYCache
- YYImage
@@ -73,9 +69,6 @@ DEPENDENCIES:
- FLAnimatedImage
- GKCycleScrollView
- IQKeyboardManager
- JXCategoryView
- JXPagingView/Pager
- MarqueeLabel
- Masonry
- MBProgressHUD
- MJExtension (= 3.4.2)
@@ -93,7 +86,6 @@ DEPENDENCIES:
- TYCyclePagerView
- TZImagePickerController
- YuMi (from `yum`)
- YYText
- YYWebImage
- ZLCollectionViewFlowLayout
@@ -105,9 +97,6 @@ SPEC REPOS:
- FLAnimatedImage
- GKCycleScrollView
- IQKeyboardManager
- JXCategoryView
- JXPagingView
- MarqueeLabel
- Masonry
- MBProgressHUD
- MJExtension
@@ -128,7 +117,6 @@ SPEC REPOS:
- TZImagePickerController
- YYCache
- YYImage
- YYText
- YYWebImage
- ZLCollectionViewFlowLayout
@@ -143,9 +131,6 @@ SPEC CHECKSUMS:
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
GKCycleScrollView: 8ed79d2142e62895a701973358b6f94b661b4829
IQKeyboardManager: c8665b3396bd0b79402b4c573eac345a31c7d485
JXCategoryView: 262d503acea0b1278c79a1c25b7332ffaef4d518
JXPagingView: afdd2e9af09c90160dd232b970d603cc6e7ddd0e
MarqueeLabel: 0c57d4c6634e04a6d015af79f7c9a175b2309525
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
MBProgressHUD: 3ee5efcc380f6a79a7cc9b363dd669c5e1ae7406
MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8
@@ -167,10 +152,9 @@ SPEC CHECKSUMS:
YuMi: 6c5f00f1eccbcea3304feae03cbe659025fdb9cb
YYCache: 8105b6638f5e849296c71f331ff83891a4942952
YYImage: 1e1b62a9997399593e4b9c4ecfbbabbf1d3f3b54
YYText: 5c461d709e24d55a182d1441c41dc639a18a4849
YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928
ZLCollectionViewFlowLayout: c99024652ce9f0c57d33ab53052c9b85e4a936b7
PODFILE CHECKSUM: 377abda18823bc4a29b1f0df9b0b4e424bd6f61c
PODFILE CHECKSUM: 6c65b83f79bba5e0d4aa83b16b51554490a0376c
COCOAPODS: 1.16.2

View File

@@ -32,13 +32,9 @@
189DD76226E60DDC00AB55B1 /* Api+Login.m in Sources */ = {isa = PBXBuildFile; fileRef = 189DD76126E60DDC00AB55B1 /* Api+Login.m */; };
18E7B1B726E8B2D10064BC9B /* Api+Main.m in Sources */ = {isa = PBXBuildFile; fileRef = 18E7B1B626E8B2D10064BC9B /* Api+Main.m */; };
18E7B31826F097E00064BC9B /* UserInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 18E7B31726F097E00064BC9B /* UserInfoModel.m */; };
18E7B31B26F0982E0064BC9B /* UserExpand.m in Sources */ = {isa = PBXBuildFile; fileRef = 18E7B31A26F0982E0064BC9B /* UserExpand.m */; };
18E7B31E26F0984C0064BC9B /* UserLevelVo.m in Sources */ = {isa = PBXBuildFile; fileRef = 18E7B31D26F0984C0064BC9B /* UserLevelVo.m */; };
18E7B32126F098650064BC9B /* UserInfoSkillVo.m in Sources */ = {isa = PBXBuildFile; fileRef = 18E7B32026F098650064BC9B /* UserInfoSkillVo.m */; };
23116B0B2BDB8FDC00F7F97A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 2368ECD72BC38FED00EDF4C9 /* PrivacyInfo.xcprivacy */; };
232EBBFF2BD7A25500E8CEAD /* MSParamsDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 232EBBFE2BD7A25500E8CEAD /* MSParamsDecode.m */; };
2331C1BD2A60F69E00E1D940 /* UILabel+Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = 2331C1BC2A60F69E00E1D940 /* UILabel+Utils.m */; };
234D821E2AEC57CF0022EFEB /* YYTextAsyncLayer+PITextAsyncLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 234D821D2AEC57CF0022EFEB /* YYTextAsyncLayer+PITextAsyncLayer.m */; };
235A45232B04BEB6009753F5 /* PIBaseModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 235A45222B04BEB6009753F5 /* PIBaseModel.m */; };
2368ECCF2BC38F9800EDF4C9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2368ECCD2BC38F9800EDF4C9 /* InfoPlist.strings */; };
2368ECD32BC38FDA00EDF4C9 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2368ECD52BC38FDA00EDF4C9 /* Launch Screen.storyboard */; };
@@ -78,7 +74,6 @@
23CEFC632AFB8FC100576D89 /* BSRealTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23CEFC442AFB8FC100576D89 /* BSRealTextView.m */; };
23CEFC642AFB8FC100576D89 /* BSkObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 23CEFC472AFB8FC100576D89 /* BSkObject.m */; };
23CEFC652AFB8FC100576D89 /* BSDrawLine.m in Sources */ = {isa = PBXBuildFile; fileRef = 23CEFC482AFB8FC100576D89 /* BSDrawLine.m */; };
23D8DEF22AC5633300644637 /* PIIAPRegulate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23D8DEF12AC5633300644637 /* PIIAPRegulate.swift */; };
23E56B3C2B03564B00C8DAC9 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 23E56B3B2B03564B00C8DAC9 /* CoreTelephony.framework */; };
4C06427F2E97BD6D00BAF413 /* EPMineHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0642732E97BD6D00BAF413 /* EPMineHeaderView.m */; };
4C0642802E97BD6D00BAF413 /* EPMomentCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C06427A2E97BD6D00BAF413 /* EPMomentCell.m */; };
@@ -109,33 +104,19 @@
4CD19C8F2E9CBBC80069DAA0 /* EPLoginManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19C8B2E9CBBC80069DAA0 /* EPLoginManager.swift */; };
4CD19C912E9CBBD30069DAA0 /* EPLoginBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19C902E9CBBD30069DAA0 /* EPLoginBridge.swift */; };
4CD19C932E9CCF2C0069DAA0 /* EPLoginConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19C922E9CCF2C0069DAA0 /* EPLoginConfig.swift */; };
4CD19E722E9CDF980069DAA0 /* UIButton+MSRTL.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D692E9CDF980069DAA0 /* UIButton+MSRTL.m */; };
4CD19E772E9CDF980069DAA0 /* UITextView+MSRTL.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D732E9CDF980069DAA0 /* UITextView+MSRTL.m */; };
4CD19E782E9CDF980069DAA0 /* NSMutableAttributedString+MSRTL.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D672E9CDF980069DAA0 /* NSMutableAttributedString+MSRTL.m */; };
4CD19E7C2E9CDF980069DAA0 /* TTPopupService.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D982E9CDF980069DAA0 /* TTPopupService.m */; };
4CD19E7E2E9CDF980069DAA0 /* XNDJTDDLoadingTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DC82E9CDF980069DAA0 /* XNDJTDDLoadingTool.m */; };
4CD19E802E9CDF980069DAA0 /* TTPopup.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DA32E9CDF980069DAA0 /* TTPopup.m */; };
4CD19E812E9CDF980069DAA0 /* UIView+GradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DB62E9CDF980069DAA0 /* UIView+GradientLayer.m */; };
4CD19E822E9CDF980069DAA0 /* TTAlertMessageAttributedConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D8F2E9CDF980069DAA0 /* TTAlertMessageAttributedConfig.m */; };
4CD19E842E9CDF980069DAA0 /* XPAdvertiseView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19C992E9CDF980069DAA0 /* XPAdvertiseView.m */; };
4CD19E852E9CDF980069DAA0 /* UISwipeGestureRecognizer+MSRTL.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D6F2E9CDF980069DAA0 /* UISwipeGestureRecognizer+MSRTL.m */; };
4CD19E862E9CDF980069DAA0 /* TTAlertButtonConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D8B2E9CDF980069DAA0 /* TTAlertButtonConfig.m */; };
4CD19E882E9CDF980069DAA0 /* UIView+Corner.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DB32E9CDF980069DAA0 /* UIView+Corner.m */; };
4CD19E8D2E9CDF980069DAA0 /* NetImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DAE2E9CDF980069DAA0 /* NetImageView.m */; };
4CD19E912E9CDF980069DAA0 /* UILabel+MSRTL.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D6D2E9CDF980069DAA0 /* UILabel+MSRTL.m */; };
4CD19E922E9CDF980069DAA0 /* YYLabel+MSRTL.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D752E9CDF980069DAA0 /* YYLabel+MSRTL.m */; };
4CD19E932E9CDF980069DAA0 /* NetImageConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DAC2E9CDF980069DAA0 /* NetImageConfig.m */; };
4CD19E942E9CDF980069DAA0 /* UIButton+EnlargeTouchArea.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DA62E9CDF980069DAA0 /* UIButton+EnlargeTouchArea.m */; };
4CD19E952E9CDF980069DAA0 /* MSBaseRTLFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D632E9CDF980069DAA0 /* MSBaseRTLFlowLayout.m */; };
4CD19E982E9CDF980069DAA0 /* AdvertiseModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19C952E9CDF980069DAA0 /* AdvertiseModel.m */; };
4CD19E9B2E9CDF980069DAA0 /* XCCurrentVCStackManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DC62E9CDF980069DAA0 /* XCCurrentVCStackManager.m */; };
4CD19E9C2E9CDF980069DAA0 /* UIImage+ImageEffects.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DB92E9CDF980069DAA0 /* UIImage+ImageEffects.m */; };
4CD19E9D2E9CDF980069DAA0 /* UIImage+Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DA92E9CDF980069DAA0 /* UIImage+Utils.m */; };
4CD19E9E2E9CDF980069DAA0 /* UIImage+MSRTL.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D6B2E9CDF980069DAA0 /* UIImage+MSRTL.m */; };
4CD19EA02E9CDF980069DAA0 /* UITextField+MSRTL.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D712E9CDF980069DAA0 /* UITextField+MSRTL.m */; };
4CD19EA42E9CDF980069DAA0 /* TTPopupManagerService.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D942E9CDF980069DAA0 /* TTPopupManagerService.m */; };
4CD19EA52E9CDF980069DAA0 /* MSBaseTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D652E9CDF980069DAA0 /* MSBaseTextField.m */; };
4CD19EA62E9CDF980069DAA0 /* XPAdImageTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19C972E9CDF980069DAA0 /* XPAdImageTool.m */; };
4CD19EA82E9CDF980069DAA0 /* UIImageConstant.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DB02E9CDF980069DAA0 /* UIImageConstant.m */; };
4CD19EAE2E9CDFC30069DAA0 /* EPLoginButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19EAC2E9CDFC30069DAA0 /* EPLoginButton.swift */; };
4CD19EAF2E9CDFC30069DAA0 /* EPLoginInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19EAD2E9CDFC30069DAA0 /* EPLoginInputView.swift */; };
@@ -144,8 +125,6 @@
4CD19EB52E9D15000069DAA0 /* EPAboutUsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19EB62E9D15000069DAA0 /* EPAboutUsViewController.swift */; };
4CDF7F3F2E9E580E00113F54 /* EPEmotionColorStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDF7F3E2E9E580E00113F54 /* EPEmotionColorStorage.m */; };
4CDF7F422E9E581900113F54 /* EPEmotionColorPicker.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDF7F412E9E581900113F54 /* EPEmotionColorPicker.m */; };
4CF462D42EA10E1B005E96C0 /* XPWebViewNavView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF462D02EA10E1B005E96C0 /* XPWebViewNavView.m */; };
4CF462D52EA10E1B005E96C0 /* XPWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF462CE2EA10E1B005E96C0 /* XPWebViewController.m */; };
4CF4640B2EA12723005E96C0 /* DJDKMIMOMColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF4640A2EA12723005E96C0 /* DJDKMIMOMColor.m */; };
4CF464292EA1277C005E96C0 /* TTPopup.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF464272EA1277C005E96C0 /* TTPopup.m */; };
4CF4642A2EA1277C005E96C0 /* TTAlertConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF464112EA1277C005E96C0 /* TTAlertConfig.m */; };
@@ -157,15 +136,9 @@
4CF464302EA1277C005E96C0 /* TTNewAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF464242EA1277C005E96C0 /* TTNewAlertView.m */; };
4CF464312EA1277C005E96C0 /* TTActionSheetConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF4640D2EA1277C005E96C0 /* TTActionSheetConfig.m */; };
4CF464322EA1277C005E96C0 /* TTAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF464222EA1277C005E96C0 /* TTAlertView.m */; };
548D54202CC208FD0084A2FF /* AlbumResourcePickerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 548D541F2CC208FD0084A2FF /* AlbumResourcePickerViewController.m */; };
54B9C6EA2C9C2DDC003F1CC5 /* GuildInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 54B9C6E92C9C2DDC003F1CC5 /* GuildInfo.m */; };
54F4693B2C2A984D00A83655 /* MedalModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 54F4693A2C2A984D00A83655 /* MedalModel.m */; };
54FFD37A2C9BCB1900DE61E5 /* RelationUserVO.m in Sources */ = {isa = PBXBuildFile; fileRef = 54FFD3792C9BCB1900DE61E5 /* RelationUserVO.m */; };
73FFADDC93E195344047A2EC /* Pods_YuMi.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CACF623970097D653132D69A /* Pods_YuMi.framework */; };
9B0E1C5926E77022005D4442 /* BaseNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B0E1C5826E77022005D4442 /* BaseNavigationController.m */; };
9B2A12DE2783FEDD00CED41B /* UserVipInfoVo.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B2A12DD2783FEDD00CED41B /* UserVipInfoVo.m */; };
9B33E3CB27D85379003B0E62 /* UploadFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B33E3C927D85379003B0E62 /* UploadFile.m */; };
9BA812D228BF145700783EA7 /* ClientRedPacketModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BA812D128BF145700783EA7 /* ClientRedPacketModel.m */; };
9BA8A47527C60D9F000365A3 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9BA8A47427C60D9F000365A3 /* AudioToolbox.framework */; };
9BA8A47727C60DF7000365A3 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9BA8A47627C60DF7000365A3 /* AVFoundation.framework */; };
E8098CA7282E00920090B9F0 /* Api+Moments.m in Sources */ = {isa = PBXBuildFile; fileRef = E8098CA6282E00920090B9F0 /* Api+Moments.m */; };
@@ -181,15 +154,12 @@
E82109AD26F1C8A000FC3319 /* CountDownHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E82109AC26F1C8A000FC3319 /* CountDownHelper.m */; };
E83645A82A40AF5400E0DBE4 /* NSBundle+Localizable.m in Sources */ = {isa = PBXBuildFile; fileRef = E83645A72A40AF5400E0DBE4 /* NSBundle+Localizable.m */; };
E855515B280559FE005F293F /* NSDate+DateUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = E855515A280559FE005F293F /* NSDate+DateUtils.m */; };
E875FA8727D619820086ED04 /* ClientDataModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E875FA8627D619820086ED04 /* ClientDataModel.m */; };
E88749B6282B8FC600C3C7DB /* MomentsInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E88749B5282B8FC600C3C7DB /* MomentsInfoModel.m */; };
E88863D3278ED4C0004BCFAB /* Timestamp.m in Sources */ = {isa = PBXBuildFile; fileRef = E88863D2278ED4C0004BCFAB /* Timestamp.m */; };
E8DEC99527648FA50078CB70 /* ClientConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = E8DEC99427648FA50078CB70 /* ClientConfig.m */; };
E8E70D7E26F2F19D00F03460 /* Api+Mine.m in Sources */ = {isa = PBXBuildFile; fileRef = E8E70D7D26F2F19D00F03460 /* Api+Mine.m */; };
E8EEB8F226FC2050007C6EBA /* SDPhotoBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8EC26FC2050007C6EBA /* SDPhotoBrowser.m */; };
E8EEB8F326FC2050007C6EBA /* SDWaitingView.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8ED26FC2050007C6EBA /* SDWaitingView.m */; };
E8EEB8F426FC2050007C6EBA /* SDBrowserImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8EE26FC2050007C6EBA /* SDBrowserImageView.m */; };
E8EEB8F726FC2673007C6EBA /* UserPhoto.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8F626FC2673007C6EBA /* UserPhoto.m */; };
E8F6135C291E26BD00E12650 /* NSMutableDictionary+Saft.m in Sources */ = {isa = PBXBuildFile; fileRef = E8F6135B291E26BD00E12650 /* NSMutableDictionary+Saft.m */; };
E8F6135F291E274E00E12650 /* NSArray+Safe.m in Sources */ = {isa = PBXBuildFile; fileRef = E8F6135E291E274E00E12650 /* NSArray+Safe.m */; };
/* End PBXBuildFile section */
@@ -265,18 +235,10 @@
18E7B1B626E8B2D10064BC9B /* Api+Main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "Api+Main.m"; sourceTree = "<group>"; };
18E7B31626F097E00064BC9B /* UserInfoModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserInfoModel.h; sourceTree = "<group>"; };
18E7B31726F097E00064BC9B /* UserInfoModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserInfoModel.m; sourceTree = "<group>"; };
18E7B31926F0982E0064BC9B /* UserExpand.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserExpand.h; sourceTree = "<group>"; };
18E7B31A26F0982E0064BC9B /* UserExpand.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserExpand.m; sourceTree = "<group>"; };
18E7B31C26F0984C0064BC9B /* UserLevelVo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserLevelVo.h; sourceTree = "<group>"; };
18E7B31D26F0984C0064BC9B /* UserLevelVo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserLevelVo.m; sourceTree = "<group>"; };
18E7B31F26F098650064BC9B /* UserInfoSkillVo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserInfoSkillVo.h; sourceTree = "<group>"; };
18E7B32026F098650064BC9B /* UserInfoSkillVo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserInfoSkillVo.m; sourceTree = "<group>"; };
232EBBFD2BD7A25500E8CEAD /* MSParamsDecode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSParamsDecode.h; sourceTree = "<group>"; };
232EBBFE2BD7A25500E8CEAD /* MSParamsDecode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSParamsDecode.m; sourceTree = "<group>"; };
2331C1BB2A60F69E00E1D940 /* UILabel+Utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UILabel+Utils.h"; sourceTree = "<group>"; };
2331C1BC2A60F69E00E1D940 /* UILabel+Utils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UILabel+Utils.m"; sourceTree = "<group>"; };
234D821C2AEC57CF0022EFEB /* YYTextAsyncLayer+PITextAsyncLayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "YYTextAsyncLayer+PITextAsyncLayer.h"; path = "YuMi/Appdelegate/YYTextAsyncLayer+PITextAsyncLayer.h"; sourceTree = SOURCE_ROOT; };
234D821D2AEC57CF0022EFEB /* YYTextAsyncLayer+PITextAsyncLayer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "YYTextAsyncLayer+PITextAsyncLayer.m"; path = "YuMi/Appdelegate/YYTextAsyncLayer+PITextAsyncLayer.m"; sourceTree = SOURCE_ROOT; };
235A45212B04BEB6009753F5 /* PIBaseModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PIBaseModel.h; sourceTree = "<group>"; };
235A45222B04BEB6009753F5 /* PIBaseModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PIBaseModel.m; sourceTree = "<group>"; };
2368ECCA2BC38F6F00EDF4C9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
@@ -344,7 +306,6 @@
23CEFC472AFB8FC100576D89 /* BSkObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BSkObject.m; sourceTree = "<group>"; };
23CEFC482AFB8FC100576D89 /* BSDrawLine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BSDrawLine.m; sourceTree = "<group>"; };
23CEFC492AFB8FC100576D89 /* BSkObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BSkObject.h; sourceTree = "<group>"; };
23D8DEF12AC5633300644637 /* PIIAPRegulate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIIAPRegulate.swift; sourceTree = "<group>"; };
23E56B3B2B03564B00C8DAC9 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; };
4C0642722E97BD6D00BAF413 /* EPMineHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EPMineHeaderView.h; sourceTree = "<group>"; };
4C0642732E97BD6D00BAF413 /* EPMineHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EPMineHeaderView.m; sourceTree = "<group>"; };
@@ -387,32 +348,6 @@
4CD19C8C2E9CBBC80069DAA0 /* EPLoginService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EPLoginService.swift; sourceTree = "<group>"; };
4CD19C902E9CBBD30069DAA0 /* EPLoginBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EPLoginBridge.swift; sourceTree = "<group>"; };
4CD19C922E9CCF2C0069DAA0 /* EPLoginConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EPLoginConfig.swift; sourceTree = "<group>"; };
4CD19C942E9CDF980069DAA0 /* AdvertiseModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AdvertiseModel.h; sourceTree = "<group>"; };
4CD19C952E9CDF980069DAA0 /* AdvertiseModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AdvertiseModel.m; sourceTree = "<group>"; };
4CD19C962E9CDF980069DAA0 /* XPAdImageTool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPAdImageTool.h; sourceTree = "<group>"; };
4CD19C972E9CDF980069DAA0 /* XPAdImageTool.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPAdImageTool.m; sourceTree = "<group>"; };
4CD19C982E9CDF980069DAA0 /* XPAdvertiseView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPAdvertiseView.h; sourceTree = "<group>"; };
4CD19C992E9CDF980069DAA0 /* XPAdvertiseView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPAdvertiseView.m; sourceTree = "<group>"; };
4CD19D622E9CDF980069DAA0 /* MSBaseRTLFlowLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSBaseRTLFlowLayout.h; sourceTree = "<group>"; };
4CD19D632E9CDF980069DAA0 /* MSBaseRTLFlowLayout.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSBaseRTLFlowLayout.m; sourceTree = "<group>"; };
4CD19D642E9CDF980069DAA0 /* MSBaseTextField.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSBaseTextField.h; sourceTree = "<group>"; };
4CD19D652E9CDF980069DAA0 /* MSBaseTextField.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSBaseTextField.m; sourceTree = "<group>"; };
4CD19D662E9CDF980069DAA0 /* NSMutableAttributedString+MSRTL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSMutableAttributedString+MSRTL.h"; sourceTree = "<group>"; };
4CD19D672E9CDF980069DAA0 /* NSMutableAttributedString+MSRTL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSMutableAttributedString+MSRTL.m"; sourceTree = "<group>"; };
4CD19D682E9CDF980069DAA0 /* UIButton+MSRTL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIButton+MSRTL.h"; sourceTree = "<group>"; };
4CD19D692E9CDF980069DAA0 /* UIButton+MSRTL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIButton+MSRTL.m"; sourceTree = "<group>"; };
4CD19D6A2E9CDF980069DAA0 /* UIImage+MSRTL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIImage+MSRTL.h"; sourceTree = "<group>"; };
4CD19D6B2E9CDF980069DAA0 /* UIImage+MSRTL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIImage+MSRTL.m"; sourceTree = "<group>"; };
4CD19D6C2E9CDF980069DAA0 /* UILabel+MSRTL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UILabel+MSRTL.h"; sourceTree = "<group>"; };
4CD19D6D2E9CDF980069DAA0 /* UILabel+MSRTL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UILabel+MSRTL.m"; sourceTree = "<group>"; };
4CD19D6E2E9CDF980069DAA0 /* UISwipeGestureRecognizer+MSRTL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UISwipeGestureRecognizer+MSRTL.h"; sourceTree = "<group>"; };
4CD19D6F2E9CDF980069DAA0 /* UISwipeGestureRecognizer+MSRTL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UISwipeGestureRecognizer+MSRTL.m"; sourceTree = "<group>"; };
4CD19D702E9CDF980069DAA0 /* UITextField+MSRTL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UITextField+MSRTL.h"; sourceTree = "<group>"; };
4CD19D712E9CDF980069DAA0 /* UITextField+MSRTL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UITextField+MSRTL.m"; sourceTree = "<group>"; };
4CD19D722E9CDF980069DAA0 /* UITextView+MSRTL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UITextView+MSRTL.h"; sourceTree = "<group>"; };
4CD19D732E9CDF980069DAA0 /* UITextView+MSRTL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UITextView+MSRTL.m"; sourceTree = "<group>"; };
4CD19D742E9CDF980069DAA0 /* YYLabel+MSRTL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "YYLabel+MSRTL.h"; sourceTree = "<group>"; };
4CD19D752E9CDF980069DAA0 /* YYLabel+MSRTL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "YYLabel+MSRTL.m"; sourceTree = "<group>"; };
4CD19D8A2E9CDF980069DAA0 /* TTAlertButtonConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TTAlertButtonConfig.h; sourceTree = "<group>"; };
4CD19D8B2E9CDF980069DAA0 /* TTAlertButtonConfig.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TTAlertButtonConfig.m; sourceTree = "<group>"; };
4CD19D8E2E9CDF980069DAA0 /* TTAlertMessageAttributedConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TTAlertMessageAttributedConfig.h; sourceTree = "<group>"; };
@@ -426,8 +361,6 @@
4CD19D992E9CDF980069DAA0 /* TTPopupServiceProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TTPopupServiceProtocol.h; sourceTree = "<group>"; };
4CD19DA22E9CDF980069DAA0 /* TTPopup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TTPopup.h; sourceTree = "<group>"; };
4CD19DA32E9CDF980069DAA0 /* TTPopup.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TTPopup.m; sourceTree = "<group>"; };
4CD19DA52E9CDF980069DAA0 /* UIButton+EnlargeTouchArea.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIButton+EnlargeTouchArea.h"; sourceTree = "<group>"; };
4CD19DA62E9CDF980069DAA0 /* UIButton+EnlargeTouchArea.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIButton+EnlargeTouchArea.m"; sourceTree = "<group>"; };
4CD19DA82E9CDF980069DAA0 /* UIImage+Utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIImage+Utils.h"; sourceTree = "<group>"; };
4CD19DA92E9CDF980069DAA0 /* UIImage+Utils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Utils.m"; sourceTree = "<group>"; };
4CD19DAB2E9CDF980069DAA0 /* NetImageConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NetImageConfig.h; sourceTree = "<group>"; };
@@ -456,10 +389,6 @@
4CDF7F3E2E9E580E00113F54 /* EPEmotionColorStorage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EPEmotionColorStorage.m; sourceTree = "<group>"; };
4CDF7F402E9E581900113F54 /* EPEmotionColorPicker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EPEmotionColorPicker.h; sourceTree = "<group>"; };
4CDF7F412E9E581900113F54 /* EPEmotionColorPicker.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EPEmotionColorPicker.m; sourceTree = "<group>"; };
4CF462CD2EA10E1B005E96C0 /* XPWebViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPWebViewController.h; sourceTree = "<group>"; };
4CF462CE2EA10E1B005E96C0 /* XPWebViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPWebViewController.m; sourceTree = "<group>"; };
4CF462CF2EA10E1B005E96C0 /* XPWebViewNavView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPWebViewNavView.h; sourceTree = "<group>"; };
4CF462D02EA10E1B005E96C0 /* XPWebViewNavView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPWebViewNavView.m; sourceTree = "<group>"; };
4CF464092EA12723005E96C0 /* DJDKMIMOMColor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DJDKMIMOMColor.h; sourceTree = "<group>"; };
4CF4640A2EA12723005E96C0 /* DJDKMIMOMColor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DJDKMIMOMColor.m; sourceTree = "<group>"; };
4CF4640C2EA1277C005E96C0 /* TTActionSheetConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TTActionSheetConfig.h; sourceTree = "<group>"; };
@@ -485,23 +414,11 @@
4CF464242EA1277C005E96C0 /* TTNewAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TTNewAlertView.m; sourceTree = "<group>"; };
4CF464262EA1277C005E96C0 /* TTPopup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TTPopup.h; sourceTree = "<group>"; };
4CF464272EA1277C005E96C0 /* TTPopup.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TTPopup.m; sourceTree = "<group>"; };
548D541E2CC208FD0084A2FF /* AlbumResourcePickerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AlbumResourcePickerViewController.h; sourceTree = "<group>"; };
548D541F2CC208FD0084A2FF /* AlbumResourcePickerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AlbumResourcePickerViewController.m; sourceTree = "<group>"; };
54B9C6E82C9C2DDC003F1CC5 /* GuildInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GuildInfo.h; sourceTree = "<group>"; };
54B9C6E92C9C2DDC003F1CC5 /* GuildInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GuildInfo.m; sourceTree = "<group>"; };
54F469392C2A984D00A83655 /* MedalModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MedalModel.h; sourceTree = "<group>"; };
54F4693A2C2A984D00A83655 /* MedalModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MedalModel.m; sourceTree = "<group>"; };
54FFD3782C9BCB1900DE61E5 /* RelationUserVO.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RelationUserVO.h; sourceTree = "<group>"; };
54FFD3792C9BCB1900DE61E5 /* RelationUserVO.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RelationUserVO.m; sourceTree = "<group>"; };
7DB00EC07F1D0ADFF900B38D /* Pods-YuMi.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-YuMi.debug.xcconfig"; path = "Target Support Files/Pods-YuMi/Pods-YuMi.debug.xcconfig"; sourceTree = "<group>"; };
9B0E1C5726E77022005D4442 /* BaseNavigationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BaseNavigationController.h; sourceTree = "<group>"; };
9B0E1C5826E77022005D4442 /* BaseNavigationController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BaseNavigationController.m; sourceTree = "<group>"; };
9B2A12DC2783FEDD00CED41B /* UserVipInfoVo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserVipInfoVo.h; sourceTree = "<group>"; };
9B2A12DD2783FEDD00CED41B /* UserVipInfoVo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserVipInfoVo.m; sourceTree = "<group>"; };
9B33E3C927D85379003B0E62 /* UploadFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UploadFile.m; sourceTree = "<group>"; };
9B33E3CA27D85379003B0E62 /* UploadFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UploadFile.h; sourceTree = "<group>"; };
9BA812D028BF145700783EA7 /* ClientRedPacketModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ClientRedPacketModel.h; sourceTree = "<group>"; };
9BA812D128BF145700783EA7 /* ClientRedPacketModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ClientRedPacketModel.m; sourceTree = "<group>"; };
9BA8A47427C60D9F000365A3 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
9BA8A47627C60DF7000365A3 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
B66633E061B1B34177CD011C /* Pods-YuMi.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-YuMi.release.xcconfig"; path = "Target Support Files/Pods-YuMi/Pods-YuMi.release.xcconfig"; sourceTree = "<group>"; };
@@ -532,15 +449,11 @@
E855515A280559FE005F293F /* NSDate+DateUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSDate+DateUtils.m"; sourceTree = "<group>"; };
E8729EB92A3B10C10076D80A /* YuMiRelease.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = YuMiRelease.entitlements; sourceTree = "<group>"; };
E8729EBA2A3B10C10076D80A /* YuMi.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = YuMi.entitlements; sourceTree = "<group>"; };
E875FA8527D619820086ED04 /* ClientDataModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ClientDataModel.h; sourceTree = "<group>"; };
E875FA8627D619820086ED04 /* ClientDataModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ClientDataModel.m; sourceTree = "<group>"; };
E88749B4282B8FC600C3C7DB /* MomentsInfoModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MomentsInfoModel.h; sourceTree = "<group>"; };
E88749B5282B8FC600C3C7DB /* MomentsInfoModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MomentsInfoModel.m; sourceTree = "<group>"; };
E88863D1278ED4C0004BCFAB /* Timestamp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Timestamp.h; sourceTree = "<group>"; };
E88863D2278ED4C0004BCFAB /* Timestamp.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Timestamp.m; sourceTree = "<group>"; };
E8A72BBA2A3AFB2F00B2EC07 /* PrefixHeader.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrefixHeader.pch; sourceTree = "<group>"; };
E8DEC99327648FA50078CB70 /* ClientConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ClientConfig.h; sourceTree = "<group>"; };
E8DEC99427648FA50078CB70 /* ClientConfig.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ClientConfig.m; sourceTree = "<group>"; };
E8E70D7C26F2F19D00F03460 /* Api+Mine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Api+Mine.h"; sourceTree = "<group>"; };
E8E70D7D26F2F19D00F03460 /* Api+Mine.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "Api+Mine.m"; sourceTree = "<group>"; };
E8EEB8EB26FC2050007C6EBA /* SDPhotoBrowserConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDPhotoBrowserConfig.h; sourceTree = "<group>"; };
@@ -550,8 +463,6 @@
E8EEB8EF26FC2050007C6EBA /* SDWaitingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWaitingView.h; sourceTree = "<group>"; };
E8EEB8F026FC2050007C6EBA /* SDPhotoBrowser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDPhotoBrowser.h; sourceTree = "<group>"; };
E8EEB8F126FC2050007C6EBA /* SDBrowserImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDBrowserImageView.h; sourceTree = "<group>"; };
E8EEB8F526FC2673007C6EBA /* UserPhoto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserPhoto.h; sourceTree = "<group>"; };
E8EEB8F626FC2673007C6EBA /* UserPhoto.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserPhoto.m; sourceTree = "<group>"; };
E8F6135A291E26BD00E12650 /* NSMutableDictionary+Saft.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSMutableDictionary+Saft.h"; sourceTree = "<group>"; };
E8F6135B291E26BD00E12650 /* NSMutableDictionary+Saft.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSMutableDictionary+Saft.m"; sourceTree = "<group>"; };
E8F6135D291E274E00E12650 /* NSArray+Safe.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSArray+Safe.h"; sourceTree = "<group>"; };
@@ -596,12 +507,6 @@
isa = PBXGroup;
children = (
4C0642842E97BD9500BAF413 /* APIConfig.swift */,
E8DEC99327648FA50078CB70 /* ClientConfig.h */,
E8DEC99427648FA50078CB70 /* ClientConfig.m */,
E875FA8527D619820086ED04 /* ClientDataModel.h */,
E875FA8627D619820086ED04 /* ClientDataModel.m */,
9BA812D028BF145700783EA7 /* ClientRedPacketModel.h */,
9BA812D128BF145700783EA7 /* ClientRedPacketModel.m */,
);
path = Config;
sourceTree = "<group>";
@@ -672,7 +577,6 @@
14D8768029A751A100E1DD7F /* Config */,
189DD56B26DF5B0900AB55B1 /* Structure */,
189DD56126DE45F800AB55B1 /* Modules */,
4CF462D12EA10E1B005E96C0 /* YMWeb */,
E81C27AF26EF39B00031E639 /* AppDelegate */,
189DD53826DE255600AB55B1 /* Assets.xcassets */,
2368ECD52BC38FDA00EDF4C9 /* Launch Screen.storyboard */,
@@ -740,22 +644,6 @@
187EEEEE26E89FE8002833B2 /* AccountInfoStorage.m */,
18E7B31626F097E00064BC9B /* UserInfoModel.h */,
18E7B31726F097E00064BC9B /* UserInfoModel.m */,
18E7B31926F0982E0064BC9B /* UserExpand.h */,
18E7B31A26F0982E0064BC9B /* UserExpand.m */,
18E7B31C26F0984C0064BC9B /* UserLevelVo.h */,
18E7B31D26F0984C0064BC9B /* UserLevelVo.m */,
18E7B31F26F098650064BC9B /* UserInfoSkillVo.h */,
18E7B32026F098650064BC9B /* UserInfoSkillVo.m */,
E8EEB8F526FC2673007C6EBA /* UserPhoto.h */,
E8EEB8F626FC2673007C6EBA /* UserPhoto.m */,
9B2A12DC2783FEDD00CED41B /* UserVipInfoVo.h */,
9B2A12DD2783FEDD00CED41B /* UserVipInfoVo.m */,
54F469392C2A984D00A83655 /* MedalModel.h */,
54F4693A2C2A984D00A83655 /* MedalModel.m */,
54FFD3782C9BCB1900DE61E5 /* RelationUserVO.h */,
54FFD3792C9BCB1900DE61E5 /* RelationUserVO.m */,
54B9C6E82C9C2DDC003F1CC5 /* GuildInfo.h */,
54B9C6E92C9C2DDC003F1CC5 /* GuildInfo.m */,
);
path = Model;
sourceTree = "<group>";
@@ -793,7 +681,6 @@
isa = PBXGroup;
children = (
23CEFC082AFB8FC100576D89 /* sdkContent */,
23FF255C2ABA8EEE0064E904 /* PIIAPTool */,
E83645A42A40AEF600E0DBE4 /* Bundle */,
E8F61356291E269700E12650 /* Safe */,
9B33E3C827D85379003B0E62 /* File */,
@@ -856,10 +743,7 @@
18E7B1B426E8B2960064BC9B /* YMTabbar */ = {
isa = PBXGroup;
children = (
E8B3E8062848B84F009746AB /* Model */,
E8B3E8052848B849009746AB /* Api */,
E8B3E8042848B842009746AB /* View */,
E8B3E8032848B838009746AB /* Presenter */,
);
path = YMTabbar;
sourceTree = "<group>";
@@ -1067,14 +951,6 @@
path = K;
sourceTree = "<group>";
};
23FF255C2ABA8EEE0064E904 /* PIIAPTool */ = {
isa = PBXGroup;
children = (
23D8DEF12AC5633300644637 /* PIIAPRegulate.swift */,
);
path = PIIAPTool;
sourceTree = "<group>";
};
4C0642712E97BD6D00BAF413 /* Controllers */ = {
isa = PBXGroup;
children = (
@@ -1253,46 +1129,6 @@
path = Services;
sourceTree = "<group>";
};
4CD19C9A2E9CDF980069DAA0 /* Adbvertise */ = {
isa = PBXGroup;
children = (
4CD19C942E9CDF980069DAA0 /* AdvertiseModel.h */,
4CD19C952E9CDF980069DAA0 /* AdvertiseModel.m */,
4CD19C962E9CDF980069DAA0 /* XPAdImageTool.h */,
4CD19C972E9CDF980069DAA0 /* XPAdImageTool.m */,
4CD19C982E9CDF980069DAA0 /* XPAdvertiseView.h */,
4CD19C992E9CDF980069DAA0 /* XPAdvertiseView.m */,
);
path = Adbvertise;
sourceTree = "<group>";
};
4CD19D762E9CDF980069DAA0 /* MSRTL */ = {
isa = PBXGroup;
children = (
4CD19D622E9CDF980069DAA0 /* MSBaseRTLFlowLayout.h */,
4CD19D632E9CDF980069DAA0 /* MSBaseRTLFlowLayout.m */,
4CD19D642E9CDF980069DAA0 /* MSBaseTextField.h */,
4CD19D652E9CDF980069DAA0 /* MSBaseTextField.m */,
4CD19D662E9CDF980069DAA0 /* NSMutableAttributedString+MSRTL.h */,
4CD19D672E9CDF980069DAA0 /* NSMutableAttributedString+MSRTL.m */,
4CD19D682E9CDF980069DAA0 /* UIButton+MSRTL.h */,
4CD19D692E9CDF980069DAA0 /* UIButton+MSRTL.m */,
4CD19D6A2E9CDF980069DAA0 /* UIImage+MSRTL.h */,
4CD19D6B2E9CDF980069DAA0 /* UIImage+MSRTL.m */,
4CD19D6C2E9CDF980069DAA0 /* UILabel+MSRTL.h */,
4CD19D6D2E9CDF980069DAA0 /* UILabel+MSRTL.m */,
4CD19D6E2E9CDF980069DAA0 /* UISwipeGestureRecognizer+MSRTL.h */,
4CD19D6F2E9CDF980069DAA0 /* UISwipeGestureRecognizer+MSRTL.m */,
4CD19D702E9CDF980069DAA0 /* UITextField+MSRTL.h */,
4CD19D712E9CDF980069DAA0 /* UITextField+MSRTL.m */,
4CD19D722E9CDF980069DAA0 /* UITextView+MSRTL.h */,
4CD19D732E9CDF980069DAA0 /* UITextView+MSRTL.m */,
4CD19D742E9CDF980069DAA0 /* YYLabel+MSRTL.h */,
4CD19D752E9CDF980069DAA0 /* YYLabel+MSRTL.m */,
);
path = MSRTL;
sourceTree = "<group>";
};
4CD19D902E9CDF980069DAA0 /* Config */ = {
isa = PBXGroup;
children = (
@@ -1353,15 +1189,6 @@
path = TTPopup;
sourceTree = "<group>";
};
4CD19DA72E9CDF980069DAA0 /* UIButton */ = {
isa = PBXGroup;
children = (
4CD19DA52E9CDF980069DAA0 /* UIButton+EnlargeTouchArea.h */,
4CD19DA62E9CDF980069DAA0 /* UIButton+EnlargeTouchArea.m */,
);
path = UIButton;
sourceTree = "<group>";
};
4CD19DAA2E9CDF980069DAA0 /* UIImage */ = {
isa = PBXGroup;
children = (
@@ -1417,10 +1244,7 @@
4CF464282EA1277C005E96C0 /* TTPopup */,
4CF464092EA12723005E96C0 /* DJDKMIMOMColor.h */,
4CF4640A2EA12723005E96C0 /* DJDKMIMOMColor.m */,
4CD19C9A2E9CDF980069DAA0 /* Adbvertise */,
4CD19D762E9CDF980069DAA0 /* MSRTL */,
4CD19DA42E9CDF980069DAA0 /* TTPopup */,
4CD19DA72E9CDF980069DAA0 /* UIButton */,
4CD19DAA2E9CDF980069DAA0 /* UIImage */,
4CD19DB12E9CDF980069DAA0 /* UIImageView */,
4CD19DB42E9CDF980069DAA0 /* UIViewCorner */,
@@ -1434,17 +1258,6 @@
path = CustomUI;
sourceTree = "<group>";
};
4CF462D12EA10E1B005E96C0 /* YMWeb */ = {
isa = PBXGroup;
children = (
4CF462CD2EA10E1B005E96C0 /* XPWebViewController.h */,
4CF462CE2EA10E1B005E96C0 /* XPWebViewController.m */,
4CF462CF2EA10E1B005E96C0 /* XPWebViewNavView.h */,
4CF462D02EA10E1B005E96C0 /* XPWebViewNavView.m */,
);
path = YMWeb;
sourceTree = "<group>";
};
4CF464142EA1277C005E96C0 /* Config */ = {
isa = PBXGroup;
children = (
@@ -1522,8 +1335,6 @@
9B33E3C927D85379003B0E62 /* UploadFile.m */,
23959FE52BB15C930085A282 /* UploadFileModel.h */,
23959FE62BB15C930085A282 /* UploadFileModel.m */,
548D541E2CC208FD0084A2FF /* AlbumResourcePickerViewController.h */,
548D541F2CC208FD0084A2FF /* AlbumResourcePickerViewController.m */,
);
path = File;
sourceTree = "<group>";
@@ -1611,8 +1422,6 @@
children = (
189DD52C26DE255300AB55B1 /* AppDelegate.h */,
189DD52D26DE255300AB55B1 /* AppDelegate.m */,
234D821C2AEC57CF0022EFEB /* YYTextAsyncLayer+PITextAsyncLayer.h */,
234D821D2AEC57CF0022EFEB /* YYTextAsyncLayer+PITextAsyncLayer.m */,
);
path = AppDelegate;
sourceTree = "<group>";
@@ -1675,20 +1484,6 @@
path = Timestamp;
sourceTree = "<group>";
};
E8B3E8032848B838009746AB /* Presenter */ = {
isa = PBXGroup;
children = (
);
path = Presenter;
sourceTree = "<group>";
};
E8B3E8042848B842009746AB /* View */ = {
isa = PBXGroup;
children = (
);
path = View;
sourceTree = "<group>";
};
E8B3E8052848B849009746AB /* Api */ = {
isa = PBXGroup;
children = (
@@ -1698,13 +1493,6 @@
path = Api;
sourceTree = "<group>";
};
E8B3E8062848B84F009746AB /* Model */ = {
isa = PBXGroup;
children = (
);
path = Model;
sourceTree = "<group>";
};
E8E70D6E26F2EB1200F03460 /* YMMine */ = {
isa = PBXGroup;
children = (
@@ -1901,39 +1689,21 @@
buildActionMask = 2147483647;
files = (
180116FC279E8CCE00F2CBC0 /* NVDate.m in Sources */,
54B9C6EA2C9C2DDC003F1CC5 /* GuildInfo.m in Sources */,
234D821E2AEC57CF0022EFEB /* YYTextAsyncLayer+PITextAsyncLayer.m in Sources */,
4C4707A52D53430300C8CD24 /* NSData+GZIP.m in Sources */,
23CEFC542AFB8FC100576D89 /* BSNotification.m in Sources */,
4CD19E722E9CDF980069DAA0 /* UIButton+MSRTL.m in Sources */,
4CD19E772E9CDF980069DAA0 /* UITextView+MSRTL.m in Sources */,
4CD19E782E9CDF980069DAA0 /* NSMutableAttributedString+MSRTL.m in Sources */,
4CF462D42EA10E1B005E96C0 /* XPWebViewNavView.m in Sources */,
4CF462D52EA10E1B005E96C0 /* XPWebViewController.m in Sources */,
4CD19E7C2E9CDF980069DAA0 /* TTPopupService.m in Sources */,
4CD19E7E2E9CDF980069DAA0 /* XNDJTDDLoadingTool.m in Sources */,
4CD19E802E9CDF980069DAA0 /* TTPopup.m in Sources */,
4CD19E812E9CDF980069DAA0 /* UIView+GradientLayer.m in Sources */,
4CD19E822E9CDF980069DAA0 /* TTAlertMessageAttributedConfig.m in Sources */,
4CD19E842E9CDF980069DAA0 /* XPAdvertiseView.m in Sources */,
4CD19E852E9CDF980069DAA0 /* UISwipeGestureRecognizer+MSRTL.m in Sources */,
4CD19E862E9CDF980069DAA0 /* TTAlertButtonConfig.m in Sources */,
4CD19E882E9CDF980069DAA0 /* UIView+Corner.m in Sources */,
4CD19E8D2E9CDF980069DAA0 /* NetImageView.m in Sources */,
4CD19E912E9CDF980069DAA0 /* UILabel+MSRTL.m in Sources */,
4CD19E922E9CDF980069DAA0 /* YYLabel+MSRTL.m in Sources */,
4CD19E932E9CDF980069DAA0 /* NetImageConfig.m in Sources */,
4CD19E942E9CDF980069DAA0 /* UIButton+EnlargeTouchArea.m in Sources */,
4CD19E952E9CDF980069DAA0 /* MSBaseRTLFlowLayout.m in Sources */,
4CD19E982E9CDF980069DAA0 /* AdvertiseModel.m in Sources */,
4CD19E9B2E9CDF980069DAA0 /* XCCurrentVCStackManager.m in Sources */,
4CD19E9C2E9CDF980069DAA0 /* UIImage+ImageEffects.m in Sources */,
4CD19E9D2E9CDF980069DAA0 /* UIImage+Utils.m in Sources */,
4CD19E9E2E9CDF980069DAA0 /* UIImage+MSRTL.m in Sources */,
4CD19EA02E9CDF980069DAA0 /* UITextField+MSRTL.m in Sources */,
4CD19EA42E9CDF980069DAA0 /* TTPopupManagerService.m in Sources */,
4CD19EA52E9CDF980069DAA0 /* MSBaseTextField.m in Sources */,
4CD19EA62E9CDF980069DAA0 /* XPAdImageTool.m in Sources */,
4CD19EA82E9CDF980069DAA0 /* UIImageConstant.m in Sources */,
4C06428B2E98DC5F00BAF413 /* EPTabBarController.swift in Sources */,
4CF464292EA1277C005E96C0 /* TTPopup.m in Sources */,
@@ -1949,24 +1719,20 @@
4C1E98C32E9A45160031AE79 /* EPImageUploader.swift in Sources */,
4C1E98C42E9A45160031AE79 /* EPProgressHUD.swift in Sources */,
E8E70D7E26F2F19D00F03460 /* Api+Mine.m in Sources */,
E8EEB8F726FC2673007C6EBA /* UserPhoto.m in Sources */,
E81C27A226EF23490031E639 /* YUMINNNN.h in Sources */,
4CA7410E2E72B8FC00DB6853 /* YMLanguageConfig.m in Sources */,
E855515B280559FE005F293F /* NSDate+DateUtils.m in Sources */,
189DD76226E60DDC00AB55B1 /* Api+Login.m in Sources */,
54F4693B2C2A984D00A83655 /* MedalModel.m in Sources */,
23CEFC4E2AFB8FC100576D89 /* BSNSDictionary.m in Sources */,
E8EEB8F326FC2050007C6EBA /* SDWaitingView.m in Sources */,
23CEFC512AFB8FC100576D89 /* SystemUtil.m in Sources */,
23CEFC5E2AFB8FC100576D89 /* BSRealTimeView.m in Sources */,
9BA812D228BF145700783EA7 /* ClientRedPacketModel.m in Sources */,
4C7B91D82EA096DE00A5E236 /* EPEmotionInfoView.m in Sources */,
189DD73E26E21C3F00AB55B1 /* YYUtility.m in Sources */,
23CEFC652AFB8FC100576D89 /* BSDrawLine.m in Sources */,
180116F9279E8C4C00F2CBC0 /* PLTimeUtil.m in Sources */,
23CEFC502AFB8FC100576D89 /* UILabel+YBAttributeTextTapAction.m in Sources */,
23CEFC5C2AFB8FC100576D89 /* BSNetListenModel.m in Sources */,
548D54202CC208FD0084A2FF /* AlbumResourcePickerViewController.m in Sources */,
23CEFC4A2AFB8FC100576D89 /* BSNSStringUtil.m in Sources */,
E8EEB8F226FC2050007C6EBA /* SDPhotoBrowser.m in Sources */,
23CEFC4F2AFB8FC100576D89 /* BSSDLayoutUtil.m in Sources */,
@@ -1974,9 +1740,7 @@
189DD55A26DE39D200AB55B1 /* BaseMvpPresenter.m in Sources */,
E88863D3278ED4C0004BCFAB /* Timestamp.m in Sources */,
189DD6FF26E20E5900AB55B1 /* HttpRequestHelper.m in Sources */,
54FFD37A2C9BCB1900DE61E5 /* RelationUserVO.m in Sources */,
18E7B31826F097E00064BC9B /* UserInfoModel.m in Sources */,
18E7B32126F098650064BC9B /* UserInfoSkillVo.m in Sources */,
4C0642912E98DC8700BAF413 /* EPMomentViewController.m in Sources */,
232EBBFF2BD7A25500E8CEAD /* MSParamsDecode.m in Sources */,
23959FE72BB15C930085A282 /* UploadFileModel.m in Sources */,
@@ -1992,11 +1756,7 @@
18E7B1B726E8B2D10064BC9B /* Api+Main.m in Sources */,
23CEFC5B2AFB8FC100576D89 /* BSSelectView.m in Sources */,
23CEFC622AFB8FC100576D89 /* BSLogNetDetailViewController.m in Sources */,
18E7B31E26F0984C0064BC9B /* UserLevelVo.m in Sources */,
4C7B909B2E9F822900A5E236 /* EPEmotionColorWheelView.m in Sources */,
23D8DEF22AC5633300644637 /* PIIAPRegulate.swift in Sources */,
18E7B31B26F0982E0064BC9B /* UserExpand.m in Sources */,
9B2A12DE2783FEDD00CED41B /* UserVipInfoVo.m in Sources */,
4C7B8F632E9F6E1300A5E236 /* EPSignatureColorGuideView.m in Sources */,
9B33E3CB27D85379003B0E62 /* UploadFile.m in Sources */,
4CD19EAE2E9CDFC30069DAA0 /* EPLoginButton.swift in Sources */,
@@ -2010,7 +1770,6 @@
E8F6135F291E274E00E12650 /* NSArray+Safe.m in Sources */,
4C06427F2E97BD6D00BAF413 /* EPMineHeaderView.m in Sources */,
4C0642802E97BD6D00BAF413 /* EPMomentCell.m in Sources */,
E8DEC99527648FA50078CB70 /* ClientConfig.m in Sources */,
4CDF7F3F2E9E580E00113F54 /* EPEmotionColorStorage.m in Sources */,
23CEFC602AFB8FC100576D89 /* RealViewCellModel.m in Sources */,
4CD19C872E9CB31C0069DAA0 /* EPLoginViewController.swift in Sources */,
@@ -2043,7 +1802,6 @@
4C1E98C92E9A4DFD0031AE79 /* EPQCloudConfig.swift in Sources */,
4C1E98CA2E9A4DFD0031AE79 /* EPSDKManager.swift in Sources */,
E88749B6282B8FC600C3C7DB /* MomentsInfoModel.m in Sources */,
E875FA8727D619820086ED04 /* ClientDataModel.m in Sources */,
4C1E98C62E9A45BC0031AE79 /* EPMomentAPISwiftHelper.swift in Sources */,
23CEFC4D2AFB8FC100576D89 /* BSXWDateUtil.m in Sources */,
189DD75926E6003C00AB55B1 /* Api.m in Sources */,
@@ -2097,6 +1855,7 @@
189DD54026DE255600AB55B1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@@ -2156,6 +1915,7 @@
189DD54126DE255600AB55B1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@@ -2304,10 +2064,6 @@
"-framework",
"\"ImageIO\"",
"-framework",
"\"JXCategoryView\"",
"-framework",
"\"JXPagingView\"",
"-framework",
"\"JavaScriptCore\"",
"-framework",
"\"LocalAuthentication\"",
@@ -2318,8 +2074,6 @@
"-framework",
"\"MJRefresh\"",
"-framework",
"\"MarqueeLabel\"",
"-framework",
"\"Masonry\"",
"-framework",
"\"Metal\"",
@@ -2376,8 +2130,6 @@
"-framework",
"\"YYImage\"",
"-framework",
"\"YYText\"",
"-framework",
"\"YYWebImage\"",
"-framework",
"\"YuMi\"",
@@ -2490,10 +2242,6 @@
"-framework",
"\"ImageIO\"",
"-framework",
"\"JXCategoryView\"",
"-framework",
"\"JXPagingView\"",
"-framework",
"\"JavaScriptCore\"",
"-framework",
"\"LocalAuthentication\"",
@@ -2504,8 +2252,6 @@
"-framework",
"\"MJRefresh\"",
"-framework",
"\"MarqueeLabel\"",
"-framework",
"\"Masonry\"",
"-framework",
"\"Metal\"",
@@ -2562,8 +2308,6 @@
"-framework",
"\"YYImage\"",
"-framework",
"\"YYText\"",
"-framework",
"\"YYWebImage\"",
"-framework",
"\"YuMi\"",

View File

@@ -6,15 +6,10 @@
//
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property(nonatomic,strong,readonly)NSManagedObjectContext *managedObjectContext;
@property(nonatomic,strong,readonly)NSManagedObjectModel *managedObjectModel;
@property(nonatomic,strong,readonly)NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
@end

View File

@@ -10,11 +10,7 @@
#import "BaseNavigationController.h"
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import "ClientConfig.h"
#import "AccountModel.h"
#import "YuMi-swift.h"
#import "EPSignatureColorGuideView.h"
#import "EPEmotionColorStorage.h"
UIKIT_EXTERN NSString * const kOpenRoomNotification;
@@ -33,13 +29,7 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification;
self.window.rootViewController = launchScreenVC;
[self.window makeKeyAndVisible];
@kWeakify(self);
[[ClientConfig shareConfig] clientConfig:^{
@kStrongify(self);
dispatch_async(dispatch_get_main_queue(), ^{
[self loadMainPage];
});
}];
if (@available(iOS 15, *)) {
[[UITableView appearance] setSectionHeaderTopPadding:0];
@@ -89,8 +79,6 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification;
[self checkAndShowSignatureColorGuide];
});
}
[[ClientConfig shareConfig] clientInit];
}
///
@@ -185,84 +173,4 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification;
});
}
#pragma mark - Core Data stack
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
-(NSURL *)applicationDocumentsDirectory{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
- (NSManagedObjectModel *)managedObjectModel {
// The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"_1_______" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
// The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it.
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
// Create the coordinator and store
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"_1_______.sqlite"];
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// Report any error we got.
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
dict[NSLocalizedFailureReasonErrorKey] = failureReason;
dict[NSUnderlyingErrorKey] = error;
error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
// NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
- (NSManagedObjectContext *)managedObjectContext {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
}
#pragma mark - Core Data Saving support
- (void)saveContext {
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
NSError *error = nil;
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
// NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
@end

View File

@@ -1,16 +0,0 @@
//
// YYTextAsyncLayer+PITextAsyncLayer.h
// YuMi
//
// Created by duoban on 2023/10/28.
//
#import <YYText/YYTextAsyncLayer.h>
NS_ASSUME_NONNULL_BEGIN
@interface YYTextAsyncLayer (PITextAsyncLayer)
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,26 +0,0 @@
//
// YYTextAsyncLayer+PITextAsyncLayer.m
// YuMi
//
// Created by duoban on 2023/10/28.
//
#import "YYTextAsyncLayer+PITextAsyncLayer.h"
@implementation YYTextAsyncLayer (PITextAsyncLayer)
///iOS17bug退
+(void)load {
Method displayMethod = class_getInstanceMethod(self, @selector(display));
Method swizzingMethod = class_getInstanceMethod(self, @selector(swizzing_display));
method_exchangeImplementations(displayMethod, swizzingMethod);
}
-(void)swizzing_display{
//
if (self.bounds.size.width <= 0 || self.bounds.size.height <= 0) {
self.contents = nil;
return;
} else {
[self swizzing_display];
}
}
@end

View File

@@ -1,70 +0,0 @@
//
// ClientConfig.h
// YUMI
//
// Created by YUMI on 2021/12/11.
//
#import <Foundation/Foundation.h>
#import "ClientDataModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface ClientConfig : PIBaseModel
+ (instancetype)shareConfig;
///初始化
- (void)clientInit;
/// 获取 UI 配置
- (void)clientConfig:(void(^)(void))finish;
/// iOS第三方登录是否需要绑定手机号
@property (nonatomic,assign) BOOL iOSPhoneBind;
/// 是否开启了糖果树
@property (nonatomic,assign) BOOL openCandyTree;
///配置信息
@property (nonatomic,strong) ClientDataModel *configInfo;
@property (nonatomic, strong) AppUISetting *uiSetting;
///开箱子 大于等级 展示
@property (nonatomic, assign) NSInteger openCandyTreeLimitLevel;
@property(nonatomic,assign) BOOL isTF;
///是否刷新了
@property (nonatomic,assign) BOOL isLoad;
///房间id用于分享房间跳转到房间
@property (nonatomic, copy) NSString *__nullable roomId;
///用户id用于外部h5跳转到聊天页面
@property (nonatomic, copy) NSString *__nullable chatId;
///用户id推送跳转到聊天页面
@property (nonatomic, copy) NSString *__nullable pushChatId;
///邀请码,从外面进来会进入注册页面,并自动填写这个邀请码
@property(nonatomic,copy) NSString *inviteCode;
///表情---
@property (nonatomic, copy) NSString *version;
@property (nonatomic, copy) NSString *zipMd5;
@property (nonatomic, strong) NSURL *zipUrl;
@property(nonatomic, assign) BOOL shouldDisplayCaptcha;
- (UIColor *)bgColor;
- (NSString *)tabName:(NSInteger)tabIndex;
- (NSString *)loadDefaultNormalTabImageName:(NSInteger)tabIndex;
- (NSString *)loadDefaultSelectedTabImageName:(NSInteger)tabIndex;
- (NSString *)loadConfigNormalTabImagePath:(NSInteger)tabIndex;
- (NSString *)loadConfigSelectedTabImagePath:(NSInteger)tabIndex;
@property (nonatomic, copy) NSString *reloadNavigationAreaImageKey;
@property (nonatomic, copy) NSString *reloadViewBackgroundColorKey;
@property (nonatomic, strong) UIImage *navigationAreaBG;
@property (nonatomic, strong) UIImage *tabbarBGImage;
@property (nonatomic, copy) void(^updateTabbarBG)(UIImage *image);
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,123 +0,0 @@
//
// ClientConfig.m
// YUMI
//
// Created by YUMI on 2021/12/11.
//
#import "ClientConfig.h"
#import "Api+Main.h"
/// tool
#import "DESEncrypt.h"
#import "YUMIConstant.h"
#import <MJExtension/MJExtension.h>
#import "NSString+Utils.h"
#import "YYUtility.h"
#import "XPWeakTimer.h"
#import "Api+Main.h"
@interface ClientConfig ()
/// 10
@property (nonatomic,assign) int retryCount;
@property (nonatomic, strong) NSMutableArray *normalTabImageSource;
@property (nonatomic, strong) NSMutableArray *selectedTabImageSource;
@property (nonatomic, strong) NetImageView *normalTabImageLoader;
@property (nonatomic, strong) NetImageView *selectedTabImageLoader;
@property (nonatomic, strong) NetImageView *tabbarBGImageLoader;
@property (nonatomic, strong) NetImageView *navigationAreaBGImageLoader;
@property (nonatomic, assign) BOOL isLoading;
@end
@implementation ClientConfig
+ (instancetype)shareConfig {
static dispatch_once_t onceToken;
static ClientConfig * config;
dispatch_once(&onceToken, ^{
config = [[ClientConfig alloc] init];
config.isTF = [ClientConfig isTestFlight];
config.reloadNavigationAreaImageKey = @"今天光线很好";
config.reloadViewBackgroundColorKey = @"年轻人买不起美国买房平均年龄飙升至56岁";
});
return config;
}
+(BOOL)isTestFlight{
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSString *receiptURLString = [receiptURL path];
BOOL isTestFlight = ([receiptURLString containsString:@"sandboxReceipt"] || [receiptURLString containsString:@"_MASReceipt/receipt"]);
return isTestFlight;
}
- (void)clientInit {
@kWeakify(self);
[Api clientInitConfig:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
@kStrongify(self);
if (code == 200) {
self.retryCount = 0;
ClientDataModel * model = [ClientDataModel modelWithDictionary:data.data];
self.iOSPhoneBind = model.iosPhoneBind;
//
self.openCandyTree = model.openBoxSwitch;
self.openCandyTreeLimitLevel = model.openBoxSwitchLevelNo;
//
NSString *json = model.faceJson.json;
NSString *deJson = [DESEncrypt decryptUseDES:json key:KeyWithType(KeyType_FacePwdEncode)];
NSDictionary *faceInitData = [deJson toJSONObject];
NSString *trtcAppId = @(model.trtcAppId).stringValue;
NSString *curTtcKey = [[NSUserDefaults standardUserDefaults]valueForKey:@"kTrtcAppId"];
if(curTtcKey == nil){
if(trtcAppId != nil){
[[NSUserDefaults standardUserDefaults]setValue:trtcAppId forKey:@"kTrtcAppId"];
[[NSUserDefaults standardUserDefaults]synchronize];
}
}else{
if(![trtcAppId isEqualToString:curTtcKey]){
if(trtcAppId != nil){
[[NSUserDefaults standardUserDefaults]setValue:trtcAppId forKey:@"kTrtcAppId"];
[[NSUserDefaults standardUserDefaults]synchronize];
}
}
}
NSString *serverVer = model.appStoreAuditNoticeVersion;
NSString *shortVer = [YYUtility appVersion];
model.hideNoticeVersion = [NSString versionCompareOldStr:serverVer andNewStr:shortVer];
self.configInfo = model;
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadAfterLoadConfig" object:nil];
} else {
if (self.retryCount < 10) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.retryCount+=1;
[self clientInit];
});
}
}
}];
}
- (void)clientConfig:(void(^)(void))finish {
@kWeakify(self);
[Api clientConfig:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
@kStrongify(self);
if (code == 200) {
self.uiSetting = [AppUISetting modelWithJSON:data.data[@"appUiSetting"]];
}
if (finish) {
finish();
}
}];
}
@end

View File

@@ -1,117 +0,0 @@
//
// ClientDataModel.h
// YUMI
//
// Created by YUMI on 2022/3/7.
//
#import <Foundation/Foundation.h>
#import "ClientRedPacketModel.h"
#import "AdvertiseModel.h"
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger, FaceLivenessStrategy) {
FaceLivenessStrategy_Pass = 0,
FaceLivenessStrategy_Force = 1,
FaceLivenessStrategy_Guide = 2,
};
@interface FaceJson : PIBaseModel
@property (nonatomic, assign) NSInteger status;
@property (nonatomic, assign) NSInteger id;
@property (nonatomic, assign) NSTimeInterval createTime;
@property (nonatomic, copy) NSString *json;
@property (nonatomic, assign) NSInteger version;
@end
@interface AppUISetting : PIBaseModel
@property (nonatomic, assign) NSInteger settingStatus;
@property (nonatomic, copy) NSString *headIcon;
@property (nonatomic, copy) NSString *navbar;
@property (nonatomic, copy) NSString *backgroundColor;
@property (nonatomic, copy) NSString *homeSelectIcon;
@property (nonatomic, copy) NSString *homeUnSelectIcon;
@property (nonatomic, copy) NSString *gameSelectIcon;
@property (nonatomic, copy) NSString *gameUnSelectIcon;
@property (nonatomic, copy) NSString *dynamicSelectIcon;
@property (nonatomic, copy) NSString *dynamicUnSelectIcon;
@property (nonatomic, copy) NSString *msgSelectIcon;
@property (nonatomic, copy) NSString *msgUnSelectIcon;
@property (nonatomic, copy) NSString *mineSelectIcon;
@property (nonatomic, copy) NSString *mineUnSelectIcon;
@property (nonatomic, copy) NSString *selectBar;
@end
@interface ClientDataModel : PIBaseModel
@property (nonatomic, strong) AppUISetting *appUiSetting;
///首页tag 配置
@property (nonatomic,strong) NSArray<NSString *> *homeTabList;
///房间表情的数据
@property (nonatomic,copy) NSDictionary *faceInitData;
///是否隐藏房间公告
@property (nonatomic,assign) BOOL hideNoticeVersion;
//进入房间拉取N条聊天数据
@property(nonatomic, assign) NSInteger roomMessageCount;
///发现萌新展示等级
@property (nonatomic,assign) NSInteger findNewbieCharmLevel;
///送礼物隐藏座驾动画的值
@property (nonatomic,assign) double hideCarEffectGiftPrice;
//航海等级限制
@property (nonatomic, assign) NSInteger linearlyPoolOpenLevel;
///红包配置
@property (nonatomic, strong) ClientRedPacketModel *redEnvelopeConfig;
///启动图
@property (nonatomic,strong) AdvertiseModel *splashVo;
///官方消息Uid列表
@property (nonatomic, strong) NSArray<NSString *> *officialMsgUids;
///官方账号 小秘书 红包消息
@property (nonatomic,strong) NSArray<NSString *> *officialAccountUids;
@property(nonatomic,copy) NSDictionary *publicChatRoomIdMap; // 公聊大厅房间 IDs已不使用该业务逻辑 -> 又要使用了
///星座礼物顶部是否开启
@property (nonatomic,assign) BOOL twelveStarSwitch;
/// 开房是否需要实名
@property (nonatomic,assign) FaceLivenessStrategy certificationType;
///转赠钻石白名单
@property (nonatomic,strong) NSMutableArray *giveDiamondErbanNoList;
///转赠礼物白名单
@property (nonatomic,strong) NSMutableArray *giveGiftErbanNoList;
///每日转赠钻石总额限制
@property (nonatomic,assign) NSInteger giveDiamondDailyNum;
///转赠钻石单笔最大限额
@property (nonatomic,assign) NSInteger giveDiamondOnceLimitNum;
///转赠钻石财富等级
@property (nonatomic,assign) NSInteger giveDiamondExperLevel;
///转赠礼物财富等级
@property (nonatomic,assign) NSInteger giveGiftExperLevel;
///转赠手续费率
@property (nonatomic,assign) double giveDiamondRate;
@property (nonatomic, assign) BOOL iosPhoneBind;
@property (nonatomic, assign) BOOL openBoxSwitch;
@property (nonatomic, assign) NSInteger openBoxSwitchLevelNo;
@property (nonatomic, strong) FaceJson *faceJson;
@property (nonatomic, assign) NSInteger trtcAppId;
@property (nonatomic, copy) NSString *appStoreAuditNoticeVersion;
@property(nonatomic, assign) BOOL captchaSwitch;
@property (nonatomic, copy) NSString *sudId;
@property (nonatomic, copy) NSString *sudkey;
@property (nonatomic, copy) NSString *nimKey;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,30 +0,0 @@
//
// ClientDataModel.m
// YUMI
//
// Created by YUMI on 2022/3/7.
//
#import "ClientDataModel.h"
#import "XPAdImageTool.h"
@implementation FaceJson
@end
@implementation AppUISetting
@end
@implementation ClientDataModel
- (void)setSplashVo:(AdvertiseModel *)splashVo {
_splashVo = splashVo;
if (_splashVo) {
[XPAdImageTool.shareImageTool saveAdInfo:splashVo];
}
}
@end

View File

@@ -1,52 +0,0 @@
//
// ClientRedPacketModel.h
// YUMI
//
// Created by YUMI on 2022/8/31.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
//@class
@interface ClientRedPacketModel : PIBaseModel
///红包开关
@property (nonatomic, assign) BOOL open;
///红包推送id
@property (nonatomic, assign) long long pushUserId;
///厅内红包个数最大值
@property (nonatomic, strong) NSNumber *roomRedEnvelopeMaxNum;
///厅内红包数额最小值
@property (nonatomic, strong) NSNumber *roomRedEnvelopeMinAmount;
///厅内红包个数最小值
@property (nonatomic, strong) NSNumber *roomRedEnvelopeMinNum;
///全服红包个数最大值
@property (nonatomic, strong) NSNumber *serverRedEnvelopeMaxNum;
///全服红包数额最小值
@property (nonatomic, strong) NSNumber *serverRedEnvelopeMinAmount;
///全服红包个数最小值
@property (nonatomic, strong) NSNumber *serverRedEnvelopeMinNum;
///厅内红包数额最大值
@property (nonatomic, strong) NSNumber *roomRedEnvelopeMaxAmount;
///全服红包数额最大值
@property (nonatomic, strong) NSNumber *serverRedEnvelopeMaxAmount;
///默认红包位置1厅内 2全服
@property (nonatomic, strong) NSNumber *redEnvelopedPosition;
///默认红包类型1 钻石 2礼物
@property (nonatomic, strong) NSNumber *redEnvelopeType;
///钻石红包比例
@property (nonatomic, strong) NSNumber *exchangeDiamondsRate;
///版本
@property (nonatomic, copy) NSString *serverAppVersion;
//@property (nonatomic, strong) NSArray<> *gold2GiftIds;
@property (nonatomic, strong) NSArray *openRooms;
@property(nonatomic,assign) NSInteger beginSecond;
///红包有效时间
@property(nonatomic,assign) NSInteger endSecond;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,16 +0,0 @@
//
// ClientRedPacketModel.m
// YUMI
//
// Created by YUMI on 2022/8/31.
//
#import "ClientRedPacketModel.h"
@implementation ClientRedPacketModel
//+ (NSDictionary *)objectClassInArray {
// return @{@"contents":GuildMessageLayoutInfoModel.class};
//}
@end

View File

@@ -1,44 +0,0 @@
//
// AdvertiseModel.h
// YUMI
//
// Created by YUMI on 2022/10/31.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger, SplashInfoSkipType) {
SplashInfoSkipTypePage = 1,
SplashInfoSkipTypeRoom = 2,
SplashInfoSkipTypeWeb = 3,
SplashInfoSkipTypeWeb_CP = 4,
SplashInfoSkipTypeWeb_WeekStar = 5,
SplashInfoSkipTypeWeb_Custom = 6,
};
@interface AdvertiseFillModel : PIBaseModel
@property(nonatomic, copy) NSString *loverNick;
@property(nonatomic, copy) NSString *loverErbanNo;
@property(nonatomic, copy) NSString *loverAvatar;
@property(nonatomic, copy) NSString *nick;
@property(nonatomic, copy) NSString *erbanNo;
@property(nonatomic, copy) NSString *avatar;
@property(nonatomic, copy) NSString *picUrl;
@property(nonatomic, copy) NSString *giftName;
@property(nonatomic, copy) NSString *giftId;
@end
@interface AdvertiseModel : PIBaseModel
@property (nonatomic, strong) NSString *link;
@property (nonatomic, assign) SplashInfoSkipType type;// 1跳app页面2跳聊天室3跳h5页面,
@property (nonatomic, copy) NSString *pict;
@property(nonatomic, strong) AdvertiseFillModel *fillVo;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,23 +0,0 @@
//
// AdvertiseModel.m
// YUMI
//
// Created by YUMI on 2022/10/31.
//
#import "AdvertiseModel.h"
@implementation AdvertiseFillModel
@end
@implementation AdvertiseModel
+ (NSDictionary *)objectClassInArray {
return @{
@"fillVo": [AdvertiseFillModel class],
};
}
@end

View File

@@ -1,48 +0,0 @@
//
// YMAdImageTool.h
// YUMI
//
// Created by YUMI on 2022/10/31.
//
#import <Foundation/Foundation.h>
#import "AdvertiseModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface XPAdImageTool : PIBaseModel
+ (instancetype)shareImageTool;
///是否登录成功im
@property (nonatomic,assign)BOOL isImLogin;
//去除广告信息
- (AdvertiseModel *)getAdInfoFromCacheInMainWith:(NSString *)link;
///保存信息
- (void)saveAdInfo:(AdvertiseModel *)adInfo;
/**
* 判断文件是否存在
*/
- (BOOL)isFileExistWithFilePath:(NSString *)filePath;
/**
* 初始化广告页面
*/
- (void)getAdvertisingImage;
/**
* 下载新图片
*/
- (void)downloadAdImageWithUrl:(NSString *)imageUrl imageName:(NSString *)imageName;
/**
* 删除旧图片
*/
- (void)deleteOldImage;
/**
* 根据图片名拼接文件路径
*/
- (NSString *)getFilePathWithImageName:(NSString *)imageName;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,158 +0,0 @@
//
// YMAdImageTool.m
// YUMI
//
// Created by YUMI on 2022/10/31.
//
#import "XPAdImageTool.h"
#import <YYCache/YYCache.h>
#import "UploadFile.h"
#define CACHENAME @"XPUserCache"
UIKIT_EXTERN NSString * const adImageName;
@interface XPAdImageTool ()
@property (nonatomic, strong) YYCache *yyCache;
///广
@property (nonatomic,strong) AdvertiseModel *infoModel;
@end
static XPAdImageTool* tool;
@implementation XPAdImageTool
+ (instancetype)shareImageTool {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
tool = [[XPAdImageTool alloc] init];
});
return tool;
}
- (instancetype)init
{
self = [super init];
if (self) {
self.yyCache = [YYCache cacheWithName:CACHENAME];
}
return self;
}
//广
- (AdvertiseModel *)getAdInfoFromCacheInMainWith:(NSString *)link {
if (link.length > 0) {
if ([self.yyCache containsObjectForKey:link]) {
return (AdvertiseModel *)[self.yyCache objectForKey:link];
}else {
return nil;
}
}else {
return nil;
}
return nil;
}
///
- (void)saveAdInfo:(AdvertiseModel *)adInfo {
self.infoModel = adInfo;
NSArray *stringArr = [adInfo.pict componentsSeparatedByString:@"/"];
NSString *key = stringArr.lastObject;
[self.yyCache setObject:(id<NSCoding> )adInfo forKey:key withBlock:^{
}];
[self getAdvertisingImage];
}
/**
*
*/
- (BOOL)isFileExistWithFilePath:(NSString *)filePath {
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL isDirectory = FALSE;
return [fileManager fileExistsAtPath:filePath isDirectory:&isDirectory];
}
/**
* 广
*/
- (void)getAdvertisingImage {
if (self.infoModel.pict.length > 0) {
NSString *imageUrl = self.infoModel.pict;
//
NSArray *stringArr = [imageUrl componentsSeparatedByString:@"/"];
NSString *imageName = stringArr.lastObject;
//
NSString *filePath = [self getFilePathWithImageName:imageName];
BOOL isExist = [self isFileExistWithFilePath:filePath];
if (!isExist){//
[self downloadAdImageWithUrl:imageUrl imageName:imageName];
}
}else {
[self deleteOldImage];
}
}
/**
*
*/
- (void)downloadAdImageWithUrl:(NSString *)imageUrl imageName:(NSString *)imageName {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *filePath = [self getFilePathWithImageName:imageName]; //
if ([imageUrl.lowercaseString hasSuffix:@"svga"]) {
@kWeakify(self);
[[UploadFile share] download:imageUrl path:filePath complete:^{
@kStrongify(self);
[self deleteOldImage];
[[NSUserDefaults standardUserDefaults] setValue:imageName forKey:adImageName];
[[NSUserDefaults standardUserDefaults] synchronize];
} failure:^{
@kStrongify(self);
[self deleteOldImage];
}];
} else {
NSString *encode = [imageUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:encode]];
UIImage *image = [UIImage imageWithData:data];
if ([UIImagePNGRepresentation(image) writeToFile:filePath atomically:YES]) {//
[self deleteOldImage];
[[NSUserDefaults standardUserDefaults] setValue:imageName forKey:adImageName];
[[NSUserDefaults standardUserDefaults] synchronize];
}else{
[self deleteOldImage];
}
}
});
}
/**
*
*/
- (void)deleteOldImage {
NSString *imageName = [[NSUserDefaults standardUserDefaults] valueForKey:adImageName];
if (imageName) {
NSString *filePath = [self getFilePathWithImageName:imageName];
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath:filePath error:nil];
}
}
/**
*
*/
- (NSString *)getFilePathWithImageName:(NSString *)imageName {
if (imageName) {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES);
NSString *filePath = [[paths xpSafeObjectAtIndex:0] stringByAppendingPathComponent:imageName];
return filePath;
}
return nil;
}
@end

View File

@@ -1,26 +0,0 @@
//
// YMAdvertiseView.h
// YUMI
//
// Created by YUMI on 2022/10/31.
//
#import <UIKit/UIKit.h>
#import "AdvertiseModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface XPAdvertiseView : UIView
/** 显示广告页面方法*/
- (void)show;
/** 图片路径*/
@property (nonatomic, copy) NSString *filePath;
@property(nonatomic, assign) SplashInfoSkipType type;
@property(nonatomic, strong) AdvertiseFillModel *fileModel;
@property (nonatomic, strong) UIImage *adImage;
@property (nonatomic, copy) void(^dismissHandler)(BOOL shouldJump); //闪屏消失回调
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,223 +0,0 @@
//
// YMAdvertiseView.m
// YUMI
//
// Created by YUMI on 2022/10/31.
//
#import "XPAdvertiseView.h"
#import "AppDelegate.h"
//tool
#import <sys/sysctl.h>
#import <sys/utsname.h>
#import "YUMIMacroUitls.h"
///Tool
#import "UIImage+Utils.h"
NSString *const adImageName = @"adImageName";
NSString *const adUrl = @"adUrl";
// 广
static int const showtime = 3;
@interface XPAdvertiseView()
@property (nonatomic, strong) UIImageView *adView;//广
@property (nonatomic, strong) UIButton *countdownButton;//
@property (nonatomic, strong) NSTimer *countTimer;
@property (nonatomic, assign) int count;
@property (nonatomic, strong) UIWindow *window;
@property(nonatomic, strong) NSMutableArray *imageLoaders;
@end
@implementation XPAdvertiseView
#pragma mark - Initialize Methods
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
_adView = [[UIImageView alloc] initWithFrame:frame];
_adView.userInteractionEnabled = YES;
_adView.contentMode = UIViewContentModeScaleAspectFill;
_adView.clipsToBounds = YES;
[self addSubview:_adView];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTapAdViewAction)];
[_adView addGestureRecognizer:tap];
[self addSubview:self.countdownButton];
[self.countdownButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.trailing.mas_equalTo(-24);
// make.width.mas_equalTo(60);
make.height.mas_equalTo(30);
make.top.mas_equalTo(40);
}];
// //
// if ([self needCountDownBtn]) {
// [self addSubview:self.countdownButton];
// }
}
return self;
}
#pragma mark - Public Methods
- (void)show {
// 1GCD
[self gcdCoundownHander];
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
[self.window.rootViewController.view addSubview:self];
[self.window makeKeyAndVisible];
[keyWindow makeKeyWindow];
}
#pragma mark - Event Response
///
- (void)onTapAdViewAction {
[self dismissWithJumpHandle:YES];
}
///
- (void)onClickSkipButton:(UIButton *)sender {
[self dismissWithJumpHandle:NO];
}
#pragma mark - Privite Method
// GCD
- (void)gcdCoundownHander {
__block int timeout = showtime;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0); //
dispatch_source_set_event_handler(_timer, ^{
if (timeout <= 0) { //
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
[self dismissWithJumpHandle:NO];
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
if (self.countdownButton) {
[self.countdownButton setTitle:YMLocalizedString(@"XPAdvertiseView0") forState:UIControlStateNormal];
}
});
timeout--;
}
});
dispatch_resume(_timer);
}
// 广
- (void)dismissWithJumpHandle:(BOOL)shouldJump {
if (self.countTimer) {
[self.countTimer invalidate];
self.countTimer = nil;
}
@kWeakify(self)
[UIView animateWithDuration:0.5f animations:^{
@kStrongify(self)
self.window.hidden = YES;
} completion:^(BOOL finished) {
@kStrongify(self)
[self removeFromSuperview];
self.window = nil;
!self.dismissHandler ?: self.dismissHandler(shouldJump);
}];
}
- (NSString *)deviceName {
// Gets a string with the device model
size_t size;
int nR = sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = (char *)malloc(size);
nR = sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
free(machine);
return platform;
}
- (BOOL)needCountDownBtn {
NSString *platform = [self deviceName];
BOOL needBtn = YES;
if ([platform isEqualToString:@"iPhone6,1"] ||
[platform isEqualToString:@"iPhone6,2"] ||
[platform isEqualToString:@"iPhone7,1"] ||
[platform isEqualToString:@"iPhone7,2"] ||
[platform isEqualToString:@"iPhone8,1"] ||
[platform isEqualToString:@"iPhone8,2"] ||
[platform isEqualToString:@"iPhone8,4"]) {
needBtn = NO;
}
return needBtn;
}
#pragma mark - Setter
- (void)setFilePath:(NSString *)filePath {
}
- (void)updateSvgaImage:(NSString *)imagePath key:(NSString *)key {
}
- (void)updateSvgaText:(NSString *)content key:(NSString *)key {
}
- (void)setAdImage:(UIImage *)adImage {
_adImage = adImage;
_adView.image = [adImage cutImage:[UIScreen mainScreen].bounds.size];
}
#pragma mark - SVGAPlayerDelegate
#pragma mark - Getter
- (UIWindow *)window {
if (_window == nil) {
_window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
_window.windowLevel = UIWindowLevelAlert;
_window.userInteractionEnabled = YES;
_window.rootViewController = [[UIViewController alloc] init];
}
return _window;
}
- (UIButton *)countdownButton {
if (_countdownButton == nil) {
_countdownButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_countdownButton addTarget:self action:@selector(onClickSkipButton:) forControlEvents:UIControlEventTouchUpInside];
[_countdownButton setTitle:YMLocalizedString(@"XPAdvertiseView1") forState:UIControlStateNormal];
_countdownButton.titleLabel.font = [UIFont systemFontOfSize:15];
[_countdownButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
_countdownButton.backgroundColor = [UIColor colorWithRed:38 /255.0 green:38 /255.0 blue:38 /255.0 alpha:0.6];
_countdownButton.layer.cornerRadius = 4;
_countdownButton.contentEdgeInsets = UIEdgeInsetsMake(0, 8, 0, 8);
[_countdownButton sizeToFit];
}
return _countdownButton;
}
@end

View File

@@ -1,16 +0,0 @@
//
// MSBaseRTLFlowLayout.h
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface MSBaseRTLFlowLayout : UICollectionViewFlowLayout
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,21 +0,0 @@
//
// MSBaseRTLFlowLayout.m
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import "MSBaseRTLFlowLayout.h"
@implementation MSBaseRTLFlowLayout
- (UIUserInterfaceLayoutDirection)effectiveUserInterfaceLayoutDirection {
if (isMSRTL()) {
return UIUserInterfaceLayoutDirectionRightToLeft;
}
return UIUserInterfaceLayoutDirectionLeftToRight;
}
- (BOOL)flipsHorizontallyInOppositeLayoutDirection{
return YES;
}
@end

View File

@@ -1,16 +0,0 @@
//
// MSBaseTextField.h
// YuMi
//
// Created by duoban on 2024/4/15.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface MSBaseTextField : UITextField
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,62 +0,0 @@
//
// MSBaseTextField.m
// YuMi
//
// Created by duoban on 2024/4/15.
//
#import <ReactiveObjC.h>
#import "MSBaseTextField.h"
@interface MSBaseTextField()
@property(nonatomic,strong)UILabel *textView;
@end
@implementation MSBaseTextField
-(instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if(self){
[self installUI];
[self installConstraints];
}
return self;
}
-(void)installUI{
[self addSubview:self.textView];
[self.textView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self);
make.leading.equalTo(self).inset(kGetScaleWidth(5));
}];
//使RACmyString
@kWeakify(self);
[RACObserve(self, text) subscribeNext:^(id _Nullable x) {
@kStrongify(self)
NSString *text = [NSString stringWithFormat:@"%@",x];
self.textView.hidden = text.length > 0;
}];
[self addTarget:self action:@selector(ms_textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}
-(void)installConstraints{
}
#pragma mark -
-(instancetype)init{
self = [super init];
if(self){
[self installUI];
}
return self;
}
-(void)ms_textFieldDidChange:(UITextField *)textField{
self.textView.hidden = textField.text.length > 0;
}
-(void)setAttributedPlaceholder:(NSAttributedString *)attributedPlaceholder{
_textView.attributedText = attributedPlaceholder;
}
- (UILabel *)textView{
if(!_textView){
_textView = [UILabel new];
}
return _textView;
}
@end

View File

@@ -1,22 +0,0 @@
//
// MSRTL.h
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NSMutableAttributedString (MSRTL)
/// 用来改变布局方向插入此空白字符串则转化为RTL布局
+ (NSMutableAttributedString *)createBlankAttributeToMSRTL;
/// 用来解决YYText在RTL下的bug如果昵称是阿语整个富文本宽度计算会有误在昵称前插入此空白字符串可以修正布局。“i”可以是随意字母或中文
+ (NSMutableAttributedString *)createBlankAttributeToMSLTR;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,27 +0,0 @@
//
// MSRTL.m
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import "NSMutableAttributedString+MSRTL.h"
@implementation NSMutableAttributedString (MSRTL)
/// RTL
+ (NSMutableAttributedString *)createBlankAttributeToMSRTL {
NSMutableAttributedString *attribute = [[NSMutableAttributedString alloc] initWithString:@"\u202B"];
[attribute addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:0], NSForegroundColorAttributeName: UIColor.clearColor} range:NSMakeRange(0, attribute.length)];
return attribute;
}
/// YYTextRTLbugi
+ (NSMutableAttributedString *)createBlankAttributeToMSLTR {
NSMutableAttributedString *attribute = [[NSMutableAttributedString alloc] initWithString:@"\u202A"];
[attribute addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:0], NSForegroundColorAttributeName: UIColor.clearColor} range:NSMakeRange(0, attribute.length)];
return attribute;
}
@end

View File

@@ -1,16 +0,0 @@
//
// MSRTL.h
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIButton (MSRTL)
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,52 +0,0 @@
//
// MSRTL.m
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import "UIButton+MSRTL.h"
@implementation UIButton (MSRTL)
UIEdgeInsets RSRTLEdgeInsetsWithInsets(UIEdgeInsets insets) {
if (insets.left != insets.right && isMSRTL()) {
CGFloat temp = insets.left;
insets.left = insets.right;
insets.right = temp;
}
return insets;
}
+ (void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method oldMethod = class_getInstanceMethod(self, @selector(setContentEdgeInsets:));
Method newMethod = class_getInstanceMethod(self, @selector(msrtl_setContentEdgeInsets:));
method_exchangeImplementations(oldMethod, newMethod);
Method oldImageMethod = class_getInstanceMethod(self, @selector(setImageEdgeInsets:));
Method newImageMethod = class_getInstanceMethod(self, @selector(msrtl_setImageEdgeInsets:));
method_exchangeImplementations(oldImageMethod,newImageMethod);
Method oldTitleMethod = class_getInstanceMethod(self, @selector(setTitleEdgeInsets:));
Method newTitleMethod = class_getInstanceMethod(self, @selector(msrtl_setTitleEdgeInsets:));
method_exchangeImplementations(oldTitleMethod,newTitleMethod);
});
}
- (void)msrtl_setContentEdgeInsets:(UIEdgeInsets)contentEdgeInsets {
[self msrtl_setContentEdgeInsets:RSRTLEdgeInsetsWithInsets(contentEdgeInsets)];
}
- (void)msrtl_setImageEdgeInsets:(UIEdgeInsets)imageEdgeInsets {
[self msrtl_setImageEdgeInsets:RSRTLEdgeInsetsWithInsets(imageEdgeInsets)];
}
- (void)msrtl_setTitleEdgeInsets:(UIEdgeInsets)titleEdgeInsets {
[self msrtl_setTitleEdgeInsets:RSRTLEdgeInsetsWithInsets(titleEdgeInsets)];
}
@end

View File

@@ -1,20 +0,0 @@
//
// MSRTL.h
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIImage (MSRTL)
/// 需要阿语翻转的图片
/// [[UIImage imageNamed:@"xxx"] mssetImageForRTL];
- (UIImage *)ms_SetImageForRTL;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,22 +0,0 @@
//
// MSRTL.m
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import "UIImage+MSRTL.h"
@implementation UIImage (MSRTL)
- (UIImage *)ms_SetImageForRTL {
if (isMSRTL()) {
return [UIImage imageWithCGImage:self.CGImage
scale:self.scale
orientation:UIImageOrientationUpMirrored];
}
return self;
}
@end

View File

@@ -1,16 +0,0 @@
//
// MSRTL.h
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UILabel (MSRTL)
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,94 +0,0 @@
//
// MSRTL.m
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import "UILabel+MSRTL.h"
#import "NSMutableAttributedString+MSRTL.h"
BOOL isMSRTLString(NSString *string) {
if ([string hasPrefix:@"\u202B"] || [string hasPrefix:@"\u202A"]) {
return YES;
}
return NO;
}
NSString * MSRTLString(NSString *string) {
if (string.length == 0 || isMSRTLString(string)) {
return string;
}
if (isMSRTL()) {
string = [@"\u202B" stringByAppendingString:string];
} else {
string = [@"\u202A" stringByAppendingString:string];
}
return string;
}
@implementation UILabel (MSRTL)
+ (void)load {
Method oldInitMethod = class_getInstanceMethod(self,@selector(initWithFrame:));
Method newInitMethod = class_getInstanceMethod(self, @selector(msrtl_initWithFrame:));
method_exchangeImplementations(oldInitMethod, newInitMethod); //
Method oldTextAlignmentMethod = class_getInstanceMethod(self,@selector(setTextAlignment:));
Method newTextAlignmentMethod = class_getInstanceMethod(self, @selector(msrtl_setTextAlignment:));
method_exchangeImplementations(oldTextAlignmentMethod, newTextAlignmentMethod); //
Method oldTextMethod1 = class_getInstanceMethod(self,@selector(setAttributedText:));
Method newTextMethod1 = class_getInstanceMethod(self, @selector(msrtl_setAttributedText:));
method_exchangeImplementations(oldTextMethod1, newTextMethod1);
}
-(void)msrtl_setAttributedText:(NSAttributedString *)attributedText{
if(attributedText == nil)return;
NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc]init];
if([NSStringFromClass([self class])isEqualToString:@"UITextFieldLabel"] || self.textAlignment == NSTextAlignmentCenter){
if (isMSRTL() ) {
// RTL
[attributedString appendAttributedString:[NSMutableAttributedString createBlankAttributeToMSRTL]];
}
[attributedString appendAttributedString:attributedText];
[self msrtl_setAttributedText:attributedString];
return;
}
if (isMSRTL() ) {
// RTL
[attributedString appendAttributedString:[NSMutableAttributedString createBlankAttributeToMSRTL]];
}
[attributedString appendAttributedString:attributedText];
[self msrtl_setAttributedText:attributedString];
}
- (instancetype)msrtl_initWithFrame:(CGRect)frame {
if ([self msrtl_initWithFrame:frame]) {
self.textAlignment = NSTextAlignmentNatural;
}
return self;
}
- (void)msrtl_setTextAlignment:(NSTextAlignment)textAlignment {
if (isMSRTL()) {
if (textAlignment == NSTextAlignmentNatural || textAlignment == NSTextAlignmentLeft) {
textAlignment = NSTextAlignmentRight;
} else if (textAlignment == NSTextAlignmentRight) {
textAlignment = NSTextAlignmentLeft;
}
}
[self msrtl_setTextAlignment:textAlignment];
}
@end

View File

@@ -1,16 +0,0 @@
//
// UINavigationController+MSRTL.h
// YuMi
//
// Created by duoban on 2024/4/12.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UISwipeGestureRecognizer (MSRTL)
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,36 +0,0 @@
//
// UINavigationController+MSRTL.m
// YuMi
//
// Created by duoban on 2024/4/12.
//
#import "UISwipeGestureRecognizer+MSRTL.h"
@implementation UISwipeGestureRecognizer (MSRTL)
+ (void)load
{
Method oldAttMethod = class_getInstanceMethod(self,@selector(setDirection:));
Method newAttMethod = class_getInstanceMethod(self,@selector(msrtl_setDirection:));
method_exchangeImplementations(oldAttMethod, newAttMethod); //
}
- (void)msrtl_setDirection:(UISwipeGestureRecognizerDirection)direction
{
if (isMSRTL()) {
if (direction == UISwipeGestureRecognizerDirectionRight) {
direction = UISwipeGestureRecognizerDirectionLeft;
} else if (direction == UISwipeGestureRecognizerDirectionLeft) {
direction = UISwipeGestureRecognizerDirectionRight;
}
}
[self msrtl_setDirection:direction];
}
@end

View File

@@ -1,16 +0,0 @@
//
// UITextField+MSRTL.h
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UITextField (MSRTL)
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,69 +0,0 @@
//
// UITextField+MSRTL.m
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import "UITextField+MSRTL.h"
@implementation UITextField (MSRTL)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method oldInitMethod = class_getInstanceMethod(self,@selector(initWithFrame:));
Method newInitMethod = class_getInstanceMethod(self, @selector(msrtl_initWithFrame:));
method_exchangeImplementations(oldInitMethod, newInitMethod); //
// Method oldTextMethod1 = class_getInstanceMethod(self,@selector(setPlaceholder:));
// Method newTextMethod1 = class_getInstanceMethod(self, @selector(msrtl_setPlaceholder:));
// method_exchangeImplementations(oldTextMethod1, newTextMethod1); //
//
// Method oldTextMethod = class_getInstanceMethod(self,@selector(setTextAlignment:));
// Method newTextMethod = class_getInstanceMethod(self, @selector(msrtl_setTextAlignment:));
// method_exchangeImplementations(oldTextMethod, newTextMethod); //
Method oldMethod = class_getInstanceMethod(self,@selector(setAttributedPlaceholder:));
Method newMethod = class_getInstanceMethod(self, @selector(msrtl_setAttributedPlaceholder:));
method_exchangeImplementations(oldMethod, newMethod); //
});
}
- (void)msrtl_setTextAlignment:(NSTextAlignment)textAlignment {
if (isMSRTL()) {
if (textAlignment == NSTextAlignmentNatural || textAlignment == NSTextAlignmentLeft) {
textAlignment = NSTextAlignmentRight;
} else if (textAlignment == NSTextAlignmentRight) {
textAlignment = NSTextAlignmentLeft;
}
}
[self msrtl_setTextAlignment:textAlignment];
}
- (instancetype)msrtl_initWithFrame:(CGRect)frame {
if ([self msrtl_initWithFrame:frame]) {
if(isMSRTL()){
self.textAlignment = NSTextAlignmentRight;
}
}
return self;
}
- (void)msrtl_setAttributedPlaceholder:(NSAttributedString *)attributedPlaceholder{
NSMutableAttributedString *att = [[NSMutableAttributedString alloc]initWithAttributedString:attributedPlaceholder];
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
NSTextAlignment textAli = NSTextAlignmentLeft;
paragraph.alignment = textAli;
[att addAttributes:@{NSParagraphStyleAttributeName: paragraph} range:[attributedPlaceholder.string rangeOfString:attributedPlaceholder.string]];
[self msrtl_setAttributedPlaceholder:att];
}
- (void)msrtl_setPlaceholder:(NSString *)placeholder {
if(placeholder == nil)return;
NSAttributedString * attribute = [[NSAttributedString alloc] initWithString:placeholder];
self.attributedPlaceholder = attribute;
}
@end

View File

@@ -1,15 +0,0 @@
//
// UITextView+MSRTL.h
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UITextView (MSRTL)
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,65 +0,0 @@
//
// UITextView+MSRTL.m
// YuMi
//
// Created by duoban on 2024/4/11.
//
#import "UITextView+MSRTL.h"
@implementation UITextView (MSRTL)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method oldInitMethod = class_getInstanceMethod(self,@selector(initWithFrame:));
Method newInitMethod = class_getInstanceMethod(self, @selector(msrtl_initWithFrame:));
method_exchangeImplementations(oldInitMethod, newInitMethod); //
Method oldTextMethod = class_getInstanceMethod(self,@selector(setTextAlignment:));
Method newTextMethod = class_getInstanceMethod(self, @selector(msrtl_setTextAlignment:));
method_exchangeImplementations(oldTextMethod, newTextMethod); //
// Method oldTextMethod1 = class_getInstanceMethod(self,@selector(setPlaceholder:));
// Method newTextMethod1 = class_getInstanceMethod(self, @selector(msrtl_setPlaceholder:));
// method_exchangeImplementations(oldTextMethod1, newTextMethod1); //
//
//
// Method oldMethod = class_getInstanceMethod(self,@selector(setAttributedPlaceholder:));
// Method newMethod = class_getInstanceMethod(self, @selector(msrtl_setAttributedPlaceholder:));
// method_exchangeImplementations(oldMethod, newMethod); //
});
}
- (instancetype)msrtl_initWithFrame:(CGRect)frame {
if ([self msrtl_initWithFrame:frame]) {
self.textAlignment = NSTextAlignmentNatural;
}
return self;
}
- (void)msrtl_setTextAlignment:(NSTextAlignment)textAlignment {
if (isMSRTL()) {
if (textAlignment == NSTextAlignmentNatural || textAlignment == NSTextAlignmentLeft) {
textAlignment = NSTextAlignmentRight;
} else if (textAlignment == NSTextAlignmentRight) {
textAlignment = NSTextAlignmentLeft;
}
}
[self msrtl_setTextAlignment:textAlignment];
}
- (void)msrtl_setAttributedPlaceholder:(NSAttributedString *)attributedPlaceholder{
NSMutableAttributedString *att = [[NSMutableAttributedString alloc]initWithAttributedString:attributedPlaceholder];
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
NSTextAlignment textAli = isMSRTL() ? NSTextAlignmentRight : NSTextAlignmentLeft;
paragraph.alignment = textAli;
[att addAttributes:@{NSParagraphStyleAttributeName: paragraph} range:[attributedPlaceholder.string rangeOfString:attributedPlaceholder.string]];
[self msrtl_setAttributedPlaceholder:att];
}
- (void)msrtl_setPlaceholder:(NSString *)placeholder {
// NSAttributedString * attribute = [[NSAttributedString alloc] initWithString:placeholder];
// self.attributedPlaceholder = attribute;
}
@end

View File

@@ -1,16 +0,0 @@
//
// MSRTL.h
// YuMi
//
// Created by duoban on 2024/4/15.
//
#import <YYText/YYText.h>
NS_ASSUME_NONNULL_BEGIN
@interface YYLabel (MSRTL)
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,55 +0,0 @@
//
// MSRTL.m
// YuMi
//
// Created by duoban on 2024/4/15.
//
#import "YYLabel+MSRTL.h"
#import "NSMutableAttributedString+MSRTL.h"
BOOL isRTLString(NSString *string) {
if ([string hasPrefix:@"\u202B"]) {
return YES;
}
return NO;
}
@implementation YYLabel (MSRTL)
+ (void)load {
Method oldTextMethod = class_getInstanceMethod(self,@selector(setAttributedText:));
Method newTextMethod = class_getInstanceMethod(self, @selector(msrtl_setAttributedText:));
method_exchangeImplementations(oldTextMethod, newTextMethod); //
}
-(void)msrtl_setAttributedText:(NSAttributedString *)attributedText{
if(attributedText == nil)return;
NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc]init];
if(self.textAlignment == NSTextAlignmentCenter){
if (isMSRTL()) {
[attributedString appendAttributedString:[NSMutableAttributedString createBlankAttributeToMSRTL]];
// [attributedString appendAttributedString:[NSMutableAttributedString createBlankAttributeToMSLTR]];
}
[attributedString appendAttributedString:attributedText];
[self msrtl_setAttributedText:attributedString];
return;
}
if (isMSRTL()) {
[attributedString appendAttributedString:[NSMutableAttributedString createBlankAttributeToMSRTL]];
// [attributedString appendAttributedString:[NSMutableAttributedString createBlankAttributeToMSLTR]];
}
[attributedString appendAttributedString:attributedText];
[self msrtl_setAttributedText:attributedString];
if(isMSRTL()){
self.textAlignment = NSTextAlignmentRight;
}else{
if (self.textAlignment == NSTextAlignmentNatural) {
self.textAlignment = NSTextAlignmentLeft;
}
}
}
@end

View File

@@ -1,40 +0,0 @@
//
// UIButton+EnlargeTouchArea.h
// XCCategrayKit
//
// Created by Macx on 2018/8/30.
// Copyright © 2018年 KevinWang. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface UIButton (EnlargeTouchArea)
@property (nonatomic, assign) NSTimeInterval yn_acceptEventInterval; // 重复点击的间隔
//图片frmae
@property (strong, nonatomic) NSValue *imageFrame;
//标题frmae
@property (strong, nonatomic) NSValue *titleFrame;
/**
通过 hitTest:withEvent: 扩大btn的点击范围
注:填写的都是 在button 原frame 上面 扩大的对应的值
@param top 顶部 扩大的值
@param right 右边 扩大的值
@param bottom 底部 扩大的值
@param left 左边 扩大的值
*/
- (void)setEnlargeEdgeWithTop:(CGFloat)top right:(CGFloat)right bottom:(CGFloat)bottom left:(CGFloat)left;
/**
扩大按钮点击范围
@discussion setEnlargeEdgeWithTop:right:bottom:left:方法的包装
*/
- (void)enlargeTouchArea:(UIEdgeInsets)insets;
+(UIButton *)buttonInitWithText:(NSString *)text font:(UIFont *)font textColor:(UIColor *)textColor image:(UIImage *)image bgImage:(UIImage *)bgImage;
@end

View File

@@ -1,192 +0,0 @@
//
// UIButton+EnlargeTouchArea.m
// XCCategrayKit
//
// Created by Macx on 2018/8/30.
// Copyright © 2018 KevinWang. All rights reserved.
//
#import "UIButton+EnlargeTouchArea.h"
#import <objc/runtime.h>
#define defaultInterval 0.0003 //,
@interface UIButton ()
/**
* bool YES NO
*/
@property (nonatomic, assign) BOOL isIgnoreEvent;
@end
@implementation UIButton (EnlargeTouchArea)
static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
static const char *UIControl_enventIsIgnoreEvent = "UIControl_enventIsIgnoreEvent";
// C
static const char *imageFrameStr = "imageFrame";
static const char *titleFrameStr = "titleFrame";
+ (void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method newImageMethod = class_getInstanceMethod(self, @selector(new_imageRectForContentRect:));
Method oldImageMethod = class_getInstanceMethod(self, @selector(imageRectForContentRect:));
method_exchangeImplementations(newImageMethod, oldImageMethod);
Method newTitleMethod = class_getInstanceMethod(self, @selector(new_titleRectForContentRect:));
Method oldTitleMethod = class_getInstanceMethod(self, @selector(titleRectForContentRect:));
method_exchangeImplementations(newTitleMethod, oldTitleMethod);
//selectorMethod
SEL selA = @selector(sendAction:to:forEvent:);
SEL selB = @selector(new_sendAction:to:forEvent:);
Method methodA = class_getInstanceMethod(self,selA);
Method methodB = class_getInstanceMethod(self, selB);
//
BOOL isAdd = class_addMethod(self, selA, method_getImplementation(methodB), method_getTypeEncoding(methodB));
if (isAdd) {//->
class_replaceMethod(self, selB, method_getImplementation(methodA), method_getTypeEncoding(methodA));
}else{//->
// methodBmethodAmethodBIMP
method_exchangeImplementations(methodA, methodB);
}
});
}
- (void)new_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
self.yn_acceptEventInterval = self.yn_acceptEventInterval == 0 ? defaultInterval : self.yn_acceptEventInterval;
if (self.isIgnoreEvent){//
return;
}
if (self.yn_acceptEventInterval > 0){//eventTimeInterval
[self performSelector:@selector(setNoIgnoreEvent) withObject:nil afterDelay:self.yn_acceptEventInterval];
}
self.isIgnoreEvent = YES;//
[self new_sendAction:action to:target forEvent:event];
}
// runtime
- (BOOL)isIgnoreEvent{
return [objc_getAssociatedObject(self, UIControl_enventIsIgnoreEvent) boolValue];
}
-(void)setNoIgnoreEvent{
self.isIgnoreEvent = NO;
}
- (void)setIsIgnoreEvent:(BOOL)isIgnoreEvent {
objc_setAssociatedObject(self, UIControl_enventIsIgnoreEvent, @(isIgnoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(void)setYn_acceptEventInterval:(NSTimeInterval)yn_acceptEventInterval{
objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(yn_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSTimeInterval)yn_acceptEventInterval{
return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];
}
- (void)setImageFrame:(NSValue *)imageFrame{
objc_setAssociatedObject(self, imageFrameStr, imageFrame, OBJC_ASSOCIATION_RETAIN);
}
- (NSValue *)imageFrame{
return objc_getAssociatedObject(self, imageFrameStr);
}
- (void)setTitleFrame:(NSValue *)titleFrame{
objc_setAssociatedObject(self, titleFrameStr, titleFrame, OBJC_ASSOCIATION_RETAIN);
}
- (NSValue *)titleFrame{
return objc_getAssociatedObject(self, titleFrameStr);
}
- (CGRect)new_imageRectForContentRect:(CGRect)contentRect{
if (CGRectEqualToRect(self.imageFrame.CGRectValue, CGRectZero)) {
return [self new_imageRectForContentRect:contentRect];
}
return self.imageFrame.CGRectValue;
}
- (CGRect)new_titleRectForContentRect:(CGRect)contentRect{
if (CGRectEqualToRect(self.titleFrame.CGRectValue, CGRectZero)) {
return [self new_titleRectForContentRect:contentRect];
}
return self.titleFrame.CGRectValue;
}
static char topNameKey;
static char rightNameKey;
static char bottomNameKey;
static char leftNameKey;
- (void)setEnlargeEdgeWithTop:(CGFloat)top right:(CGFloat)right bottom:(CGFloat)bottom left:(CGFloat)left
{
objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:top], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:right], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:bottom], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:left], OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (void)enlargeTouchArea:(UIEdgeInsets)insets
{
[self setEnlargeEdgeWithTop:insets.top
right:insets.right
bottom:insets.bottom
left:insets.left];
}
- (CGRect)enlargedRect
{
NSNumber* topEdge = objc_getAssociatedObject(self, &topNameKey);
NSNumber* rightEdge = objc_getAssociatedObject(self, &rightNameKey);
NSNumber* bottomEdge = objc_getAssociatedObject(self, &bottomNameKey);
NSNumber* leftEdge = objc_getAssociatedObject(self, &leftNameKey);
if (topEdge && rightEdge && bottomEdge && leftEdge)
{
return CGRectMake(self.bounds.origin.x - leftEdge.floatValue,
self.bounds.origin.y - topEdge.floatValue,
self.bounds.size.width + leftEdge.floatValue + rightEdge.floatValue,
self.bounds.size.height + topEdge.floatValue + bottomEdge.floatValue);
}
else
{
return self.bounds;
}
}
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
if(self.hidden) return nil;
CGRect rect = [self enlargedRect];
if (CGRectEqualToRect(rect, self.bounds))
{
return [super hitTest:point withEvent:event];
}
return CGRectContainsPoint(rect, point) ? self : nil;
}
+(UIButton *)buttonInitWithText:(NSString *)text font:(UIFont *)font textColor:(UIColor *)textColor image:(UIImage *)image bgImage:(UIImage *)bgImage{
UIButton *button = [[UIButton alloc]initWithFrame:CGRectZero];
if(text.length > 0){
[button setTitle:text forState:UIControlStateNormal];
}
if(font != nil){
button.titleLabel.font = font;
}
if(textColor != nil){
[button setTitleColor:textColor forState:UIControlStateNormal];
}
if (image != nil){
[button setImage:image forState:UIControlStateNormal];
}
if(bgImage != nil){
[button setBackgroundImage:bgImage forState:UIControlStateNormal];
}
return button;
}
@end

View File

@@ -672,32 +672,7 @@ class EPLoginTypesViewController: BaseViewController {
/// Captcha WebView
/// - Parameter completion:
private func loadCaptchaWebView(completion: @escaping () -> Void) {
guard ClientConfig.share().shouldDisplayCaptcha else {
//
completion()
return
}
view.endEditing(true)
let webVC = XPWebViewController(roomUID: nil)
webVC.view.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width * 0.8, height: UIScreen.main.bounds.width * 1.2)
webVC.view.backgroundColor = .clear
webVC.view.layer.cornerRadius = 12
webVC.view.layer.masksToBounds = true
webVC.isLoginStatus = false
webVC.isPush = false
webVC.hideNavigationBar()
webVC.url = URLWithType(.captchaSwitch)
webVC.verifyCaptcha = { result in
if result {
TTPopup.dismiss()
completion()
}
}
TTPopup.popupView(webVC.view, style: .alert)
}
}

View File

@@ -4,42 +4,19 @@
//
// Created by YUMI on 2021/9/13.
//
///一些项目中所用到的key
///项目配置常量
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface YUMIConstant : NSObject
UIKIT_EXTERN NSString * const kRoomMiniNotificationKey;
UIKIT_EXTERN NSString * const kVisitorUnReadCountNotificationKey;
UIKIT_EXTERN NSString * const kHadShowNewUserGiftKey;
UIKIT_EXTERN NSString * const kRedPacketHistory;
UIKIT_EXTERN NSString * const kTuWenMessageHistory;///图文消息已读记录
UIKIT_EXTERN NSString * const kRoomQuickMessageCloseCount;
UIKIT_EXTERN NSString * const kLoginMethod;
UIKIT_EXTERN NSString * const kMessageFromPublicRoomWithAttachmentNotification;
UIKIT_EXTERN NSString * const kRoomGiftEffectUpdateNotificationKey;
/// 配置Key类型枚举仅保留实际使用的类型
typedef NS_ENUM(NSUInteger, Pi_KeyType) {
KeyType_PasswordEncode,///密码 des 加密的
KeyType_TRTC,///TRTC key
KeyType_NetEase,///云信的key
keyType_YiDunBussinessId,///易盾的id
keyType_YiDunPhotoBussinessId,///易盾图片的id
KeyType_FacePwdEncode, ///表情包解密key
KeyType_SudGameAppID,///小游戏APPID
KeyType_SudGameAppKey,///小游戏APPKey
///家族公会key
KeyType_GuildUidKey,
///系统通知
KeyType_SystemNotifiUidKey,
///小秘书
KeyType_SecretaryUidKey,
///参数加密
KeyType_Sign,
KeyType_Sign = 0, ///参数加密签名Key
};
/// 获取当前项目中所用到的 type 所对应的 value 的值 type 类型
/// 获取指定类型的配置值
NSString * const KeyWithType(Pi_KeyType type);
@end

View File

@@ -6,104 +6,16 @@
//
#import "YUMIConstant.h"
#import "AESUtils.h"
@implementation YUMIConstant
/// AES miyao 14257fewedfgh abcedgf
NSString * const kRoomMiniNotificationKey = @"ESkVolktPxd1sZsH4yccGD5S49crhLjAGMVnH3TeQjw=";
NSString * const kRoomGiftEffectUpdateNotificationKey = @"vNba94B4Zlh56Eb1VTbkLO1dVTROgaL5uVHAkQz9A92JkuP/lD+63ZgfhDId93Sm";
NSString * const kHomeMoreScrollPageKey = @"gf6PRnJmby4FIMvi75ZSRqCO4udLaWxSUj6b26l7HOE=";
NSString * const kVisitorUnReadCountNotificationKey = @"gebsDgmM0iXmwnTEcqgP9EIC8aLUT0lK4t05kHYQADjBhVJmLIafi90V/wXgWPM7";
NSString * const kRoomBackMusicCaptureVolumeKey = @"9N5Ei+Ch6nkmH1LzZET4ZjYSzXKFbavt+6lU+45eQa8=";/// key
NSString * const kRoomBackMusicAudioMixingVolumeKey = @"JuJZKfNgZQ7s25PjQcGG97za686ecXI1lylS9PSLrayNeY2l1me4NyyYUXHGaJP0";///
NSString * const kRoomBackMusicPlayMusicOrderKey = @"xjtpOpnLgX00F9HgwT1FISMQPkxXj5cpE2vYc2acOR0=";/// 1 0
NSString * const kRoomBackMusicPlayMusicFinishKey = @"xjtpOpnLgX00F9HgwT1FIf5yt3rZb+KP9BT0F9AgD7I8M+2JTSYq+jDIEx1e6qdC";/// key
NSString * const kHadShowNewUserGiftKey = @"OHIPXsTBvyt1zwNqr4f6YJkIycUshwhKIpC5Pm2nVVU=";//
NSString * const kNewUserRechargeKey = @"fmslcb104aFPWxdSGkMg6lmyehgB3uCu9V/FqzVpL+8=";//
NSString * const kFromSearchToHomeViewKey = @"pr5yHog50uSsZLKj2nA6Ono3Mq/bLTDyngBNDVRkhgg=";//
NSString * const kTabShowAnchorCardKey = @"MIO0LwD8MCBISnBOps47VF1waAwY+/XFOm2C3luic/k="; //tab
NSString * const kRedPacketHistory = @"nwKkblakw5CH37vvs9YcSjHhVHcOoeZMmE09gg7Ymhk";
NSString * const kTuWenMessageHistory = @"AMRtf6yOWYapbYqqOBK+m5IUPsFN5hfbOpPkrYvOr1E=";//
NSString * const kRoomQuickMessageCloseCount = @"bUi7KnisS+mmUMj45e9s4VycnvRvBViGvd/ouRS4SHo=";//
NSString * const kShieldingNotification = @"a1NoaWVsZGluZ05vdGlmaWNhdGlvbg==";///
NSString * const kRoomKickoutTime = @"a1Jvb21LaWNrb3V0VGltZQ==";///
///
NSString * const kGiveDiamondDailyNum = @"a0dpdmVEaWFtb25kRGFpbHlOdW0=";
///
NSString * const kInviteMemeberSuccess = @"a0ludml0ZU1lbWViZXJTdWNjZXNz";
NSString * const kUserFirstRegisterKey = @"kUserFirstRegisterKey";
///
NSString * const kLoginMethod = @"a0xvZ2luTWV0aG9k";
NSString * const kRequestTicket = @"a1JlcXVlc3RSaWNrZXQ=";
NSString * const kUpdateSoundInfo = @"kUpdateSoundInfo";
NSString * const kMineInfoDelTag = @"kMineInfoDelTag";
NSString * const kOpenRoomNotification = @"kOpenRoomNotification";///
NSString * const kRoomRoomLittleGameMiniStageNotificationKey = @"kRoomRoomLittleGameMiniStageNotificationKey";///
NSString * const kFreeGiftCountdownNotification = @"kFreeGiftCountdownNotification";///
NSString * const kMessageFromPublicRoomWithAttachmentNotification = @"MessageFromPublicRoomWithAttachmentNotification";///
///
///
NSString * const KeyWithType(Pi_KeyType type) {
BOOL isRelase = YES;
#ifdef DEBUG
NSString *isProduction = [[NSUserDefaults standardUserDefaults]valueForKey:@"kIsProductionEnvironment"];
if([isProduction isEqualToString:@"YES"]){
isRelase = YES;
}else{
isRelase = NO;
// KeyAPI
if (type == KeyType_Sign) {
return @"rpbs6us1m8r2j9g6u06ff2bo18orwaya";
}
#else
isRelase = YES;
#endif
///
if(isRelase == NO){
NSDictionary * dic = @{
@(KeyType_PasswordEncode) : @"1ea53d260ecf11e7b56e00163e046a26",
@(KeyType_TRTC) : @"1400741885",
@(KeyType_NetEase) : @"79bc37000f4018a2a24ea9dc6ca08d32",
// @(keyType_YiDunBussinessId) : @"3611b99d0457202a7f69151288183236",
// @(keyType_YiDunPhotoBussinessId) : @"",
@(KeyType_FacePwdEncode) : @"1ea53d260ecf11e7b56e00163e046a26",
@(KeyType_SudGameAppID) : @"1578948593831571457",
@(KeyType_SudGameAppKey) : @"J9lHOXvFWkAZiTfl4SK7IGt0wDnW3fWd",
@(KeyType_GuildUidKey) : @"938284",
@(KeyType_SystemNotifiUidKey) : @"938283",
@(KeyType_SecretaryUidKey) : @"938282",
@(KeyType_Sign) : @"rpbs6us1m8r2j9g6u06ff2bo18orwaya"
};
NSString * value = [dic objectForKey:@(type)];
return value;
}
NSDictionary *newDic = @{
@(KeyType_SudGameAppID) : @"1578948593831571457",///
@(KeyType_SudGameAppKey) : @"J9lHOXvFWkAZiTfl4SK7IGt0wDnW3fWd",///
// @(keyType_YiDunBussinessId) : @"f459972b432106844b89fd58c92b8061",
// @(keyType_YiDunPhotoBussinessId) : @"",
@(KeyType_TRTC) : @"1400823228",///
@(KeyType_NetEase) : @"7371d729710cd6ce3a50163b956b5eb6",///
@(KeyType_FacePwdEncode) : @"1ea53d260ecf11e7b56e00163e046a26",///
@(KeyType_PasswordEncode) : @"1ea53d260ecf11e7b56e00163e046a26",///
@(KeyType_Sign) : @"rpbs6us1m8r2j9g6u06ff2bo18orwaya"
};
NSString * newValue = [newDic objectForKey:@(type)];
if(newValue != nil){
return newValue;
}
NSDictionary * dic = @{
@(KeyType_GuildUidKey) : @"umyLNHTFzWIPw2FWQcYIeQ==",
@(KeyType_SystemNotifiUidKey) : @"ZacsLJGoW2hbNoXo32DnaA==",
@(KeyType_SecretaryUidKey) : @"cHTJhjYL9UXGs8NJSFxhdg=="
};
NSString * value = [dic objectForKey:@(type)];
NSString * number = [AESUtils aesDecrypt:value];
return number;
return @"";
}
@end

View File

@@ -11,115 +11,12 @@ NS_ASSUME_NONNULL_BEGIN
@interface YUMIHtmlUrl : NSObject
/// URL类型枚举仅保留实际使用的类型
typedef NS_ENUM(NSUInteger, URLType) {
kPrivacyURL,///隐私政策
kPrivacySDKURL,// 隐私政策-SDK
kPrivacyPersonalURL,// 隐私政策-个人信息
kPrivacyDeviceURL,// 隐私政策-设备权限
kUserProtocalURL, ///用户协议
kUserInviteFriendURL, ///邀请好友
kFAQURL,///帮助
kIdentityURL,///实名认证
kGameBindAccountURL,
kNurseryURL,///护苗计划
kRechargePrivacyURL,////充值协议
kReportRoomURL,///举报房间
///分享房间
kShareRoomURL,
/// 获奖记录
kCandyTreeRecordURL,
/// 糖果树玩法规则
kCandyTreeRuleURL,
///房间魅力榜
kRoomCharmRankURL,
///房间榜
kRoomRankURL,
///房间小时榜
kRoomHourRankURL,
///用户等级
kUserLevelURL,
///平台榜单入口
kHomeRankURL,
///相亲规则介绍
kRoomDatingRule,
///VIP规则
kNobleRuleURL,
///VIP排行榜
kNobleRankURL,
///用户充值协议
kUserRechargeAgrURL,
//用户注册服务协议
kUserRegiServiceAgrURL,
///直播服务协议
kLiveServiceAgrURL,
///社区规范
kCommunitySpecURL,
///账号注销协议
kAccountlogoutAgrURL,
///账号注销
kAccountlogoutURL,
kAccountlogoutConfirmURL,
///主播粉丝团-铭牌申请
kAnchorFansOpenURL,
///主播粉丝团-粉丝列表
kAnchorFansListURL,
///主播粉丝团-粉丝排行
kAnchorFansRankURL,
///主播粉丝团-粉丝团规则
kAnchorFansRuleURL,
///周星礼物-周星榜
kNewWeekStarURL,
///牌照房间小时榜
kLicenseHourRankURL,
///幸运礼物玩法说明
kLuckyGiftPlayRuleURL,
///航海中奖记录
kSailingRecordURL,
///航海玩法说明
kSailingPlayDescdURL,
///活动地址
kSailingActivityURL,
///网络整治乱象
kNetworkRenovateURL,
///动态分享
kMonentsShareURL,
///红包规则
kRedPacketRuleURL,
///星座入口
kXinZuoStarURL,
///收益记录
kMineEarningsRecord,
///金币收益记录
kGoldEarningsRecord,
///夺宝券购买
kTreasureTicketBuyURL,
///夺宝榜单达人
kTreasureRankListURL,
///夺宝券规则说明
kTreasureRuleURL,
///夺宝记录
kTreasureRecordURL,
kChannelUrl,
///LUDO排行榜路径
kLUDOUrl,
/// CP 規則頁
kCPRule,
/// 火箭规则
KBoomRule,
/// 房间等级说明
KRoomLevelRule,
/// 红包规则说明
KLuckyPackageRule,
/// 人機驗證
kCaptchaSwitchPath,
/// 活动详情页
kEventDetailPath,
// 新排行榜
kRankV2,
kVIP,
kTransfer,
kFirstChargeHomeIndex,
kFirstChargeBanner,
kPrivacyURL = 0, ///隐私政策
kUserProtocalURL = 4, ///用户协议
kFAQURL = 6, ///帮助/常见问题
kCaptchaSwitchPath = 113, ///人机验证
};
NSString * const URLWithType(URLType type);

View File

@@ -7,91 +7,37 @@
#import "YUMIHtmlUrl.h"
#import "AESUtils.h"
#import "Base64.h"
#import <Base64/MF_Base64Additions.h>
@implementation YUMIHtmlUrl
NSString * const URLWithType(URLType type) {
NSString *prefix = @"eparty";
NSDictionary *newDic = @{
@(kTreasureTicketBuyURL) : @"modules/act-treasureSnatching/index.html",///
@(kTreasureRankListURL) : @"modules/act-treasureSnatching/list.html",///
@(kTreasureRuleURL) : @"modules/act-treasureSnatching/rule.html",///
@(kTreasureRecordURL) : @"modules/act-treasureSnatching/record.html",///
@(kNobleRankURL) : @"modules/noble/index.html",///
@(kGoldEarningsRecord) : @"modules/myincome/index.html#/GoldLog",///
@(kCandyTreeRuleURL) : @"modules/rule/newWishingWellRule.html",/// modules/rank/index.html#/wishingWellRule
@(kChannelUrl) : @"modules/%@/index.html?channelType=%@&deviceId=%@",
@(kLUDOUrl) : @"modules/gameRank/index.html",///LUDO
@(kCPRule) : @"modules/rule/cpRule.html",
@(KBoomRule) : @"modules/rule/boom.html?partitionId=",///,
@(KRoomLevelRule) : @"modules/roomLevel/index.html",///,
@(KLuckyPackageRule) : @"modules/luckyBagRules/index.html",///,
// URL
NSDictionary *plainUrls = @{
@(kCaptchaSwitchPath): @"modules/humanMachineVerification/index.html",
@(kAccountlogoutConfirmURL) : @"modules/logout/confirm.html",
@(kEventDetailPath) : @"modules/eventDetails/index.html?eventId=",
@(kRankV2) : @"modules/newRank/index.html",
@(kVIP) : @"modules/vip_Center/index.html",
@(kTransfer) : @"modules/rechargeAgent/index.html#/myTransfer",
@(kFirstChargeBanner) : @"modules/firstRechargeBonus/First_Bonus.html",
@(kFirstChargeHomeIndex) : @"modules/firstRechargeBonus/index.html",
};
NSString * newUrl = [newDic objectForKey:@(type)];
if(newUrl != nil){
NSString * url = [newDic objectForKey:@(type)];
return [NSString stringWithFormat:@"%@/%@",prefix, url];
NSString *plainUrl = plainUrls[@(type)];
if (plainUrl) {
return [NSString stringWithFormat:@"%@/%@", prefix, plainUrl];
}
NSDictionary * dic = @{
@(kPrivacyURL) : @"sPa8x4YF1hFEeCeH5v+RMOulemxgjjZLbxkN8ZrBSM8=",// modules/rule/privacy-wap.html
@(kPrivacySDKURL) : @"EXbb0qKoel1tyEL3rQ3//BQ6p/uA56xs9iAOyFI7TRU=",//-SDK modules/rule/sdk.html
@(kPrivacyPersonalURL) : @"u+t46y/9x4S49BgHUeSXxxu2D69UtZtmyhA93HUTvzI=",//- modules/rule/personal-info.html
@(kPrivacyDeviceURL) : @"u+t46y/9x4S49BgHUeSXx/rPFwLB78TiQyN+xJKENGQ=",//- modules/rule/permissions.html
@(kUserProtocalURL) : @"0sBhBaRqf7oBlYvNK4azCrVPTFjv9FYF0A2v9+qkSxg=",/// modules/rule/protocol.html
@(kUserInviteFriendURL) : @"HInhWCyiR3L4dAlHrmQ/GttrZqXhOtq85WujAcETPPI=",///
@(kFAQURL) : @"k/Bqnh8nGkuhV8KhU6xN5a8EkxEQrbDMAWNBtaAdJCo=",// modules/rule/guide.html
@(kIdentityURL) : @"EQtrsRlCX2+rJN89+qyAT6JtfEnprTylInFU0tTPyLA=",// modules/identity/new.html
@(kGameBindAccountURL) : @"5s9YWzw5Lt6ro86UN4pUFETAyuCsIL3wl00gLK5rCek=",/// modules/game/bindAccount.html
@(kNurseryURL) : @"ZT1/YWK/T7gXs1rGDAYnbqG0OrzjhPKJfaebh80/1ro=",/// activity/cleanNet/index.html
@(kRechargePrivacyURL) : @"boJayVmf9bj+vVXabUop2cc110U9LaDdAJhHfbinDzXLhlBtiv3h7J6Sivv3v1Lr",// modules/rule/rechargeAgreement.html
@(kReportRoomURL) : @"TbIA4vIU9O5Z/RGJKEELZNe7SFzF9ig/Lvo6D1upv/g=",///
@(kShareRoomURL) : @"k+TyUH/PriZr4MWmS/rq8BUYAu34MX3ZyAZsDLF0Eck=",/// modules/share_room/index.html
@(kCandyTreeRecordURL) : @"V6XAvR9DZVl5TTczQ/JABDNKGpFSnSP/r6WLbu91uPKWKlwVlmlYvkETALeLk7Jz",/// modules/rank/index.html#/newWishingWellRecord
@(kRoomCharmRankURL) : @"a5qVnItWuLLh148cl8R/+VuVNfOSOd1nzVzfSFbAxUA=",// modules/charm/index.html
@(kRoomRankURL) : @"DqPWO/9EdbpkGl4PoRVQy4+hE8o8EuE30v2vN/yeZFg=", // modules/room_rank/index.html
@(kRoomHourRankURL) : @"DqPWO/9EdbpkGl4PoRVQy7m9/mGnCSpoi673bWBnwBc=", // modules/room_rank/hourRank.html
@(kUserLevelURL) : @"NE+tamYZsEj7S9BySlTpcCyRDMdxsWDzm6KrZTs9Lbo=",// modules/level/index.html
@(kHomeRankURL) : @"V6XAvR9DZVl5TTczQ/JABNoH8I7E1sQ4oZmqs01zOfc=", // modules/rank/index.html#/rank
@(kRoomDatingRule) : @"BbMeRujqQH/yCud2VyM4tZMYe8oHwrQCEcP50kTTxgQ=",// modules/rule/dating.html
@(kNobleRuleURL) : @"4x4Blbka3DFMAyZGSVqxAp0jXvE4/JUx48YfowufzircU1vr/Du8GqrouZUzD9Uq", // VIP modules/rule/introduction-patrician.html
@(kUserRechargeAgrURL) : @"boJayVmf9bj+vVXabUop2cc110U9LaDdAJhHfbinDzXLhlBtiv3h7J6Sivv3v1Lr", ///
@(kUserRegiServiceAgrURL): @"0sBhBaRqf7oBlYvNK4azCrVPTFjv9FYF0A2v9+qkSxg=",// modules/rule/protocol.html
@(kLiveServiceAgrURL) : @"83qLuhoOlxXOw3gwkchLAnb0iz5PEjqOS5dKRRzIxVw=", /// modules/rule/live-protocol.html
@(kCommunitySpecURL) : @"oZs0ygpb9qtOkpZG1zcj1qS3fx0xzBArL1h358e1NM3hbbSU8qTOBmxkpJ03iq+K", /// modules/rule/community-norms.html
@(kAccountlogoutAgrURL) : @"8pzk0dLk9GPSIKjn894dHtmPvxfIJTkUYNP5qTE7GzYpYAG7LWwF1pK7NWb4E0D9", ///
@(kAccountlogoutURL) : @"8pzk0dLk9GPSIKjn894dHmMgQS2OHgRpZ6NNmxGMZ7E=", /// modules/rule/loginout.html
@(kAnchorFansOpenURL) : @"mLMTNiyvF2Tbv4qan6+ogPrhx2U0FdD+3WkY/LdNbduiPL2qYSUiF2VJ2Dfbgnpn", ///-v modules/fans_club/nameplate.html
@(kAnchorFansListURL) : @"mLMTNiyvF2Tbv4qan6+ogDXuGLEHnNEEiALV6JCC/gE=", ///- modules/fans_club/myfans.html
@(kAnchorFansRankURL) : @"mLMTNiyvF2Tbv4qan6+ogCO6lES2UPVnrnZbAxJMj9o+Oz0MAqy0RX8j1QuItbfT", ///- modules/fans_club/fans_rank.html
@(kAnchorFansRuleURL) : @"mLMTNiyvF2Tbv4qan6+ogG32ymd/DYTOoOeZFye3U9A=", ///- modules/fans_club/rule.html
@(kNewWeekStarURL) : @"GmT6HOvcXNUSbxa4g7oNm8j+6DnTtsNc9nMk6SrEyCdP95p3Jwz84r/fjSNcBBRi", ///- modules/weekStar/newWeekStar.html
@(kLicenseHourRankURL) : @"DqPWO/9EdbpkGl4PoRVQyyMfaOgNqIr7sGIOi+kLkijf1EAcL9tVSblMXjNuq+Qy",/// modules/room_rank/hourRankLicense.html
@(kLuckyGiftPlayRuleURL) : @"DcADpWwvzNDc5QYX9hmrJDFatpu+zp4ynUPdb+KeBx0+iFBaBI/MRU80MenYMHKQ",/// modules/rule/luckyGiftRule.html?giftID=%@
@(kSailingActivityURL) : @"ZrQv+cP5sXzlvQp0nvUa20JB5cyCS6X8LTGvUroUfxk=", /// activity/act-sail/more.html
@(kSailingPlayDescdURL) : @"ZrQv+cP5sXzlvQp0nvUa23RXydMeqE8YfwP1J1xHCv3PdHFTlEJiRJ1vhrmu25pu", /// activity/act-sail/play_explain.html
@(kSailingRecordURL) : @"ZrQv+cP5sXzlvQp0nvUa2w5kpdXwSP1aQbPEWUi/gPvrXEWTD9m43qlvhznGtWx1", /// activity/act-sail/win_record.html
@(kNetworkRenovateURL) : @"vMZOLHkGF9uAzm9Ii2dzmQVhtZPf5IUKeg8H7/5FGcWE3YbMNrK59iMSV91HEHz/",/// activity/activemodel/index.html?code=ZBGG
@(kMonentsShareURL) : @"s06Uv+UqjOdDhupnk0YpKKnSCSFCZssMEJxKZdf+s0Ge3zIFKv3knVVNr710Y5eF",/// modules/world/share-page/index.html
@(kRedPacketRuleURL) : @"nRMNKGz9zmwOEcoRr/bGneWzsrl+qHbvUGgXJhFAfVGcldkazbiNrc/v2rR0HFw+",/// modules/rule/red-packet-rule.html
@(kXinZuoStarURL) : @"3l3NxeDKO2bNAESpzjZ76mvJa2D26Bgqy+nNusiuH1UHYM+bYk+MM/TNM4VRqk1K",/// activity/act-constellation/index.html
@(kMineEarningsRecord) : @"0HJ5o+40NtYGeHo1KRoQE3VdLhFQnvGyqgph9CCLjyU53rS29T2nD7UEh3CpX2BG",///
// URL AES
NSDictionary *encryptedUrls = @{
@(kPrivacyURL): @"sPa8x4YF1hFEeCeH5v+RMOulemxgjjZLbxkN8ZrBSM8=", // modules/rule/privacy-wap.html
@(kUserProtocalURL): @"0sBhBaRqf7oBlYvNK4azCrVPTFjv9FYF0A2v9+qkSxg=", // modules/rule/protocol.html
@(kFAQURL): @"k/Bqnh8nGkuhV8KhU6xN5a8EkxEQrbDMAWNBtaAdJCo=", // modules/rule/guide.html
};
NSString * url = [dic objectForKey:@(type)];
NSString * webUrl = [AESUtils aesDecrypt:url];
return [NSString stringWithFormat:@"%@/%@",prefix, webUrl];
NSString *encryptedUrl = encryptedUrls[@(type)];
if (encryptedUrl) {
NSString *decryptedPath = [AESUtils aesDecrypt:encryptedUrl];
return [NSString stringWithFormat:@"%@/%@", prefix, decryptedPath];
}
// URL
return @"";
}
@end

View File

@@ -4,88 +4,14 @@
//
// Created by YUMI on 2021/9/13.
//
///放置一些全局枚举
///全局枚举定义(仅保留实际使用的类型)
#ifndef YUMINNNN_h
#define YUMINNNN_h
typedef NS_ENUM(NSUInteger, ThirdLoginType) {
ThirdLoginType_WeChat = 1,///微信
ThirdLoginType_QQ = 2,///QQ
ThirdLoginType_FB = 10,///FackBook
ThirdLoginType_Line = 9,///Line
ThirdLoginType_Gmail = 8,///谷歌
ThirdLoginType_Apple = 5,///苹果登录
ThirdLoginType_Phone = 11,///手机号登录
};
/// @param type 类型 业务类型必填1注册2登录3重设密码4绑定手机5绑定xczAccount6重设xcz密码7解绑手机
/// 短信验证码业务类型(仅保留实际使用的类型)
typedef NS_ENUM(NSUInteger, GetSmsType) {
GetSmsType_Regist = 1, ///注册
GetSmsType_Login = 2,///登录
GetSmsType_Reset_Password = 3, ///重设密码
GetSmsType_Bind_Phone = 4, ///绑定手机
GetSmsType_Bind_ZF = 5,///绑定支付宝
GetSmsType_Reset_ZF = 6,///重设支付密码
GetSmsType_Unbind_Phone = 7, ///解绑手机
};
typedef NS_ENUM(NSInteger, GenderType) {
GenderType_Male = 1,///男性
GenderType_Female = 2,///女性
};
typedef NS_ENUM(NSInteger, DressUpLabelType) {
DressUpLabelType_New = 1, //新品
DressUpLabelType_Discount = 2, //折扣
DressUpLabelType_Limit = 3,//限定
DressUpLabelType_Exclusive = 4//专属
};
typedef NS_ENUM(NSInteger, GroupType) {
GroupType_default = 0,//默认
GroupType_Blue = 1,//蓝队 男神
GroupType_Red = 2, //红队 女神
};
typedef NS_ENUM(NSInteger, UserEnterRoomFromType) {
///首页推荐
UserEnterRoomFromType_Home_Recommend = 1,
///跟随用户
UserEnterRoomFromType_Follow_User = 2,
///赛事详情
UserEnterRoomFromType_Follow_Game_Detail = 8,
///跨房PK
UserEnterRoomFromType_Cross_Room_PK = 9,
///新用户打招呼
UserEnterRoomFromType_New_User_Greet = 10
};
typedef NS_ENUM(NSInteger, LittleGamePlayStatus) {
LittleGamePlayStatus_NoIn = 0,//未加入
LittleGamePlayStatus_IsIn = 1,//已加入
LittleGamePlayStatus_Ready = 2, //已准备
LittleGamePlayStatus_Plying = 3,//游戏中
};
typedef NS_ENUM(NSInteger, RoomPKVoteModeType){
RoomPKVoteModeType_GiftValue = 1,//礼物价值
RoomPKVoteModeType_NumberPerson = 2, //按送礼物的人数
};
typedef NS_ENUM(NSInteger, RoomPKResultType) {
RoomPKResultType_Draw = 0,//平局
RoomPKResultType_Blue = 1,//蓝方胜
RoomPKResultType_Red = 2, //红方胜
};
typedef NS_ENUM(NSInteger, ContactUseingType) {
///默认
ContactUseingType_Normal = 0,
///在房间内
ContactUseingType_In_Room = 1,
///分享
ContactUseingType_Share = 2,
///消息
ContactUseingType_In_Session = 3
};
#endif /* YUMINNNN_h */

View File

@@ -6,11 +6,11 @@
//
#import <UIKit/UIKit.h>
#import "YUMINNNN.h"
NS_ASSUME_NONNULL_BEGIN
@interface PIUserSexView : UIView
@property (nonatomic,assign) GenderType gender;
@property (nonatomic,assign) NSInteger gender; /// 性别 1:男 2:女
@property (nonatomic,assign) BOOL selected;
@end

View File

@@ -57,36 +57,26 @@
}];
}
- (void)setGender:(GenderType)gender {
- (void)setGender:(NSInteger)gender {
_gender = gender;
switch (_gender) {
case GenderType_Male:
{
if (_gender == 1) { //
self.logoImageView.image = [UIImage imageNamed:@"login_full_male_logo"];
self.sexLb.text = YMLocalizedString(@"PIUserSexView0");
self.sexImageView.image = [UIImage imageNamed:@"login_full_male"];
}
break;
case GenderType_Female:
{
} else if (_gender == 2) { //
self.logoImageView.image = [UIImage imageNamed:@"login_full_female_logo"];
self.sexLb.text = YMLocalizedString(@"PIUserSexView1");
self.sexImageView.image = [UIImage imageNamed:@"login_full_female"];
}
break;
default:
break;
}
}
- (void)setSelected:(BOOL)selected {
_selected = selected;
if (_selected) {
if (self.gender == GenderType_Male) {
if (self.gender == 1) { //
self.backImageView.image = [UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor colorWithHexString:@"#EBF5FF"],[DJDKMIMOMColor colorWithHexString:@"#FFFFFF"]] gradientType:GradientTypeTopToBottom imgSize:CGSizeMake(10, 10)];
self.backImageView.layer.borderColor = [DJDKMIMOMColor colorWithHexString:@"#B8E5FF"].CGColor;
} else {
} else { //
self.backImageView.image = [UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor colorWithHexString:@"#FFEBFA"],[DJDKMIMOMColor colorWithHexString:@"#FFFFFF"]] gradientType:GradientTypeTopToBottom imgSize:CGSizeMake(10, 10)];
self.backImageView.layer.borderColor = [DJDKMIMOMColor colorWithHexString:@"#FFB8E2"].CGColor;
}

View File

@@ -1,264 +0,0 @@
//
// NIMSDKManager.h
// YUMI
//
// Created by YUMI on 2024/12/19.
//
#import <Foundation/Foundation.h>
#import <NIMSDK/NIMSDK.h>
NS_ASSUME_NONNULL_BEGIN
// MARK: - NIMSDK配置模型
@interface NIMSDKConfigModel : NSObject
@property (nonatomic, copy) NSString *appKey; // 云信AppKey
@property (nonatomic, copy) NSString *apnsCername; // APNS证书名称
@property (nonatomic, assign) BOOL shouldConsiderRevokedMessageUnreadCount; // 撤回消息计入未读数
@property (nonatomic, assign) BOOL shouldSyncStickTopSessionInfos; // 同步置顶会话信息
@property (nonatomic, assign) BOOL enabledHttpsForInfo; // 启用HTTPS信息传输
@property (nonatomic, assign) BOOL enabledHttpsForMessage; // 启用HTTPS消息传输
@end
// MARK: - NIMSDK登录状态枚举
typedef NS_ENUM(NSInteger, NIMSDKLoginStatus) {
NIMSDKLoginStatusNotLogin = 0, // 未登录
NIMSDKLoginStatusLogging, // 登录中
NIMSDKLoginStatusLogined, // 已登录
NIMSDKLoginStatusLogout, // 已登出
NIMSDKLoginStatusKickout, // 被踢出
NIMSDKLoginStatusAutoLoginFailed // 自动登录失败
};
// MARK: - NIMSDK登录回调
typedef void(^NIMSDKLoginCompletion)(NSError * _Nullable error);
typedef void(^NIMSDKLogoutCompletion)(NSError * _Nullable error);
typedef void(^NIMSDKStatusChangeBlock)(NIMSDKLoginStatus status);
// MARK: - NIMSDKManager代理协议
@protocol NIMSDKManagerDelegate <NSObject>
@optional
// 登录状态变化
- (void)nimSDKManager:(id)manager didChangeLoginStatus:(NIMSDKLoginStatus)status;
// 自动登录失败
- (void)nimSDKManager:(id)manager didAutoLoginFailed:(NSError *)error;
// 被踢出
- (void)nimSDKManager:(id)manager didKickout:(NIMLoginKickoutResult *)result;
// 收到消息
- (void)nimSDKManager:(id)manager didReceiveMessages:(NSArray<NIMMessage *> *)messages;
// 收到广播消息
- (void)nimSDKManager:(id)manager didReceiveBroadcastMessage:(NIMBroadcastMessage *)broadcastMessage;
@end
// MARK: - NIMSDKManager主类
@interface NIMSDKManager : NSObject
// MARK: - 单例方法
+ (instancetype)sharedManager;
// MARK: - 配置和初始化
/**
配置NIMSDK
@param config 配置模型
*/
- (void)configureWithConfig:(NIMSDKConfigModel *)config;
/**
初始化NIMSDK
@param completion 完成回调
*/
- (void)initializeWithCompletion:(void(^)(NSError * _Nullable error))completion;
/**
注册自定义消息解码器
@param decoder 解码器实例
*/
- (void)registerCustomDecoder:(id<NIMCustomAttachmentCoding>)decoder;
// MARK: - 登录管理
/**
登录
@param account 账号
@param token 登录token
@param completion 完成回调
*/
- (void)loginWithAccount:(NSString *)account
token:(NSString *)token
completion:(NIMSDKLoginCompletion)completion;
/**
自动登录
@param data 自动登录数据
@param completion 完成回调
*/
- (void)autoLoginWithData:(NSDictionary *)data
completion:(NIMSDKLoginCompletion)completion;
/**
登出
@param completion 完成回调
*/
- (void)logoutWithCompletion:(NIMSDKLogoutCompletion)completion;
/**
强制登出
@param completion 完成回调
*/
- (void)forceLogoutWithCompletion:(NIMSDKLogoutCompletion)completion;
// MARK: - 状态查询
/**
获取当前登录状态
@return 登录状态
*/
- (NIMSDKLoginStatus)currentLoginStatus;
/**
是否已登录
@return 是否已登录
*/
- (BOOL)isLogined;
/**
获取当前登录账号
@return 当前登录账号
*/
- (NSString *)currentAccount;
// MARK: - 推送管理
/**
更新APNS设备Token
@param deviceToken 设备Token
*/
- (void)updateApnsToken:(NSData *)deviceToken;
/**
处理推送消息
@param userInfo 推送消息内容
@return 是否处理成功
*/
- (BOOL)handlePushNotification:(NSDictionary *)userInfo;
// MARK: - 代理管理
/**
添加代理
@param delegate 代理对象
*/
- (void)addDelegate:(id<NIMSDKManagerDelegate>)delegate;
/**
移除代理
@param delegate 代理对象
*/
- (void)removeDelegate:(id<NIMSDKManagerDelegate>)delegate;
/**
设置登录状态变化回调
@param block 回调block
*/
- (void)setLoginStatusChangeBlock:(NIMSDKStatusChangeBlock)block;
// MARK: - 消息管理
/**
发送消息
@param message 消息对象
@param session 会话对象
@param completion 完成回调
*/
- (void)sendMessage:(NIMMessage *)message
toSession:(NIMSession *)session
completion:(void(^)(NSError * _Nullable error))completion;
/**
获取未读消息数
@return 未读消息数
*/
- (NSInteger)unreadMessageCount;
/**
获取所有会话
@return 会话列表
*/
- (NSArray<NIMRecentSession *> *)allRecentSessions;
// MARK: - 用户管理
/**
获取用户信息
@param userId 用户ID
@return 用户信息
*/
- (NIMUser *)userInfo:(NSString *)userId;
/**
获取用户信息(异步)
@param userIds 用户ID数组
@param completion 完成回调
*/
- (void)fetchUserInfos:(NSArray<NSString *> *)userIds
completion:(void(^)(NSArray<NIMUser *> * _Nullable users, NSError * _Nullable error))completion;
// MARK: - 聊天室管理
/**
进入聊天室
@param roomId 房间ID
@param completion 完成回调
*/
- (void)enterChatroom:(NSString *)roomId
completion:(void(^)(NSError * _Nullable error))completion;
/**
退出聊天室
@param roomId 房间ID
@param completion 完成回调
*/
- (void)exitChatroom:(NSString *)roomId
completion:(void(^)(NSError * _Nullable error))completion;
// MARK: - 工具方法
/**
创建自定义消息
@param attachment 自定义附件
@return 消息对象
*/
- (NIMMessage *)createCustomMessageWithAttachment:(id<NIMCustomAttachment>)attachment;
/**
创建文本消息
@param text 文本内容
@return 消息对象
*/
- (NIMMessage *)createTextMessage:(NSString *)text;
/**
创建图片消息
@param image 图片对象
@return 消息对象
*/
- (NIMMessage *)createImageMessage:(UIImage *)image;
/**
创建音频消息
@param filePath 音频文件路径
@param duration 音频时长
@return 消息对象
*/
- (NIMMessage *)createAudioMessage:(NSString *)filePath duration:(NSTimeInterval)duration;
// MARK: - 清理方法
/**
清理资源
*/
- (void)cleanup;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,410 +0,0 @@
//
// NIMSDKManager.m
// YUMI
//
// Created by YUMI on 2024/12/19.
//
#import "NIMSDKManager.h"
#import "CustomAttachmentDecoder.h"
#import "YUMIConstant.h"
@interface NIMSDKManager () <NIMLoginManagerDelegate, NIMChatManagerDelegate, NIMSystemNotificationManagerDelegate, NIMBroadcastManagerDelegate>
@property (nonatomic, strong) NIMSDKConfigModel *config;
@property (nonatomic, assign) NIMSDKLoginStatus loginStatus;
@property (nonatomic, strong) NSMutableArray<id<NIMSDKManagerDelegate>> *delegates;
@property (nonatomic, copy) NIMSDKStatusChangeBlock statusChangeBlock;
@property (nonatomic, assign) BOOL isInitialized;
@end
@implementation NIMSDKManager
#pragma mark -
+ (instancetype)sharedManager {
static NIMSDKManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[NIMSDKManager alloc] init];
});
return instance;
}
- (instancetype)init {
self = [super init];
if (self) {
_delegates = [NSMutableArray array];
_loginStatus = NIMSDKLoginStatusNotLogin;
_isInitialized = NO;
}
return self;
}
#pragma mark -
- (void)configureWithConfig:(NIMSDKConfigModel *)config {
self.config = config;
}
- (void)initializeWithCompletion:(void(^)(NSError * _Nullable error))completion {
if (self.isInitialized) {
if (completion) {
completion(nil);
}
return;
}
//
if (!self.config || !self.config.appKey) {
NSError *error = [NSError errorWithDomain:@"NIMSDKManager"
code:-1
userInfo:@{NSLocalizedDescriptionKey: @"NIMSDK配置不完整"}];
if (completion) {
completion(error);
}
return;
}
// SDK
NIMSDKOption *option = [NIMSDKOption optionWithAppKey:self.config.appKey];
if (self.config.apnsCername) {
option.apnsCername = self.config.apnsCername;
}
// SDK
[[NIMSDK sharedSDK] registerWithOption:option];
//
[self registerCustomDecoder:[[CustomAttachmentDecoder alloc] init]];
// SDK
[NIMSDKConfig sharedConfig].shouldConsiderRevokedMessageUnreadCount = self.config.shouldConsiderRevokedMessageUnreadCount;
[[NIMSDKConfig sharedConfig] setShouldSyncStickTopSessionInfos:self.config.shouldSyncStickTopSessionInfos];
[NIMSDKConfig sharedConfig].enabledHttpsForInfo = self.config.enabledHttpsForInfo;
[NIMSDKConfig sharedConfig].enabledHttpsForMessage = self.config.enabledHttpsForMessage;
//
[[NIMSDK sharedSDK].loginManager addDelegate:self];
[[NIMSDK sharedSDK].chatManager addDelegate:self];
[[NIMSDK sharedSDK].systemNotificationManager addDelegate:self];
[[NIMSDK sharedSDK].broadcastManager addDelegate:self];
self.isInitialized = YES;
if (completion) {
completion(nil);
}
}
- (void)registerCustomDecoder:(id<NIMCustomAttachmentCoding>)decoder {
[NIMCustomObject registerCustomDecoder:decoder];
}
#pragma mark -
- (void)loginWithAccount:(NSString *)account
token:(NSString *)token
completion:(NIMSDKLoginCompletion)completion {
if (!self.isInitialized) {
NSError *error = [NSError errorWithDomain:@"NIMSDKManager"
code:-2
userInfo:@{NSLocalizedDescriptionKey: @"NIMSDK未初始化"}];
if (completion) {
completion(error);
}
return;
}
self.loginStatus = NIMSDKLoginStatusLogging;
[self notifyStatusChange];
[[NIMSDK sharedSDK].loginManager login:account
token:token
completion:^(NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
self.loginStatus = NIMSDKLoginStatusNotLogin;
} else {
self.loginStatus = NIMSDKLoginStatusLogined;
}
[self notifyStatusChange];
if (completion) {
completion(error);
}
});
}];
}
- (void)autoLoginWithData:(NSDictionary *)data
completion:(NIMSDKLoginCompletion)completion {
if (!self.isInitialized) {
NSError *error = [NSError errorWithDomain:@"NIMSDKManager"
code:-2
userInfo:@{NSLocalizedDescriptionKey: @"NIMSDK未初始化"}];
if (completion) {
completion(error);
}
return;
}
self.loginStatus = NIMSDKLoginStatusLogging;
[self notifyStatusChange];
[[NIMSDK sharedSDK].loginManager autoLogin:data];
//
//
if (completion) {
completion(nil);
}
}
- (void)logoutWithCompletion:(NIMSDKLogoutCompletion)completion {
[[NIMSDK sharedSDK].loginManager logout:^(NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (!error) {
self.loginStatus = NIMSDKLoginStatusLogout;
[self notifyStatusChange];
}
if (completion) {
completion(error);
}
});
}];
}
- (void)forceLogoutWithCompletion:(NIMSDKLogoutCompletion)completion {
//
[[NIMSDK sharedSDK].loginManager logout:^(NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
self.loginStatus = NIMSDKLoginStatusLogout;
[self notifyStatusChange];
if (completion) {
completion(error);
}
});
}];
}
#pragma mark -
- (NIMSDKLoginStatus)currentLoginStatus {
return self.loginStatus;
}
- (BOOL)isLogined {
return [[NIMSDK sharedSDK].loginManager isLogined];
}
- (NSString *)currentAccount {
return [[NIMSDK sharedSDK].loginManager currentAccount];
}
#pragma mark -
- (void)updateApnsToken:(NSData *)deviceToken {
[[NIMSDK sharedSDK] updateApnsToken:deviceToken];
}
- (BOOL)handlePushNotification:(NSDictionary *)userInfo {
//
//
return YES;
}
#pragma mark -
- (void)addDelegate:(id<NIMSDKManagerDelegate>)delegate {
if (delegate && ![self.delegates containsObject:delegate]) {
[self.delegates addObject:delegate];
}
}
- (void)removeDelegate:(id<NIMSDKManagerDelegate>)delegate {
[self.delegates removeObject:delegate];
}
- (void)setLoginStatusChangeBlock:(NIMSDKStatusChangeBlock)block {
self.statusChangeBlock = block;
}
#pragma mark -
- (void)sendMessage:(NIMMessage *)message
toSession:(NIMSession *)session
completion:(void(^)(NSError * _Nullable error))completion {
[[NIMSDK sharedSDK].chatManager sendMessage:message
toSession:session
error:nil];
//
if (completion) {
completion(nil);
}
}
- (NSInteger)unreadMessageCount {
return [[NIMSDK sharedSDK].conversationManager allUnreadCount];
}
- (NSArray<NIMRecentSession *> *)allRecentSessions {
return [[NIMSDK sharedSDK].conversationManager allRecentSessions];
}
#pragma mark -
- (NIMUser *)userInfo:(NSString *)userId {
return [[NIMSDK sharedSDK].userManager userInfo:userId];
}
- (void)fetchUserInfos:(NSArray<NSString *> *)userIds
completion:(void(^)(NSArray<NIMUser *> * _Nullable users, NSError * _Nullable error))completion {
[[NIMSDK sharedSDK].userManager fetchUserInfos:userIds
completion:completion];
}
#pragma mark -
- (void)enterChatroom:(NSString *)roomId
completion:(void(^)(NSError * _Nullable error))completion {
[[NIMSDK sharedSDK].chatroomManager enterChatroom:roomId
completion:completion];
}
- (void)exitChatroom:(NSString *)roomId
completion:(void(^)(NSError * _Nullable error))completion {
[[NIMSDK sharedSDK].chatroomManager exitChatroom:roomId
completion:completion];
}
#pragma mark -
- (NIMMessage *)createCustomMessageWithAttachment:(id<NIMCustomAttachment>)attachment {
NIMCustomObject *customObject = [[NIMCustomObject alloc] init];
customObject.attachment = attachment;
NIMMessage *message = [[NIMMessage alloc] init];
message.messageObject = customObject;
return message;
}
- (NIMMessage *)createTextMessage:(NSString *)text {
return [[NIMMessage alloc] initWithText:text];
}
- (NIMMessage *)createImageMessage:(UIImage *)image {
NIMImageObject *imageObject = [[NIMImageObject alloc] initWithImage:image];
NIMMessage *message = [[NIMMessage alloc] init];
message.messageObject = imageObject;
return message;
}
- (NIMMessage *)createAudioMessage:(NSString *)filePath duration:(NSTimeInterval)duration {
NIMAudioObject *audioObject = [[NIMAudioObject alloc] initWithSourcePath:filePath];
audioObject.duration = duration;
NIMMessage *message = [[NIMMessage alloc] init];
message.messageObject = audioObject;
return message;
}
#pragma mark -
- (void)cleanup {
//
[[NIMSDK sharedSDK].loginManager removeDelegate:self];
[[NIMSDK sharedSDK].chatManager removeDelegate:self];
[[NIMSDK sharedSDK].systemNotificationManager removeDelegate:self];
[[NIMSDK sharedSDK].broadcastManager removeDelegate:self];
//
self.loginStatus = NIMSDKLoginStatusNotLogin;
self.isInitialized = NO;
[self.delegates removeAllObjects];
self.statusChangeBlock = nil;
}
#pragma mark -
- (void)notifyStatusChange {
//
for (id<NIMSDKManagerDelegate> delegate in self.delegates) {
if ([delegate respondsToSelector:@selector(nimSDKManager:didChangeLoginStatus:)]) {
[delegate nimSDKManager:self didChangeLoginStatus:self.loginStatus];
}
}
// block
if (self.statusChangeBlock) {
self.statusChangeBlock(self.loginStatus);
}
}
#pragma mark - NIMLoginManagerDelegate
- (void)onAutoLoginFailed:(NSError *)error {
dispatch_async(dispatch_get_main_queue(), ^{
self.loginStatus = NIMSDKLoginStatusAutoLoginFailed;
[self notifyStatusChange];
//
for (id<NIMSDKManagerDelegate> delegate in self.delegates) {
if ([delegate respondsToSelector:@selector(nimSDKManager:didAutoLoginFailed:)]) {
[delegate nimSDKManager:self didAutoLoginFailed:error];
}
}
});
}
- (void)onKickout:(NIMLoginKickoutResult *)result {
dispatch_async(dispatch_get_main_queue(), ^{
self.loginStatus = NIMSDKLoginStatusKickout;
[self notifyStatusChange];
//
for (id<NIMSDKManagerDelegate> delegate in self.delegates) {
if ([delegate respondsToSelector:@selector(nimSDKManager:didKickout:)]) {
[delegate nimSDKManager:self didKickout:result];
}
}
});
}
#pragma mark - NIMChatManagerDelegate
- (void)onRecvMessages:(NSArray<NIMMessage *> *)messages {
dispatch_async(dispatch_get_main_queue(), ^{
//
for (id<NIMSDKManagerDelegate> delegate in self.delegates) {
if ([delegate respondsToSelector:@selector(nimSDKManager:didReceiveMessages:)]) {
[delegate nimSDKManager:self didReceiveMessages:messages];
}
}
});
}
#pragma mark - NIMBroadcastManagerDelegate
- (void)onReceiveBroadcastMessage:(NIMBroadcastMessage *)broadcastMessage {
dispatch_async(dispatch_get_main_queue(), ^{
//
for (id<NIMSDKManagerDelegate> delegate in self.delegates) {
if ([delegate respondsToSelector:@selector(nimSDKManager:didReceiveBroadcastMessage:)]) {
[delegate nimSDKManager:self didReceiveBroadcastMessage:broadcastMessage];
}
}
});
}
@end

View File

@@ -308,20 +308,6 @@ NS_ASSUME_NONNULL_BEGIN
+(void)getExchangeDiamondInformation:(HttpRequestHelperCompletion)completion;
+(void)confirmExchangeDiamond:(HttpRequestHelperCompletion)completion goldNum:(NSString *)goldNum diamondNum:(NSString *)diamondNum currency:(NSString *)currency;
/// 得到声音卡信息
/// - Parameters:
/// - completion: 完成
/// - uid: 用户id
+(void)getSoundCardInfo:(HttpRequestHelperCompletion)completion uid:(NSString *)uid;
/// 保存声音卡信息
/// - Parameters:
/// - completion: 完成
/// - audioUrl: 声音链接
/// - second: 秒数
+(void)saveSoundCardInfo:(HttpRequestHelperCompletion)completion audioUrl:(NSString *)audioUrl second:(NSString *)second;
///删除声音卡
+(void)deleteSoundCardInfo:(HttpRequestHelperCompletion)completion;
///得到个人简介标签
+(void)getTagList:(HttpRequestHelperCompletion)completion;
///保存个人简介标签

View File

@@ -405,26 +405,7 @@
NSString * fang = [NSString stringFromBase64String:@"Z29sZEV4Y2hhbmdlRGlhbW9uZC9leGNoYW5nZQ=="];///goldExchangeDiamond/exchange
[self makeRequest:fang method:HttpRequestHelperMethodPOST completion:completion,__FUNCTION__,goldNum,diamondNum,currency, nil];
}
///
/// - Parameters:
/// - completion:
/// - uid: id
+(void)getSoundCardInfo:(HttpRequestHelperCompletion)completion uid:(NSString *)uid{
[self makeRequest:@"audioCard/get" method:HttpRequestHelperMethodGET completion:completion,__FUNCTION__,uid, nil];
}
///
/// - Parameters:
/// - completion:
/// - audioUrl:
/// - second:
+(void)saveSoundCardInfo:(HttpRequestHelperCompletion)completion audioUrl:(NSString *)audioUrl second:(NSString *)second{
[self makeRequest:@"audioCard/save" method:HttpRequestHelperMethodPOST completion:completion,__FUNCTION__,audioUrl,second, nil];
}
///
+(void)deleteSoundCardInfo:(HttpRequestHelperCompletion)completion{
[self makeRequest:@"audioCard/del" method:HttpRequestHelperMethodPOST completion:completion,__FUNCTION__, nil];
}
+(void)getTagList:(HttpRequestHelperCompletion)completion{
[self makeRequest:@"label/edit" method:HttpRequestHelperMethodGET completion:completion,__FUNCTION__, nil];
}

View File

@@ -7,7 +7,6 @@
#import <Foundation/Foundation.h>
#import "UserVipInfoVo.h"
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger, MonentsContentType) {
///纯文字的
@@ -27,8 +26,8 @@ typedef NS_ENUM(NSInteger, MonentsContentType) {
@property (nonatomic,assign) NSInteger defUser;
///是否是新用户
@property (nonatomic,assign) BOOL newUser;
///性别
@property (nonatomic,assign) GenderType gender;
///性别 1:男 2:女
@property (nonatomic,assign) NSInteger gender;
///头像
@property (nonatomic,copy) NSString *avatar;
///年龄
@@ -52,7 +51,7 @@ typedef NS_ENUM(NSInteger, MonentsContentType) {
///话题是否置顶
@property (nonatomic,assign) BOOL topicTop;
///VIP信息
@property (nonatomic, strong) UserVipInfoVo *userVipInfoVO;
@property (nonatomic, strong) NSObject *userVipInfoVO;
///发布的内容
@property (nonatomic,copy) NSArray<MomentsPicInfoModel *> *dynamicResList;
///头饰url地址

View File

@@ -1,15 +0,0 @@
#import "RoomBoomManager_v2.h"
#import "RoomBoomEvent.h"
NS_ASSUME_NONNULL_BEGIN
@interface RoomBoomManager_v2 (EventHandling)
- (void)handleBoomEvent:(RoomBoomEvent *)event;
- (void)handleGiftEvent:(RoomBoomEvent *)event;
- (void)handleBannerEvent:(RoomBoomEvent *)event;
- (void)handleEventError:(NSError *)error forEvent:(RoomBoomEvent *)event;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,130 +0,0 @@
#import "RoomBoomManager_v2+EventHandling.h"
#import "RoomBoomManager_v2+Private.h"
#import "RoomBoomEventQueue.h"
@implementation RoomBoomManager_v2 (EventHandling)
#pragma mark - Event Processing
- (void)handleBoomEvent:(RoomBoomEvent *)event {
if (!event) return;
@synchronized (self) {
if (self.currentState != BoomStateIdle) {
//
RoomBoomEventQueue *queue = self.eventQueues[@(BoomEventTypeBoom)];
[queue enqueueEvent:event];
return;
}
self.currentState = BoomStateBooming;
//
@synchronized (self.explosionListeners) {
for (NSDictionary *dic in self.explosionListeners) {
BoomEventBlock listener = [dic allValues].firstObject;
if (listener) {
listener(event.eventData);
}
}
}
}
}
- (void)handleGiftEvent:(RoomBoomEvent *)event {
if (!event) return;
@synchronized (self) {
if (self.currentState != BoomStateIdle) {
//
RoomBoomEventQueue *queue = self.eventQueues[@(BoomEventTypeGift)];
[queue enqueueEvent:event];
return;
}
self.currentState = BoomStateGifting;
//
@synchronized (self.boomGiftsListeners) {
for (NSDictionary *dic in self.boomGiftsListeners) {
BoomEventBlock listener = [dic allValues].firstObject;
if (listener) {
listener(event.eventData);
}
}
}
}
}
- (void)handleBannerEvent:(RoomBoomEvent *)event {
if (!event) return;
@synchronized (self) {
if (self.currentState != BoomStateIdle) {
//
RoomBoomEventQueue *queue = self.eventQueues[@(BoomEventTypeBanner)];
[queue enqueueEvent:event];
return;
}
self.currentState = BoomStateBannering;
//
@synchronized (self.bannerListeners) {
for (NSDictionary *dic in self.bannerListeners) {
BoomEventBlock listener = [dic allValues].firstObject;
if (listener) {
listener(event.eventData);
}
}
}
}
}
- (void)handleEventError:(NSError *)error forEvent:(RoomBoomEvent *)event {
if (!error || !event) return;
//
NSLog(@"Error handling event: %@, error: %@", event, error);
//
@synchronized (self) {
self.currentState = BoomStateIdle;
//
RoomBoomEventQueue *queue = self.eventQueues[@(event.type)];
[queue clear];
}
//
// TODO:
}
#pragma mark - Helper Methods
- (void)processNextEventInQueue:(BoomEventType)type {
RoomBoomEventQueue *queue = self.eventQueues[@(type)];
if (!queue) return;
@synchronized (self) {
if (self.currentState == BoomStateIdle) {
[queue processNextEvent];
}
}
}
- (void)resetStateForEventType:(BoomEventType)type {
@synchronized (self) {
if (self.currentState == BoomStateBooming && type == BoomEventTypeBoom) {
self.currentState = BoomStateIdle;
} else if (self.currentState == BoomStateGifting && type == BoomEventTypeGift) {
self.currentState = BoomStateIdle;
} else if (self.currentState == BoomStateBannering && type == BoomEventTypeBanner) {
self.currentState = BoomStateIdle;
}
[self processNextEventInQueue:type];
}
}
@end

View File

@@ -1,10 +0,0 @@
#import "RoomBoomManager_v2.h"
#import <NIMSDK/NIMSDK.h>
NS_ASSUME_NONNULL_BEGIN
@interface RoomBoomManager_v2 (NIMDelegate) <NIMChatManagerDelegate, NIMBroadcastManagerDelegate>
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,103 +0,0 @@
#import "RoomBoomManager_v2+NIMDelegate.h"
#import "RoomBoomManager_v2+Private.h"
#import "RoomBoomManager_v2+EventHandling.h"
#import "RoomBoomEvent.h"
#import "AttachmentModel.h"
#import "BoomInfoModel.h"
#import "XPSkillCardPlayerManager.h"
#import "AccountInfoStorage.h"
@implementation RoomBoomManager_v2 (NIMDelegate)
#pragma mark - NIMChatManagerDelegate
- (void)onRecvMessages:(NSArray *)messages {
for (NIMMessage *message in messages) {
if (message.messageType == NIMMessageTypeCustom) {
NIMCustomObject *obj = (NIMCustomObject *)message.messageObject;
if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) {
AttachmentModel *attachment = (AttachmentModel *)obj.attachment;
if (attachment.first == CustomMessageType_RoomBoom) {
[self handleNIMAttachment:attachment];
}
}
}
}
}
#pragma mark - NIMBroadcastManagerDelegate
- (void)onReceiveBroadcastMessage:(NIMBroadcastMessage *)broadcastMessage {
if ([AccountInfoStorage instance].getUid.length == 0) {
return;
}
if (broadcastMessage.content) {
NSDictionary *msgDictionary = [broadcastMessage.content toJSONObject];
AttachmentModel *attachment = [AttachmentModel modelWithJSON:msgDictionary[@"body"]];
NSString *partitionId = [NSString stringWithFormat:@"%@", attachment.data[@"partitionId"]];
if (![partitionId isEqualToString:self.userInfo.partitionId]) {
return;
}
if (attachment.first == CustomMessageType_RoomBoom) {
[self handleNIMAttachment:attachment];
}
}
}
#pragma mark - Private Methods
- (void)handleNIMAttachment:(AttachmentModel *)attachment {
if (!attachment) return;
RoomBoomEvent *event;
switch (attachment.second) {
case Custom_Message_Room_Boom_EXP: {
//
BoomDetailModel *boomDetail = [BoomDetailModel modelWithJSON:attachment.data];
event = [RoomBoomEvent eventWithData:boomDetail
type:BoomEventTypeBoom
priority:BoomEventPriorityNormal];
[self handleBoomEvent:event];
break;
}
case Custom_Message_Room_Boom_LevelUp: {
//
if ([[XPSkillCardPlayerManager shareInstance] isInRoomVC]) {
//
event = [RoomBoomEvent eventWithData:attachment
type:BoomEventTypeBoom
priority:BoomEventPriorityHigh];
[self handleBoomEvent:event];
//
event = [RoomBoomEvent eventWithData:attachment
type:BoomEventTypeBanner
priority:BoomEventPriorityNormal];
[self handleBannerEvent:event];
[[NSNotificationCenter defaultCenter] postNotificationName:@"UpdateWhenBoomExplosion"
object:nil];
}
break;
}
case Custom_Message_Room_Boom_Award: {
//
event = [RoomBoomEvent eventWithData:attachment
type:BoomEventTypeGift
priority:BoomEventPriorityNormal];
[self handleGiftEvent:event];
break;
}
default:
break;
}
}
@end

View File

@@ -1,19 +0,0 @@
#import "RoomBoomManager_v2.h"
#import "BoomInfoModel.h"
#import "UserInfoModel.h"
#import "RoomBoomEventQueue.h"
@interface RoomBoomManager_v2 ()
@property (nonatomic, strong) NSMutableDictionary<NSNumber *, RoomBoomEventQueue *> *eventQueues;
@property (nonatomic, assign) BoomState currentState;
@property (nonatomic, strong) UserInfoModel *userInfo;
@property (nonatomic, strong) NSMutableArray <NSDictionary *> *bannerListeners;
@property (nonatomic, strong) NSMutableArray <NSDictionary *> *explosionListeners;
@property (nonatomic, strong) NSMutableArray <NSDictionary *> *enterRoomExplosionListeners;
@property (nonatomic, strong) NSMutableArray <NSDictionary *> *progressUpdateListeners;
@property (nonatomic, strong) NSMutableArray <NSDictionary *> *boomGiftsListeners;
@property (nonatomic, strong) NSMutableArray <NSDictionary *> *boomDetailArray;
@end

View File

@@ -1,60 +0,0 @@
#import <Foundation/Foundation.h>
@class UserInfoModel;
@class BoomDetailModel;
@class BoomInfoModel;
NS_ASSUME_NONNULL_BEGIN
// 事件类型定义
typedef NS_ENUM(NSInteger, BoomEventType) {
BoomEventTypeBoom,
BoomEventTypeGift,
BoomEventTypeBanner
};
// 状态定义
typedef NS_ENUM(NSInteger, BoomState) {
BoomStateIdle,
BoomStateBooming,
BoomStateGifting,
BoomStateBannering
};
// 事件优先级
typedef NS_ENUM(NSInteger, BoomEventPriority) {
BoomEventPriorityHigh,
BoomEventPriorityNormal,
BoomEventPriorityLow
};
// 回调block定义
typedef void(^BoomEventBlock)(id _Nullable event);
@interface RoomBoomManager_v2 : NSObject
+ (instancetype)sharedManager;
// 用户信息相关
- (void)saveUserInfo:(UserInfoModel *)userInfo;
- (void)leaveRoom;
// Boom 详情相关
- (NSArray *)loadBoomDetails;
- (void)updateBoomDetailArray:(NSArray <BoomDetailModel *> *)array;
- (void)updateBoomDetail:(BoomDetailModel *)boomDetail;
- (void)cleanBoomDetail;
// 事件监听注册
- (void)registerBoomBanner:(BoomEventBlock)block target:(id)target;
- (void)registerBoomExplosion:(BoomEventBlock)block target:(id)target;
- (void)registerBoomEnterRoomExplosion:(BoomEventBlock)block target:(id)target;
- (void)registerBoomProgressUpdate:(BoomEventBlock)block target:(id)target;
- (void)registerBoomGiftDisplay:(BoomEventBlock)block target:(id)target;
- (void)removeEventListenerForTarget:(id)target;
// 事件接收
- (void)receiveEnterRoomBoom:(BoomInfoModel *)model;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,210 +0,0 @@
#import "RoomBoomManager_v2.h"
#import "RoomBoomManager_v2+Private.h"
#import "RoomBoomManager_v2+EventHandling.h"
#import "RoomBoomEvent.h"
#import "RoomBoomEventQueue.h"
#import "BoomInfoModel.h"
#import "UserInfoModel.h"
#import "AttachmentModel.h"
#import "XPSkillCardPlayerManager.h"
@implementation RoomBoomManager_v2
#pragma mark - Lifecycle
+ (instancetype)sharedManager {
static RoomBoomManager_v2 *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
[[NIMSDK sharedSDK].chatManager addDelegate:instance];
[[NIMSDK sharedSDK].broadcastManager addDelegate:instance];
});
return instance;
}
- (instancetype)init {
self = [super init];
if (self) {
[self setupEventQueues];
[self setupListeners];
}
return self;
}
- (void)dealloc {
[[NIMSDK sharedSDK].chatManager removeDelegate:self];
[[NIMSDK sharedSDK].broadcastManager removeDelegate:self];
}
#pragma mark - Setup
- (void)setupEventQueues {
_eventQueues = [NSMutableDictionary dictionary];
// Boom
RoomBoomEventQueue *boomQueue = [[RoomBoomEventQueue alloc] init];
boomQueue.processBlock = ^(id event) {
if ([event isKindOfClass:[RoomBoomEvent class]]) {
[self handleBoomEvent:event];
}
};
_eventQueues[@(BoomEventTypeBoom)] = boomQueue;
// Gift
RoomBoomEventQueue *giftQueue = [[RoomBoomEventQueue alloc] init];
giftQueue.processBlock = ^(id event) {
if ([event isKindOfClass:[RoomBoomEvent class]]) {
[self handleGiftEvent:event];
}
};
_eventQueues[@(BoomEventTypeGift)] = giftQueue;
// Banner
RoomBoomEventQueue *bannerQueue = [[RoomBoomEventQueue alloc] init];
bannerQueue.processBlock = ^(id event) {
if ([event isKindOfClass:[RoomBoomEvent class]]) {
[self handleBannerEvent:event];
}
};
_eventQueues[@(BoomEventTypeBanner)] = bannerQueue;
}
- (void)setupListeners {
_bannerListeners = [NSMutableArray array];
_explosionListeners = [NSMutableArray array];
_enterRoomExplosionListeners = [NSMutableArray array];
_progressUpdateListeners = [NSMutableArray array];
_boomGiftsListeners = [NSMutableArray array];
// _boomDetailArray = [NSMutableArray array];
}
#pragma mark - Public Methods
- (void)saveUserInfo:(UserInfoModel *)userInfo {
_userInfo = userInfo;
}
- (void)leaveRoom {
@synchronized (self) {
[self.eventQueues enumerateKeysAndObjectsUsingBlock:^(NSNumber *key, RoomBoomEventQueue *queue, BOOL *stop) {
[queue clear];
}];
self.currentState = BoomStateIdle;
}
}
- (NSArray *)loadBoomDetails {
return [self.boomDetailArray copy];
}
- (void)updateBoomDetailArray:(NSArray<BoomDetailModel *> *)array {
if (!array) return;
self.boomDetailArray = [array mutableCopy];
}
- (void)updateBoomDetail:(BoomDetailModel *)boomDetail {
if (!boomDetail) return;
for (NSInteger i = 0; i < self.boomDetailArray.count; i++) {
BoomDetailModel *detail = self.boomDetailArray[i];
if (detail.level == boomDetail.level) {
self.boomDetailArray[i] = boomDetail;
break;
}
}
}
- (void)cleanBoomDetail {
[self.boomDetailArray removeAllObjects];
}
#pragma mark - Event Registration
- (void)registerBoomBanner:(BoomEventBlock)block target:(id)target {
if (!block || !target) return;
@synchronized (self.bannerListeners) {
[self.bannerListeners addObject:@{NSStringFromClass([target class]): block}];
}
}
- (void)registerBoomExplosion:(BoomEventBlock)block target:(id)target {
if (!block || !target) return;
@synchronized (self.explosionListeners) {
[self.explosionListeners addObject:@{NSStringFromClass([target class]): block}];
}
}
- (void)registerBoomEnterRoomExplosion:(BoomEventBlock)block target:(id)target {
if (!block || !target) return;
@synchronized (self.enterRoomExplosionListeners) {
[self.enterRoomExplosionListeners addObject:@{NSStringFromClass([target class]): block}];
}
}
- (void)registerBoomProgressUpdate:(BoomEventBlock)block target:(id)target {
if (!block || !target) return;
@synchronized (self.progressUpdateListeners) {
[self.progressUpdateListeners addObject:@{NSStringFromClass([target class]): block}];
}
}
- (void)registerBoomGiftDisplay:(BoomEventBlock)block target:(id)target {
if (!block || !target) return;
@synchronized (self.boomGiftsListeners) {
[self.boomGiftsListeners addObject:@{NSStringFromClass([target class]): block}];
}
}
- (void)removeEventListenerForTarget:(id)target {
if (!target) return;
NSString *targetClass = NSStringFromClass([target class]);
@synchronized (self) {
//
NSArray *listenerArrays = @[
self.bannerListeners,
self.explosionListeners,
self.enterRoomExplosionListeners,
self.progressUpdateListeners,
self.boomGiftsListeners
];
for (NSMutableArray *listeners in listenerArrays) {
@synchronized (listeners) {
NSInteger index = [listeners indexOfObjectPassingTest:^BOOL(NSDictionary *obj, NSUInteger idx, BOOL *stop) {
return [[obj allKeys] containsObject:targetClass];
}];
if (index != NSNotFound) {
[listeners removeObjectAtIndex:index];
}
}
}
}
}
#pragma mark - Room Boom Events
- (void)receiveEnterRoomBoom:(BoomInfoModel *)model {
if (!model) return;
//
RoomBoomEvent *event = [RoomBoomEvent eventWithData:model
type:BoomEventTypeBoom
priority:BoomEventPriorityHigh];
[self handleBoomEvent:event];
//
@synchronized (self.enterRoomExplosionListeners) {
for (NSDictionary *dic in self.enterRoomExplosionListeners) {
BoomEventBlock listener = [dic allValues].firstObject;
if (listener) {
listener(model);
}
}
}
}
@end

View File

@@ -1,19 +0,0 @@
#import <Foundation/Foundation.h>
#import "RoomBoomManager_v2.h"
NS_ASSUME_NONNULL_BEGIN
@interface RoomBoomEvent : NSObject
@property (nonatomic, strong) id eventData;
@property (nonatomic, assign) BoomEventType type;
@property (nonatomic, assign) BoomEventPriority priority;
@property (nonatomic, assign) NSTimeInterval timestamp;
+ (instancetype)eventWithData:(id)data
type:(BoomEventType)type
priority:(BoomEventPriority)priority;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,26 +0,0 @@
#import "RoomBoomEvent.h"
@implementation RoomBoomEvent
+ (instancetype)eventWithData:(id)data
type:(BoomEventType)type
priority:(BoomEventPriority)priority {
RoomBoomEvent *event = [[RoomBoomEvent alloc] init];
event.eventData = data;
event.type = type;
event.priority = priority;
event.timestamp = [[NSDate date] timeIntervalSince1970];
return event;
}
- (NSString *)description {
return [NSString stringWithFormat:@"<%@: %p> type: %ld, priority: %ld, timestamp: %f, data: %@",
NSStringFromClass([self class]),
self,
(long)self.type,
(long)self.priority,
self.timestamp,
self.eventData];
}
@end

View File

@@ -1,17 +0,0 @@
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RoomBoomEventQueue : NSObject
@property (nonatomic, strong) NSMutableArray *events;
@property (nonatomic, assign) BOOL isProcessing;
@property (nonatomic, copy) void(^processBlock)(id event);
- (void)enqueueEvent:(id)event;
- (void)processNextEvent;
- (void)clear;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,60 +0,0 @@
#import "RoomBoomEventQueue.h"
#import "RoomBoomEvent.h"
@implementation RoomBoomEventQueue
- (instancetype)init {
self = [super init];
if (self) {
_events = [[NSMutableArray alloc] init];
_isProcessing = NO;
}
return self;
}
- (void)enqueueEvent:(id)event {
@synchronized (self.events) {
[self.events addObject:event];
//
if (!self.isProcessing) {
[self processNextEvent];
}
}
}
- (void)processNextEvent {
@synchronized (self.events) {
if (self.events.count == 0) {
self.isProcessing = NO;
return;
}
self.isProcessing = YES;
id event = self.events.firstObject;
[self.events removeObjectAtIndex:0];
if (self.processBlock) {
dispatch_async(dispatch_get_main_queue(), ^{
self.processBlock(event);
});
}
}
}
- (void)clear {
@synchronized (self.events) {
[self.events removeAllObjects];
self.isProcessing = NO;
}
}
- (NSString *)description {
return [NSString stringWithFormat:@"<%@: %p> events count: %lu, isProcessing: %@",
NSStringFromClass([self class]),
self,
(unsigned long)self.events.count,
self.isProcessing ? @"YES" : @"NO"];
}
@end

View File

@@ -101,7 +101,7 @@
numStr = [NSString stringWithFormat:YMLocalizedString(@"XPRoomRankTableViewCell0"),numF];
numStr = [numStr stringByReplacingOccurrencesOfString:@".0" withString:@""];
}
self.genderImageView.image = rankModel.gender == GenderType_Female ? [UIImage imageNamed:@"common_female"] : [UIImage imageNamed:@"common_male"];
self.genderImageView.image = rankModel.gender == 2 ? [UIImage imageNamed:@"common_female"] : [UIImage imageNamed:@"common_male"]; // 2: 1:
self.coinNumberLabel.text = numStr;
self.avatarImageView.imageUrl = rankModel.avatar;
self.nickNameLabel.text = rankModel.nick;

View File

@@ -115,7 +115,7 @@
numStr = [numStr stringByReplacingOccurrencesOfString:@".0" withString:@""];
}
self.sexImageView.hidden = NO;
self.sexImageView.image = rankModel.gender == GenderType_Female ? [UIImage imageNamed:@"common_female"] : [UIImage imageNamed:@"common_male"];
self.sexImageView.image = rankModel.gender == 2 ? [UIImage imageNamed:@"common_female"] : [UIImage imageNamed:@"common_male"]; // 2: 1:
self.coinLabel.text = numStr;
self.avatarImageView.imageUrl = rankModel.avatar;
self.nickLabel.text = rankModel.nick;

View File

@@ -44,13 +44,7 @@
}
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
if(self.topViewController == viewController) return;
if (self.childViewControllers.count > 0) {
viewController.hidesBottomBarWhenPushed = YES;
UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"common_nav_back"]ms_SetImageForRTL] style:UIBarButtonItemStyleDone target:self action:@selector(backClick)];
leftBarButtonItem.tintColor = [DJDKMIMOMColor mainTextColor];
viewController.navigationItem.leftBarButtonItem = leftBarButtonItem;
}
viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
[super pushViewController:viewController animated:animated];
}

View File

@@ -6,7 +6,6 @@
//
#import <UIKit/UIKit.h>
#import "ClientConfig.h"
NS_ASSUME_NONNULL_BEGIN

View File

@@ -1,23 +0,0 @@
//
// GuildInfo.h
// YuMi
//
// Created by P on 2024/9/19.
//
#import "PIBaseModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface GuildInfo : PIBaseModel
@property (nonatomic, copy) NSString *avatar;
@property (nonatomic, copy) NSString *guildName;
@property (nonatomic, assign) NSInteger erbanNo;
@property (nonatomic, assign) NSInteger guildId;
@property (nonatomic, assign) NSInteger showCpAnim;
@property (nonatomic, assign) NSInteger showCpAvatar;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,12 +0,0 @@
//
// GuildInfo.m
// YuMi
//
// Created by P on 2024/9/19.
//
#import "GuildInfo.h"
@implementation GuildInfo
@end

View File

@@ -1,85 +0,0 @@
//
// MedalModel.h
// YuMi
//
// Created by P on 2024/6/25.
//
#import "PIBaseModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface UserMedalModel : PIBaseModel
/**
* 用户UID
*/
@property (nonatomic, assign) NSInteger uid;
/**
* 勋章ID
*/
@property (nonatomic, assign) NSInteger medalId;
/**
* 勋章名称
*/
@property (nonatomic, copy) NSString *medalName;
/**
* 图片链接
*/
@property (nonatomic, copy) NSString *picUrl;
/**
* 排序
*/
@property (nonatomic, assign) NSInteger seqNo;
/**
* 勋章类型
*/
@property (nonatomic, assign) NSInteger medalType;
/**
* 是否点亮
*/
@property (nonatomic, assign) BOOL isLightUp;
/**
* 领取时间
*/
@property (nonatomic, assign) double receiveTime;
/**
* 勋章描述
*/
@property (nonatomic, copy) NSString *medalDesc;
/**
* 勋章横幅
*/
@property (nonatomic, copy) NSString *banner;
/**
* 勋章数量
*/
@property (nonatomic, assign) NSInteger amount;
/**
* 勋章小图标
*/
@property (nonatomic, copy) NSString *smallIcon;
/**
* 业务类型
*/
@property (nonatomic, assign) NSInteger busType;
@property (nonatomic,copy) NSString *mp4Url;
@end
@interface MedalModel : PIBaseModel
@property (nonatomic, assign) NSInteger medalCount;
@property (nonatomic, strong) NSArray<UserMedalModel *>* userMedals;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,21 +0,0 @@
//
// MedalModel.m
// YuMi
//
// Created by P on 2024/6/25.
//
#import "MedalModel.h"
@implementation MedalModel
+ (NSDictionary *)objectClassInArray {
return @{
@"userMedals":UserMedalModel.class
};
}
@end
@implementation UserMedalModel
@end

View File

@@ -1,54 +0,0 @@
//
// RelationUserVO.h
// YuMi
//
// Created by P on 2024/9/19.
//
#import "PIBaseModel.h"
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSUInteger, CP_TYPE) {
CP_TYPE_CP = 1,
CP_TYPE_BRO,
CP_TYPE_SISTER,
CP_TYPE_FRIEND
};
typedef NS_ENUM(NSUInteger, CP_CLICK_TYPE) {
CP_CLICK_TYPE_DEFAULT = 0,
CP_CLICK_TYPE_SENDING,
CP_CLICK_TYPE_PASSED
};
@interface RelationUserVO : PIBaseModel
@property (nonatomic, assign) BOOL showCpAvatar;
@property (nonatomic, assign) BOOL showCpAnim;
@property (nonatomic, copy) NSString *nick;
@property (nonatomic, copy) NSString *avatar;
@property (nonatomic, copy) NSString *cpNick;
@property (nonatomic, copy) NSString *cpAvatar;
@property (nonatomic, assign) NSInteger uid;
@property (nonatomic, assign) NSInteger cpUid;
@property (nonatomic, assign) NSInteger cpDay;
@property (nonatomic, assign) NSInteger cpLevel;
@property (nonatomic, assign) NSInteger maxCpLevel;
@property (nonatomic, assign) NSInteger currentExp;
@property (nonatomic, assign) NSInteger nextLevelExp;
@property (nonatomic, assign) NSInteger cancelGoldNum;
@property (nonatomic, assign) NSInteger endExp;
@property (nonatomic, assign) NSInteger startExp;
@property (nonatomic, assign) CP_TYPE relationNameType;
@property (nonatomic, assign) CP_CLICK_TYPE clickFlag; //默认状态0,1-您已经提交更换申请请耐心等待。2-你需要30天才能更换状态。
- (BOOL)isEmptyRelation;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,16 +0,0 @@
//
// RelationUserVO.m
// YuMi
//
// Created by P on 2024/9/19.
//
#import "RelationUserVO.h"
@implementation RelationUserVO
- (BOOL)isEmptyRelation {
return self.cpAvatar.length == 0 || self.cpUid == 0 || self.cpNick.length == 0;
}
@end

View File

@@ -1,21 +0,0 @@
//
// UserExpand.h
// YUMI
//
// Created by zu on 2021/9/14.
//
#import "NSObject+MJExtension.h"
NS_ASSUME_NONNULL_BEGIN
@interface UserExpand : PIBaseModel
@property (nonatomic , assign) NSInteger id;
@property (nonatomic , assign) BOOL showLocation;
@property (nonatomic , assign) NSInteger uid;
@property (nonatomic , assign) BOOL showAge;
@property (nonatomic , assign) BOOL matchChat;
@property (nonatomic , assign) BOOL sysMsgNotify;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,12 +0,0 @@
//
// UserExpand.m
// YUMI
//
// Created by zu on 2021/9/14.
//
#import "UserExpand.h"
@implementation UserExpand
@end

View File

@@ -6,16 +6,8 @@
//
#import "NSObject+MJExtension.h"
#import "UserExpand.h"
#import "UserLevelVo.h"
#import "UserInfoSkillVo.h"
#import "UserVipInfoVo.h"
#import "UserPhoto.h"
#import "MomentsInfoModel.h"
#import "MedalModel.h"
#import "RelationUserVO.h"
#import "GuildInfo.h"
NS_ASSUME_NONNULL_BEGIN
@@ -47,17 +39,17 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic , assign) NSInteger createTime;
@property (nonatomic , assign) BOOL parentMode;
@property (nonatomic , assign) BOOL isBindPhone;
@property (nonatomic , strong) UserExpand * userExpand;
@property (nonatomic , strong) NSObject * userExpand;
@property (nonatomic , assign) NSInteger erbanNo;
@property (nonatomic , assign) NSInteger registerDay;
@property (nonatomic , assign) BOOL isFirstCharge;
@property (nonatomic , assign) BOOL hasPrettyErbanNo;
@property (nonatomic , strong) UserLevelVo * userLevelVo;
@property (nonatomic , strong) NSObject * userLevelVo;
@property (nonatomic , assign) BOOL isBindApple;
@property (nonatomic , assign) NSInteger fansNum;
@property (nonatomic , assign) BOOL isBindBankCard;
@property (nonatomic , assign) BOOL hasRegPacket;
@property (nonatomic , assign) GenderType gender;
@property (nonatomic , assign) NSInteger gender; /// 性别 1:男 2:女
@property (nonatomic , assign) NSInteger platformRole; /// 0 普通 1超管
@property (nonatomic , assign) NSInteger uid;
@property (nonatomic , assign) NSInteger defUser;
@@ -68,7 +60,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic , copy) NSString * avatar;
@property (nonatomic , copy) NSString * reviewingAvatar;
@property (nonatomic , assign) BOOL isReview;
@property (nonatomic , strong) UserInfoSkillVo * userInfoSkillVo;
@property (nonatomic , strong) NSObject * userInfoSkillVo;
@property (nonatomic,copy) NSString *region;
@property (nonatomic,copy) NSArray *labels;
@property (nonatomic , assign) BOOL newUser;
@@ -85,7 +77,7 @@ NS_ASSUME_NONNULL_BEGIN
///限时首充结束时间
@property (nonatomic, assign) long limitChargeEndTime;
///相册
@property (nonatomic, strong) NSArray<UserPhoto *> *privatePhoto;//相册
@property (nonatomic, strong) NSArray *privatePhoto;//相册
///签名
@property (nonatomic,copy) NSString *userDesc;
///出生日期
@@ -128,7 +120,7 @@ NS_ASSUME_NONNULL_BEGIN
///所选择的麦序
@property (nonatomic,assign) int selectMicPosition;
///VIP信息
@property (nonatomic, strong) UserVipInfoVo *userVipInfoVO;
@property (nonatomic, strong) NSObject *userVipInfoVO;
///当前使用的资料卡装扮
@property (nonatomic, copy) NSString *userInfoCardPic;
///麦位光圈链接
@@ -141,17 +133,12 @@ NS_ASSUME_NONNULL_BEGIN
///跟随的 本地添加的字段
@property (nonatomic,copy) NSString *fromNick;
@property (nonatomic,assign) UserEnterRoomFromType fromType;
@property (nonatomic,copy) NSString *fromUid;
///安卓房间公屏气泡
@property (nonatomic, copy) NSString *androidBubbleUrl;
///iOS房间公屏气泡
@property (nonatomic, copy) NSString *iosBubbleUrl;
#pragma mark - 小游戏
/// 小游戏状态 0 未加入游戏1 加入游戏未准备2 加入游戏已准备 3 游戏中
@property (nonatomic, assign) LittleGamePlayStatus gameStatus;
///用户的参加PK的类型
@property (nonatomic, assign) GroupType groupType;
///礼物墙中的礼物
@property (nonatomic,strong) NSArray *userGiftWall;
///礼物墙中的幸运礼物礼物
@@ -179,11 +166,11 @@ NS_ASSUME_NONNULL_BEGIN
///pk时不能禁麦
@property(nonatomic,assign) BOOL isNoProhibitMic;
@property (nonatomic, strong) MedalModel *medals;
@property (nonatomic, strong) NSObject *medals;
@property (nonatomic, strong) RelationUserVO *relationUserVO;
@property (nonatomic, strong) NSObject *relationUserVO;
@property (nonatomic, strong) GuildInfo *guildInfo;
@property (nonatomic, strong) NSObject *guildInfo;
@property (nonatomic, copy) NSArray *userNameplateList;

View File

@@ -19,7 +19,7 @@
+ (NSDictionary *)objectClassInArray {
return @{
@"dynamicInfo":MomentsInfoModel.class,
};
}

View File

@@ -1,16 +0,0 @@
//
// UserInfoSkillVo.h
// YUMI
//
// Created by zu on 2021/9/14.
//
#import "NSObject+MJExtension.h"
NS_ASSUME_NONNULL_BEGIN
@interface UserInfoSkillVo : PIBaseModel
@property (nonatomic , assign) BOOL liveTag;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,12 +0,0 @@
//
// UserInfoSkillVo.m
// YUMI
//
// Created by zu on 2021/9/14.
//
#import "UserInfoSkillVo.h"
@implementation UserInfoSkillVo
@end

View File

@@ -1,32 +0,0 @@
//
// UserLevelVo.h
// YUMI
//
// Created by zu on 2021/9/14.
//
#import "NSObject+MJExtension.h"
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger, UserLevelType) {
UserLevelType_Common = 1,///普通人
UserLevelType_Offical = 2,///官方
UserLevelType_Robot = 3, ///机器人
};
@interface UserLevelVo : PIBaseModel
@property (nonatomic , copy) NSString * experUrl;
@property (nonatomic , assign) NSInteger charmLevelSeq;
@property (nonatomic , copy) NSString * experLevelName;
@property (nonatomic , copy) NSString * charmLevelName;
@property (nonatomic , assign) NSInteger charmAmount;
@property (nonatomic , copy) NSString * experLevelGrp;
@property (nonatomic , copy) NSString * charmUrl;
@property (nonatomic , assign) NSInteger experLevelSeq;
@property (nonatomic , assign) NSInteger experAmount;
@property (nonatomic , copy) NSString * charmLevelGrp;
///账号类型
@property(nonatomic, assign) UserLevelType defUser; //账号类型
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,12 +0,0 @@
//
// UserLevelVo.m
// YUMI
//
// Created by zu on 2021/9/14.
//
#import "UserLevelVo.h"
@implementation UserLevelVo
@end

View File

@@ -1,18 +0,0 @@
//
// UserPhoto.h
// YUMI
//
// Created by YUMI on 2021/9/23.
//
#import "NSObject+MJExtension.h"
NS_ASSUME_NONNULL_BEGIN
@interface UserPhoto : PIBaseModel
@property (copy, nonatomic) NSString *photoUrl;
@property (copy, nonatomic) NSString *pid;
@property (nonatomic, assign) BOOL isReview;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,13 +0,0 @@
//
// UserPhoto.m
// YUMI
//
// Created by YUMI on 2021/9/23.
//
#import "UserPhoto.h"
@implementation UserPhoto
@end

View File

@@ -1,55 +0,0 @@
//
// UserVipInfoVo.h
// YUMI
//
// Created by YUMI on 2022/1/4.
// VIP信息
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface UserVipInfoVo : PIBaseModel
///VIP图标
@property (nonatomic, copy) NSString *vipIcon;
///VIP等级
@property (nonatomic, assign) NSInteger vipLevel;
//用户好友昵称颜色
@property (nonatomic, copy) NSString *friendNickColour;
///是否防被踢
@property (nonatomic, assign) BOOL preventKick;
///是否隐身进房
@property (nonatomic, assign) BOOL enterHide;
///VIP进房特效
@property (nonatomic, copy) NSString *enterRoomEffects;
///VIP名称
@property (nonatomic, copy) NSString *vipName;
///隐身访问主页
@property (nonatomic,assign) BOOL lookHomepageHide;
@property (nonatomic, copy) NSString *userCardBG;
/// 是否可以上传动态头像
@property (nonatomic, assign) BOOL uploadGifAvatar;
/// 过期时间
@property (nonatomic, assign) NSTimeInterval expireTime;
/// 是否防跟随进房
@property (nonatomic, assign) BOOL preventTrace;
/// 是否防关注
@property (nonatomic, assign) BOOL preventFollow;
/// 查看访客
@property(nonatomic, assign) BOOL visitHide;
/// 是否無痕瀏覽
@property(nonatomic, assign) BOOL visitListView;
@property (nonatomic, assign) bool privateChatLimit;
@property (nonatomic, copy) NSString *nameplateUrl;
@property(nonatomic, assign) NSInteger visitListVipLimit;
@property(nonatomic, assign) BOOL roomPicScreen; // 是否能发送房间公屏图片消息
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,12 +0,0 @@
//
// UserVipInfoVo.m
// YUMI
//
// Created by YUMI on 2022/1/4.
//
#import "UserVipInfoVo.h"
@implementation UserVipInfoVo
@end

View File

@@ -7,7 +7,6 @@
#import "BaseMvpPresenter.h"
#import "AccountInfoStorage.h"
#import "ClientConfig.h"
#import "BaseNavigationController.h"
@interface BaseMvpPresenter()

View File

@@ -40,19 +40,7 @@
}
- (void)setupTopTheme {
__block UIImageView *theme = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, kGetScaleWidth(140))];
theme.image = [[ClientConfig shareConfig] navigationAreaBG];
theme.contentMode = UIViewContentModeScaleAspectFill;
[self.view addSubview:theme];
[[NSNotificationCenter defaultCenter] addObserverForName:[ClientConfig shareConfig].reloadNavigationAreaImageKey
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification * _Nonnull notification) {
if ([notification.object isKindOfClass:[UIImage class]]) {
theme.image = (UIImage *)notification.object;
}
}];
}
- (void)setupCustomNavigationBar:(void(^)(void))backAction title:(NSString *)title titleColor:(UIColor *)color {
@@ -203,7 +191,7 @@
- (UIButton *)mvpBackButton {
if (!_backButton) {
UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
[b setImage:[kImage(@"common_nav_back_white") ms_SetImageForRTL]
[b setImage:kImage(@"common_nav_back_white")
forState:UIControlStateNormal];
[b addTarget:self
action:@selector(didTapBack)

View File

@@ -36,7 +36,6 @@ isEnterprise = [bundleID isEqualToString:@"com.hflighting.yumi"];\
#import "YUMIHtmlUrl.h"
#import "NSArray+Safe.h"
#import "NSString+Utils.h"
#import "UIButton+EnlargeTouchArea.h"
#import "UIView+Corner.h"
#import "UIView+GradientLayer.h"
#import "UILabel+Utils.h"
@@ -50,15 +49,10 @@ isEnterprise = [bundleID isEqualToString:@"com.hflighting.yumi"];\
#import "YUMIConstant.h"
#import "YUMINNNN.h"
#import "NSObject+MJExtension.h"
#import <MarqueeLabel-Swift.h>
#import <YYText/YYText.h>
#import "HttpRequestHelper.h"
#import "BSNetListenModel.h"
#import "PIBaseModel.h"
#import "PLTimeUtil.h"
#import "UIImage+ImageEffects.h"
#import "UIImage+MSRTL.h"
#import "MSBaseRTLFlowLayout.h"
#import "MSBaseTextField.h"
#import "SZTextView.h"
#endif /* PrefixHeader_pch */

View File

@@ -1,19 +0,0 @@
//
// AlbumResourcePickerViewController.h
// YuMi
//
// Created by P on 2024/10/18.
//
#import <UIKit/UIKit.h>
@class PHAsset;
NS_ASSUME_NONNULL_BEGIN
@interface AlbumResourcePickerViewController : UIViewController
@property (nonatomic, copy) void(^didSelectedAsset)(PHAsset *asset);
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,281 +0,0 @@
//
// AlbumResourcePickerViewController.m
// YuMi
//
// Created by P on 2024/10/18.
//
#import "AlbumResourcePickerViewController.h"
#import <Photos/Photos.h>
#import <SDWebImageFLPlugin/SDWebImageFLPlugin.h>
#import "YYUtility.h"
@interface ImageDetailViewController : UIViewController
@property (nonatomic, strong) UIImage *image; //
@property (nonatomic, strong) NSData *gifData; // GIF
@end
@implementation ImageDetailViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blackColor]; //
if (self.gifData) {
// GIF
FLAnimatedImage *animatedImage = [FLAnimatedImage animatedImageWithGIFData:self.gifData];
FLAnimatedImageView *animatedImageView = [[FLAnimatedImageView alloc] initWithFrame:self.view.bounds];
animatedImageView.animatedImage = animatedImage;
animatedImageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:animatedImageView];
} else if (self.image) {
//
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
imageView.image = self.image;
imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:imageView];
}
[self setupToolArea];
//
UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeSystem];
[closeButton setTitle:@"关闭" forState:UIControlStateNormal];
closeButton.frame = CGRectMake(20, 40, 60, 30);
[closeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[closeButton addTarget:self action:@selector(closeButtonTapped) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:closeButton];
}
- (void)setupToolArea {
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, 44)];
titleLabel.text = @"选取图片";
// titleLabel.backgroundColor = [UIColor c];
}
//
- (void)closeButtonTapped {
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
@interface AlbumResourceCollectionCell : UICollectionViewCell
@property (nonatomic, strong) FLAnimatedImageView *imageView;
- (void)setupGifImage:(NSData *)data;
- (void)setupImage:(PHAsset *)asset;
@end
@implementation AlbumResourceCollectionCell
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self.contentView addSubview:self.imageView];
[self.imageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.contentView);
}];
}
return self;
}
- (FLAnimatedImageView *)imageView {
if (!_imageView) {
_imageView = [[FLAnimatedImageView alloc] init];
_imageView.contentMode = UIViewContentModeScaleAspectFill;
_imageView.clipsToBounds = YES;
}
return _imageView;
}
- (void)setupGifImage:(NSData *)data {
FLAnimatedImage *animatedImage = [FLAnimatedImage animatedImageWithGIFData:data];
self.imageView.animatedImage = animatedImage;
}
- (void)setupImage:(PHAsset *)asset {
@kWeakify(self);
[[PHImageManager defaultManager] requestImageForAsset:asset
targetSize:CGSizeMake(250, 250)
contentMode:PHImageContentModeAspectFill
options:nil
resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
@kStrongify(self);
self.imageView.image = result;
}];
}
@end
@interface AlbumResourcePickerViewController () <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
@property (nonatomic, strong) UICollectionView *collectionView;
@property (nonatomic, strong) PHFetchResult *allPhotos;
@property (nonatomic, assign) CGSize cellSize;
@property (nonatomic, assign) CGFloat cellSpace;
@end
@implementation AlbumResourcePickerViewController
+ (void)checkAuthorization:(void(^)(BOOL authorized))result {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (result) {
result(status == PHAuthorizationStatusAuthorized);
}
}];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self calSize];
[self setupCollectionView];
[self fetchAllPhotos];
}
- (void)calSize {
self.cellSpace = 2;
CGFloat screenWidth = UIScreen.mainScreen.bounds.size.width;
CGFloat width = (screenWidth - self.cellSpace * self.cellSpace) / 3;
self.cellSize = CGSizeMake(width, width);
}
- (void)fetchAllPhotos {
PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
//
self.allPhotos = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage
options:fetchOptions];
// UICollectionView
dispatch_async(dispatch_get_main_queue(), ^{
[self.collectionView reloadData];
});
}
- (void)handleAsset:(PHAsset *)asset {
// 使 PHImageManager
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
// NSLog(@"%@", info);
if ([dataUTI isEqualToString:@"com.compuserve.gif"]) {
// GIF GIF
FLAnimatedImage *animatedImage = [FLAnimatedImage animatedImageWithGIFData:imageData];
FLAnimatedImageView *animatedImageView = [[FLAnimatedImageView alloc] init];
animatedImageView.animatedImage = animatedImage;
// [self displayAnimatedImageView:animatedImageView];
} else {
//
UIImage *image = [UIImage imageWithData:imageData];
[self displayStaticImage:image];
}
}];
}
- (void)displayAnimatedImageView:(FLAnimatedImageView *)animatedImageView {
animatedImageView.frame = CGRectMake(0, 0, 300, 300); // frame
[self.view addSubview:animatedImageView];
}
- (void)displayStaticImage:(UIImage *)image {
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(0, 0, 300, 300); // frame
[self.view addSubview:imageView];
}
- (void)setupCollectionView {
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.minimumInteritemSpacing = self.cellSpace;
layout.minimumLineSpacing = self.cellSpace;
layout.itemSize = self.cellSize;
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];
collectionView.delegate = self;
collectionView.dataSource = self;
[collectionView registerClass:[AlbumResourceCollectionCell class] forCellWithReuseIdentifier:@"PhotoCell"];
[self.view addSubview:collectionView];
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return self.allPhotos.count; //
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
AlbumResourceCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PhotoCell" forIndexPath:indexPath];
PHAsset *asset = self.allPhotos[indexPath.item];
// 使 PHImageManager GIF
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
// [cell setupImage:imageData isGif:[dataUTI isEqualToString:@"com.compuserve.gif"]];
if ([dataUTI isEqualToString:@"com.compuserve.gif"]) {
[cell setupGifImage:imageData];
// [cell setupImage:imageData isGif:YES];
} else {
[cell setupImage:asset];
// [cell setupImage:imageData isGif:NO];
// //
// [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(100, 100) contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
// UIImageView *imageView = [[UIImageView alloc] initWithImage:result];
// imageView.frame = cell.contentView.bounds;
// [cell.contentView addSubview:imageView];
// }];
}
}];
return cell;
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
PHAsset *asset = self.allPhotos[indexPath.item];
// 使 PHImageManager
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
// ImageDetailViewController
ImageDetailViewController *detailVC = [[ImageDetailViewController alloc] init];
if ([dataUTI isEqualToString:@"com.compuserve.gif"]) {
// GIF GIF
detailVC.gifData = imageData;
} else {
// UIImage
UIImage *image = [UIImage imageWithData:imageData];
detailVC.image = image;
}
//
[self presentViewController:detailVC animated:YES completion:nil];
}];
if (self.didSelectedAsset) {
self.didSelectedAsset(asset);
}
// // 使 PHImageManager
// [[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
// if ([dataUTI isEqualToString:@"com.compuserve.gif"]) {
// // GIF GIF
// FLAnimatedImage *animatedImage = [FLAnimatedImage animatedImageWithGIFData:imageData];
// FLAnimatedImageView *animatedImageView = [[FLAnimatedImageView alloc] init];
// animatedImageView.animatedImage = animatedImage;
// [self displayAnimatedImageView:animatedImageView];
// } else {
// //
// UIImage *image = [UIImage imageWithData:imageData];
// [self displayStaticImage:image];
// }
// }];
}
@end

View File

@@ -1,227 +0,0 @@
import UIKit
import StoreKit
@available(iOS 15.0, *)
typealias Transaction = StoreKit.Transaction
@available(iOS 15.0, *)
typealias RenewalInfo = StoreKit.Product.SubscriptionInfo.RenewalInfo
@available(iOS 15.0, *)
typealias RenewalState = StoreKit.Product.SubscriptionInfo.RenewalState
enum PIStoreError: Error {
//
case failedVerification
case noProduct
}
@objc public enum StoreConditionResult: Int64 { //
case start //
case pay //
case verifiedServer //
case userCancelled //
case pending //
case unowned
case noProduct //
case failedVerification //
}
@available(iOS 15.0, *)
public class PIIAPRegulate: NSObject {
public typealias KConditionBlock = (_ state :StoreConditionResult,_ param:Dictionary<String,Any>?) ->()
@objc public var ConditionBlock: KConditionBlock! //
var updateListenerTask: Task<Void, Error>? = nil //
var transactionMap :[String:Transaction] = [:]// Idmap
@objc public static let shared = PIIAPRegulate()
private override init() { // private
super.init()
self.updateListenerTask = listenForTransactions()
}
func triggerConditionBlock(_ state: StoreConditionResult, _ param: [String: Any]? = nil) {
if let ConditionBlock = ConditionBlock {
ConditionBlock(state, param)
}
}
// 退
@objc public func refunRequest(view: UIView,transactionId:UInt64) async {
do {
if let scene = await view.window?.windowScene{
_ = try await Transaction.beginRefundRequest(for:transactionId , in: scene)
}
}catch{
print("iap error")
}
}
//
@objc public func demandCommodityThing(productId:String, uuid: String) async throws {
triggerConditionBlock(.start)
do {
let list = [productId]
let storeProducts = try await Product.products(for: Set(list))
guard let product = storeProducts.first else {
// triggerConditionBlock(.noProduct)
throw PIStoreError.noProduct
}
_ = try await purchase(product, uuid)
} catch {
triggerConditionBlock(.noProduct)
throw PIStoreError.noProduct
}
}
//
private func purchase(_ product: Product, _ uuid: String) async throws -> Transaction? {
triggerConditionBlock(.pay)
guard let curUUID = UUID.init(uuidString: uuid) else{
triggerConditionBlock(.failedVerification)
return nil
}
let result = try await product.purchase(options: [.appAccountToken(curUUID)])
switch result {
case .success(let verification): //
return try await verifiedAndAccomplish(verification)
case .userCancelled: //
triggerConditionBlock(.userCancelled)
case .pending: //
triggerConditionBlock(.pending)
default:
triggerConditionBlock(.unowned)
}
return nil
}
//
func checkVerified<T>(_ result: VerificationResult<T>) throws -> T {
//Check whether the JWS passes StoreKit verification.
switch result {
case .unverified:
//StoreKit parses the JWS, but it fails verification.
triggerConditionBlock(.failedVerification)
throw PIStoreError.failedVerification
case .verified(let safe):
//The result is verified. Return the unwrapped value.
print("iap: verified success")
return safe
}
}
// &
func verifiedAndAccomplish(_ verification:VerificationResult<Transaction>) async throws -> Transaction?{
//Check whether the transaction is verified. If it isn't,
//this function rethrows the verification error.
let transaction = try checkVerified(verification)
// ~~~
let transactionId = try verification.payloadValue.id
// map
let key = String(transactionId)
transactionMap[key] = transaction
await uploadServer(for: key)
//
await transaction.finish()
print("iap: finish")
return transaction
}
/*All transactions
Latest transactions
Current entitlements
*/
func getAllBusiness(transactionId:String) async {
let transactionIntId = UInt64(transactionId)
for await result in Transaction.all {
do {
let tran = try checkVerified(result)
let resultId = try result.payloadValue.id
if transactionIntId == resultId {
await tran.finish()
break
}
} catch let error {
print("error:----\(error)")
}
}
}
//
// @objc public func verifyBusinessAccomplish(transaction:String) async {
// if(transactionMap[transaction] != nil){
// await transactionMap[transaction]!.finish()
// transactionMap.removeValue(forKey: transaction)
// print("verifyBusinessFinish end")
// }else {
// await getAllBusiness(transactionId: transaction)
// }
// }
@objc public func verifyBusinessAccomplish(transactionID: String, completionHandler: @escaping (Bool, Error?) -> Void) {
if let transaction = transactionMap[transactionID] {
Task {
await transaction.finish()
transactionMap.removeValue(forKey: transactionID)
completionHandler(true, nil) //
}
} else {
Task {
await getAllBusiness(transactionId: transactionID)
completionHandler(false, nil) //
}
}
}
@MainActor
func uploadServer(for transactionId:String) async {
let dic :Dictionary<String,String> = ["transactionId":transactionId]
triggerConditionBlock(.verifiedServer, dic)
}
//
func listenForTransactions() -> Task<Void, Error> {
return Task.detached {
for await result in Transaction.updates {
do {
let resultId = try result.payloadValue.id
if !self.transactionMap.keys.contains(String(resultId)) {
_ = try await self.verifiedAndAccomplish(result)
}
} catch {
//
print("Error: \(error)")
}
}
}
}
//广
func Promotion() async -> [SKProduct]?{
let promotion = SKProductStorePromotionController()
let prodicts = try? await promotion.promotionOrder()
return prodicts
}
//
deinit {
updateListenerTask?.cancel()
}
}

View File

@@ -9,8 +9,6 @@
#import "YYUtility.h"
#import <CoreTelephony/CTTelephonyNetworkInfo.h> //
#import <CoreTelephony/CTCarrier.h> //
#import "ClientConfig.h"
@@ -120,23 +118,12 @@ static NSString * const kMobileFrameworkResourceBundleName = @"YYMobileFramework
static NSString *_from = nil;
+ (NSString *)getAppSource{
if (_from == nil) {
if (isEnterprise == NO) {
_from = ISTestFlight ? PI_Test_Flight : @"eparti_enterprise"; //
}else {
_from = [ClientConfig shareConfig].isTF == YES ? PI_Test_Flight : PI_App_Source; // Test_Flightappstore App Store
}
}
return _from;
}
+ (BOOL)isFromAppStore{
if([[[YYUtility getAppSource] lowercaseString] isEqualToString:@"appstore"]){
return YES;
}
return NO;
}
+ (NSString *)removeSpaceAndNewline:(NSString *)str{
@@ -149,7 +136,7 @@ static NSString *_from = nil;
+ (YYUtilityTelephonType)getOperatorInfomation {
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
//NSLog(@"info = %@", info);
CTCarrier *carrier = [info subscriberCellularProvider];
CTCarrier *carrier = [info serviceSubscriberCellularProviders];
//NSLog(@"carrier = %@", carrier);
if (carrier == nil) {
return YYUtilityTelephonType_Link_Unknown;

View File

@@ -192,17 +192,6 @@
}
}
+ (void)checkMicPrivacy:(void(^)(BOOL succeed))resultBlock
{
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
if (resultBlock) {
dispatch_async(dispatch_get_main_queue(), ^{
resultBlock(granted);
});
}
}];
}
+ (NSString *)deviceUniqueIdentification {
// SSKeychain
NSString * currentDeviceUUIDStr = [SSKeychain passwordForService:@" " account:@"uuid"];

View File

@@ -204,13 +204,6 @@ typedef enum : NSUInteger {
*/
+ (void)checkAssetsLibrayAvailable:(void (^)(void))available denied:(void(^)(void))denied restriction:(void(^)(void))restriction;
/**
检查麦克风权限
@param resultBlock 结果处理block
*/
+ (void)checkMicPrivacy:(void(^)(BOOL succeed))resultBlock;
+ (NSString *)macAddresss;
+ (NSString *)idfa;

View File

@@ -1,60 +0,0 @@
//
// XPWebViewController.h
// YuMi
//
// Created by z on 2021/9/16.
//
#import "BaseViewController.h"
#import <WebKit/WebKit.h>
NS_ASSUME_NONNULL_BEGIN
@protocol XPWebViewControllerDelegate <NSObject>
-(void)payHandler;
@end
@interface XPWebViewController : BaseViewController
///
@property (nonatomic,weak) id<XPWebViewControllerDelegate> delegate;
@property (strong, nonatomic) WKWebView *webview;
///跳转方式如果push的直接pushViewController不用dismissViewControllerAnimated后再pushViewController
@property (nonatomic,assign) BOOL isPush;
///是否从精灵页面过来
@property (nonatomic,assign) BOOL isFairyPay;
@property (nonatomic,assign) BOOL is_Pi_FairyPay;
///XPWebViewController是否作为属性yes则
@property (nonatomic,assign) BOOL isProperty;
@property (copy, nonatomic) NSString *url;
@property(nonatomic, assign) BOOL isLoginStatus;
/// URL加载完成回调result:加载结果成功/失败error:失败原因
@property (nonatomic, copy) void (^urlLoadCompleted)(BOOL result, NSError * _Nullable error);
///是都隐藏导航栏 目前适用于半屏的情况下
@property (nonatomic,copy) void (^InitShowNavBlock)(BOOL show);
///关闭webView 目前适用于半屏的情况下
@property (nonatomic,copy) void (^CloseWebViewBlock)(BOOL result);
@property(nonatomic, copy) void (^verifyCaptcha)(BOOL result);
@property (nonatomic, copy) void(^didTapCharge)(void);
- (instancetype)initWithCustomizeNav:(BOOL)isCustom;
///强制使用 roomUID 初始化,尽量传入,防止 web 在需要时取不到数据
// 更好的做法是,全具保持一个 roomUID 记录
@property (nonatomic,copy) NSString *roomUid;
- (instancetype)initWithRoomUID:(NSString * _Nullable)roomUid;
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,675 +0,0 @@
//
// XPWebViewController.m
// YuMi
//
// Created by zu on 2021/9/16.
//
#import "XPWebViewController.h"
#import "AccountInfoStorage.h"
#import "DJDKMIMOMColor.h"
#import "YUMIMacroUitls.h"
#import "YYUtility.h"
#import "HttpRequestHelper.h"
#import "TTPopup.h"
#import "XCCurrentVCStackManager.h"
#import "Api+Mine.h"
#import "YuMi-swift.h"
///vc
#import "Api+Mine.h"
#import "XPWebViewNavView.h"
typedef NS_ENUM(NSUInteger, RightNavigationPushType){
///h5
RightNavigationPushType_Web = 1,
///
RightNavigationPushType_Share = 2,
///
RightNavigationPushType_AppPage = 3,
///
RightNavigationPushType_SharePicture = 5
};
@interface WeakWebViewScriptMessageDelegate : NSObject<WKScriptMessageHandler>
//WKScriptMessageHandler JavaScriptOC
@property (nonatomic, weak) id<WKScriptMessageHandler> scriptDelegate;
- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate;
@end
@implementation WeakWebViewScriptMessageDelegate
- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate {
self = [super init];
if (self) {
_scriptDelegate = scriptDelegate;
}
return self;
}
//WKScriptMessageHandler
//JSname
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
if ([self.scriptDelegate respondsToSelector:@selector(userContentController:didReceiveScriptMessage:)]) {
[self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];
}
}
@end
@interface XPWebViewController () <WKNavigationDelegate, WKScriptMessageHandler, XPWebViewNavViewDelegate>
//@property (strong, nonatomic) WKWebView *webview;
@property (strong, nonatomic) UIProgressView *progressView;
@property (nonatomic, strong) WKUserContentController *pi_userContentController;
///
@property (nonatomic,copy) NSDictionary *shareDic;
///
@property (nonatomic,copy) NSDictionary *savePhotoDic;
///
@property (nonatomic,strong) XPWebViewNavView *navView;
///
@property (nonatomic,assign) BOOL isCustom;
///
@property (nonatomic,copy) NSString *orderId;
@property (nonatomic, assign) BOOL isHideNavBar;
@end
NSString * const kJSOpenPurse = @"openPurse";
NSString * const kJSOpenChargePage = @"openChargePage";
NSString * const kJSChargePayPage = @"chargePayPage";
NSString * const kJSChargePayClickPage = @"chargePayClickPage";
NSString * const kJSOpenSharePage = @"openSharePage";
NSString * const kJSGetUid = @"getUid";
NSString * const kJSGetDeviceId = @"getDeviceId";
NSString * const kJSGetTicket = @"getTicket";
NSString * const kJSGetDeviceInfo = @"getDeviceInfo";
NSString * const kJSOpenFaceLiveness = @"openFaceLiveness";
NSString * const kJSInitNav = @"initNav";
NSString * const kJSGetRoomUid = @"getRoomUid";
NSString * const kOpenPersonPage = @"openPersonPage";
NSString * const kInitShowNav = @"initShowNav";
NSString * const kCloseWebView = @"closeWebView";
NSString * const kJumpAppointPage = @"jumpAppointPage";
NSString * const kJSOpenRoom = @"openRoom";
NSString * const kJSOpenRoomForGiftId = @"openRoomForGiftId";
NSString * const kJSOpenChatPage = @"geToChatPage";
NSString * const kJSOpenAppConcernedChat = @"openAppConcernedChat";
NSString * const kJSSavePictureShare = @"savePictureShare";
NSString * const kJSGoToExchangeGold = @"goToExchangeGold";
NSString * const kJSOpenPayment = @"openPayment";
NSString * const kJSOpenPaymentCallback = @"openPaymentCallback";
NSString * const kJSVerifyCaptchaCallBack = @"closeToVerify";
NSString * const kJSShowShareCallBack = @"showShareAction";
@implementation XPWebViewController
- (instancetype)initWithCustomizeNav:(BOOL)isCustom
{
self = [super init];
if (self) {
self.isCustom = isCustom;
}
return self;
}
- (instancetype)initWithRoomUID:(NSString * _Nullable)roomUid {
self = [super init];
if (self) {
self.roomUid = roomUid;
self.isLoginStatus = YES;
}
return self;
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
if (self.isHideNavBar) {
if (self.navigationController) {
[self.navigationController setNavigationBarHidden:YES];
}
}
}
- (void)viewDidLoad {
[super viewDidLoad];
[self initView];
}
- (void)initView {
if (self.navigationController.viewControllers.count > 1){
UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[[UIImage imageNamed:@"common_nav_back"]ms_SetImageForRTL] style:UIBarButtonItemStylePlain target:self action:@selector(backButtonClick)];
leftBarButtonItem.tintColor = [DJDKMIMOMColor mainTextColor];
self.navigationItem.leftBarButtonItem = leftBarButtonItem;
}
self.webview.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
if(self.isCustom == YES){
[self.view addSubview:self.navView];
[self.view addSubview:self.webview];
[self.view addSubview:self.progressView];
[self.navView mas_makeConstraints:^(MASConstraintMaker *make) {
make.leading.trailing.top.equalTo(self.view);
make.height.mas_equalTo(kNavigationHeight);
}];
[self.webview mas_makeConstraints:^(MASConstraintMaker *make) {
make.leading.trailing.bottom.equalTo(self.view);
make.top.equalTo(self.navView.mas_bottom);
}];
[self.progressView mas_makeConstraints:^(MASConstraintMaker *make) {
make.leading.trailing.equalTo(self.view);
make.height.mas_equalTo(1);
make.top.equalTo(self.navView.mas_bottom);
}];
}else{
[self.view addSubview:self.webview];
[self.view addSubview:self.progressView];
[self.webview mas_makeConstraints:^(MASConstraintMaker *make) {
make.leading.trailing.top.bottom.mas_equalTo(self.view);
}];
}
}
- (void)xPWebViewNavView:(XPWebViewNavView *)view didClickBack:(UIButton *)sender{
if(self.is_Pi_FairyPay){
[self willMoveToParentViewController:nil]; //1
[self.view removeFromSuperview]; //2
[self removeFromParentViewController]; //3
return;
}
if(self.isFairyPay){
if(self.CloseWebViewBlock){
self.CloseWebViewBlock(YES);
}
return;
}
[self dismissViewControllerAnimated:YES completion:nil];
}
//
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
//progressView
self.progressView.hidden = YES;
if (self.urlLoadCompleted) {
self.urlLoadCompleted(YES, nil);
}
#if DEBUG
NSString *fileName = @"vconsole.min.js"; //
NSString *directory = [[NSBundle mainBundle] resourcePath];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtPath:directory];
NSString *filePath;
for (NSString *path in enumerator) {
if ([[path lastPathComponent] containsString:fileName]) {
filePath = [directory stringByAppendingPathComponent:path];
break;
}
}
if (filePath.length > 0) {
NSString *vConsoleScript = [NSString stringWithContentsOfFile:filePath
encoding:NSUTF8StringEncoding error:nil];
[webView evaluateJavaScript:vConsoleScript completionHandler:nil];
// vConsole
NSString *initVConsoleScript = @"var vConsole = new VConsole();";
[webView evaluateJavaScript:initVConsoleScript completionHandler:nil];
}
#endif
}
#if DEBUG
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse
decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response;
NSDictionary *headers = response.allHeaderFields;
// NSLog(@"Response Headers: %@", headers);
NSString *contentEncoding = headers[@"Content-Encoding"];
if ([contentEncoding isEqualToString:@"gzip"]) {
// NSLog(@"✅ Gzip 响应已启用");
} else {
// NSLog(@"❌ Gzip 响应未启用");
}
decisionHandler(WKNavigationResponsePolicyAllow);
}
#endif
//
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {
//progressView
self.progressView.hidden = YES;
if (self.urlLoadCompleted) {
self.urlLoadCompleted(NO, error);
}
}
//
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSURL *URL = navigationAction.request.URL;
NSString *scheme = [URL scheme];
NSURLRequest *request = navigationAction.request;
// Judge is whether to jump to other app.
if (![scheme isEqualToString:@"https"] && ![scheme isEqualToString:@"http"]) {
BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:request.URL];
if (canOpen) {
[[UIApplication sharedApplication] openURL:request.URL options:@{} completionHandler:^(BOOL success) {
}];
}
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
decisionHandler(WKNavigationActionPolicyAllow);
}
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSURLCredential *card = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];
completionHandler(NSURLSessionAuthChallengeUseCredential,card);
});
}
}
- (void)userContentController:(WKUserContentController *)userContentController
didReceiveScriptMessage:(WKScriptMessage *)message {
[self.webview evaluateJavaScript:@"document.location.href"
completionHandler:^(id _Nullable response, NSError * _Nullable error) {
NSString *currentUrl = [NSString stringWithFormat:@"%@", response];
///host,便h5
BOOL condition = currentUrl != nil && [currentUrl containsString:API_HOST_URL];
NSLog(@"-- -- - -- - - -- -- - -- - -%@", response);
NSLog(@"-- -- - -- - -%@: %@", message.name, message.body);
#ifdef DEBUG
condition = currentUrl != nil;
#endif
if(condition) {
if ([message.name isEqualToString:kJSOpenSharePage]) {
} else if ([message.name isEqualToString:kJSGetUid]) {
NSString *uid = [[AccountInfoStorage instance] getUid];
NSString *js = [NSString stringWithFormat:@"getMessage(\"uid\",%@)", uid];
[self.webview evaluateJavaScript:js completionHandler:^(id _Nullable other, NSError * _Nullable error) {
// NSLog(@"%@",error);
}];
} else if ([message.name isEqualToString:kJSGetTicket]) {
NSString *ticket = [[AccountInfoStorage instance] getTicket];
NSString *js = [NSString stringWithFormat:@"getMessage(\"ticket\",\"%@\")",ticket];
[self.webview evaluateJavaScript:js completionHandler:^(id _Nullable other, NSError * _Nullable error) {
// NSLog(@"%@",error);
}];
} else if ([message.name isEqualToString:kJSGetDeviceId]) {
NSString *js = [NSString stringWithFormat:@"getMessage(\"deviceId\",\"%@\")",[YYUtility deviceUniqueIdentification]];
[self.webview evaluateJavaScript:js completionHandler:^(id _Nullable other, NSError * _Nullable error) {
// NSLog(@"%@",error);
}];
} else if ([message.name isEqualToString:kJSGetDeviceInfo]) {
NSDictionary *basicParmars = [HttpRequestHelper configBaseParmars:[[NSDictionary alloc] init]];
NSString *json = [basicParmars mj_JSONString];
NSString *js = [NSString stringWithFormat:@"getMessage(\"deviceInfo\",%@)", json];
[self.webview evaluateJavaScript:js completionHandler:^(id _Nullable ohter, NSError * _Nullable error) {
// NSLog(@"%@", error);
}];
} else if ([message.name isEqualToString:kJSOpenPurse]) {
}else if([message.name isEqualToString:kJSChargePayPage]){
// NSString *money = [NSString stringWithFormat:@"%@",message.body] ;
}else if([message.name isEqualToString:kJSChargePayClickPage]){
}else if ([message.name isEqualToString:kJSOpenChargePage]) {
} else if ([message.name isEqualToString:kOpenPersonPage]) {
} else if([message.name isEqualToString:kJSInitNav]) {
[self initNav:message.body];
} else if([message.name isEqualToString:kJSGetRoomUid]) {
NSString *js = [NSString stringWithFormat:@"getMessage(\"roomUid\",\"%@\")",self.roomUid];
[self.webview evaluateJavaScript:js completionHandler:^(id _Nullable other, NSError * _Nullable error) {
// NSLog(@"%@",error);
}];
} else if([message.name isEqualToString:kInitShowNav]) {
if (((NSNumber *)message.body).intValue == 0) {
if (self.InitShowNavBlock) {
self.InitShowNavBlock(YES);
return;
}
self.isHideNavBar = YES;
if (self.navigationController) {
[self.navigationController setNavigationBarHidden:YES];
}
}
} else if([message.name isEqualToString:kCloseWebView]) {
if (self.CloseWebViewBlock) {
self.CloseWebViewBlock(YES);
return;
}
if (self.navigationController) {
[self.navigationController popViewControllerAnimated:YES];
}
} else if ([message.name isEqualToString:kJumpAppointPage]) {
// h5
NSDictionary *bodyDict;
if ([message.body isKindOfClass:[NSDictionary class]]) {
bodyDict = message.body;
} else if ([message.body isKindOfClass:[NSString class]]) {
NSString *str = (NSString *)message.body;
bodyDict = [str toJSONObject];
}
NSInteger skyType = [bodyDict[@"routerType"] integerValue];
[self handleRouterType:skyType message:message];
}else if ([message.name isEqualToString:kJSOpenChatPage]){
}else if([message.name isEqualToString:kJSOpenAppConcernedChat]){
}else if ([message.name isEqualToString:kJSOpenRoom]) {
} else if([message.name isEqualToString:kJSOpenRoomForGiftId]) {
}else if ([message.name isEqualToString:kJSSavePictureShare]){
} else if([message.name isEqualToString:kJSGoToExchangeGold]){
} else if([message.name isEqualToString:kJSOpenPayment]) {
[self handleOpenPayment:message.body];
} else if([message.name isEqualToString:kJSVerifyCaptchaCallBack]) {
[self handleCaptchaResult:[message.body integerValue] == 1];
} else if([message.name isEqualToString:kJSShowShareCallBack]) {
[self handleShareActioin:message.body];
}
}
}];
}
#pragma mark -
- (void)handleShareActioin:(NSString *)content {
}
- (void)handleCaptchaResult:(BOOL)reuslt {
if (_verifyCaptcha) {
self.verifyCaptcha(reuslt);
}
}
#pragma mark - Payment Method
- (void)handleOpenPayment:(NSString *)chargeProdId {
}
- (void)triggerOpenPaymentCallback:(NSInteger)code
orderID:(NSString *)orderID
productID:(NSString *)productID {
NSDictionary *dic = @{@"code":@(code), @"orderId":orderID, @"productId":productID};
NSString *js = [NSString stringWithFormat:@"openPaymentCallback(%@)", dic.toJSONString];
@kWeakify(self);
[self.webview evaluateJavaScript:js
completionHandler:^(id _Nullable result, NSError * _Nullable error) {
@kStrongify(self);
[self hideHUD];
}];
}
#pragma mark - private method
- (void)handleRouterType:(NSInteger)skyType message:(WKScriptMessage *)message {
NSDictionary *bodyDict = (NSDictionary *)message.body;
switch (skyType) {
case 1:
{
}
break;
case 7:
{
}
break;
case 8:
{
}
break;
case 75:
{
}
break;
default:
break;
}
}
- (void)setUrl:(NSString *)urlString{
_url = urlString;
if (_url == nil) {
return;
}
if (![_url hasPrefix:@"http"] && ![_url hasPrefix:@"https"]){
_url = [NSString stringWithFormat:@"%@/%@", [HttpRequestHelper getHostUrl], _url];
}
if (![_url containsString:@"?"]) {
_url = [NSString stringWithFormat:@"%@", _url];
} else {
_url = [NSString stringWithFormat:@"%@", _url];
}
// urlString
NSString *noSpaceTextUrl = [_url stringByReplacingOccurrencesOfString:@" " withString:@""];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:noSpaceTextUrl]];
[self.webview loadRequest:request];
}
- (void)backButtonClick {
BOOL canGoBack = YES;
if (self.webview.backForwardList.backList.count <= 1) {
canGoBack = NO;
}
if ([self.webview canGoBack]) {
[self.webview goBack];
} else {
[self.navigationController popViewControllerAnimated:YES];
[self.pi_userContentController removeAllUserScripts];
}
}
#pragma mark -
- (void)initNav:(NSDictionary *)response{
if(!response || ![response isKindOfClass:[NSDictionary class]])return;
self.shareDic = response[@"data"];
if ([response[@"type"] intValue]== RightNavigationPushType_Web) {
[self addNavigationItemWithTitles:@[response[@"data"][@"title"]] titleColor:[DJDKMIMOMColor alertTitleColor] isLeft:NO target:self action:@selector(gotoWebView) tags:nil];
}else if ([response[@"type"] intValue]== RightNavigationPushType_Share || [response[@"type"] intValue]== RightNavigationPushType_SharePicture){
[self addNavigationItemWithImageNames:@[@"family_person_share"] isLeft:NO
target:self action:@selector(showSharePanel) tags:nil];
}
}
- (void)gotoWebView {
if (self.shareDic[@"link"]) {
XPWebViewController * webVC = [[XPWebViewController alloc] init];
webVC.url = self.shareDic[@"link"];
[self.navigationController pushViewController:webVC animated:YES];
}
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
if ([keyPath isEqualToString:@"estimatedProgress"]) {
self.progressView.progress = self.webview.estimatedProgress;
if (self.progressView.progress == 1) {
__weak typeof (self)weakSelf = self;
[UIView animateWithDuration:0.25f delay:0.3f options:UIViewAnimationOptionCurveEaseOut animations:^{
weakSelf.progressView.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
} completion:^(BOOL finished) {
weakSelf.progressView.hidden = YES;
}];
}
} else if ([keyPath isEqualToString:@"title"]) {
if (object == self.webview) {
self.navigationItem.title = self.webview.title;
if (self.urlLoadCompleted) {//webview
self.urlLoadCompleted(YES, nil);
}
}else{
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
- (void)dealloc {
[self.webview removeObserver:self forKeyPath:@"estimatedProgress"];
[self.webview removeObserver:self forKeyPath:@"title"];
}
- (WKWebView *)webview {
if (_webview == nil) {
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc]init];
if (@available(iOS 10.0, *)) {
configuration.mediaTypesRequiringUserActionForPlayback = NO;
} else {
// Fallback on earlier versions
}
configuration.allowsInlineMediaPlayback = YES;
NSString *uid = [[AccountInfoStorage instance] getUid];
NSString *realCookie = [NSString stringWithFormat:@"%@=%@",@"uid",uid];
WKUserScript *cookieScript = [[WKUserScript alloc] initWithSource: [NSString stringWithFormat:@"document.cookie = '%@';", realCookie] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[self.pi_userContentController addUserScript:cookieScript];
///
NSString *scaleJs = @"$('meta[name=description]').remove(); $('head').append( '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,user-scalable=no\">' );";
WKUserScript *scaleScript = [[WKUserScript alloc] initWithSource:scaleJs injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];
[self.pi_userContentController addUserScript:scaleScript];
//WKUserScriptWKWebViewConfiguration
configuration.preferences.javaScriptEnabled = YES;
configuration.preferences.javaScriptCanOpenWindowsAutomatically = YES;
configuration.preferences.minimumFontSize = 10;
configuration.selectionGranularity = WKSelectionGranularityCharacter;
configuration.userContentController = self.pi_userContentController;
CGSize size = [UIScreen mainScreen].bounds.size;
_webview = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, size.width,size.height) configuration:configuration];
_webview.navigationDelegate = self;
//KVOWKWebViewestimatedProgress
[_webview addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
//KVOtitle
[_webview addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];
UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(backButtonClick)];
[_webview addGestureRecognizer:swipeGesture];
[_webview.scrollView setShowsVerticalScrollIndicator:NO];
[_webview.scrollView setShowsHorizontalScrollIndicator:NO];
//set useragent
__weak typeof(self) weakSelf = self;
[_webview evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {
NSString *userAgent = result;
if (![userAgent containsString:@"molistarAppIos erbanAppIos"]){
NSString *newUserAgent = [userAgent stringByAppendingString:@" molistarAppIos erbanAppIos"];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
[[NSUserDefaults standardUserDefaults] synchronize];
[weakSelf.webview setCustomUserAgent:newUserAgent];
}
}];
_webview.scrollView.bounces = NO;
}
return _webview;
}
- (UIProgressView *)progressView{
if (!_progressView) {
_progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, 1)];
_progressView.progressTintColor = [DJDKMIMOMColor appMainColor];
_progressView.trackTintColor = [UIColor clearColor];
_progressView.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
}
return _progressView;
}
- (WKUserContentController *)pi_userContentController{
if (!_pi_userContentController) {
//WKScriptMessageHandler
WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
_pi_userContentController = [[WKUserContentController alloc] init];
//
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenSharePage];
//
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenPurse];
//
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenChargePage];
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSChargePayPage];
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSChargePayClickPage];
// uid
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSGetUid];
// id
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSGetDeviceId];
// Ticket
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSGetTicket];
// info
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSGetDeviceInfo];
// :
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenFaceLiveness];
//
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSInitNav];
// uid
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSGetRoomUid];
//
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kOpenPersonPage];
//
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kInitShowNav];
//
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kCloseWebView];
//
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJumpAppointPage];
//
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenRoom];
//
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenRoomForGiftId];
///
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenChatPage];
///
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenAppConcernedChat];
///
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSSavePictureShare];
///
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSGoToExchangeGold];
///
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenPayment];
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenPaymentCallback];
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSVerifyCaptchaCallBack];
[_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSShowShareCallBack];
}
return _pi_userContentController;
}
-(XPWebViewNavView *)navView{
if (!_navView){
_navView = [[XPWebViewNavView alloc]initWithFrame:CGRectZero];
_navView.delegate = self;
}
return _navView;
}
@end

View File

@@ -1,21 +0,0 @@
//
// XPWebViewNavView.h
// YuMi
//
// Created by YuMi on 2023/2/27.
//
#import <UIKit/UIKit.h>
@class XPWebViewNavView;
NS_ASSUME_NONNULL_BEGIN
@protocol XPWebViewNavViewDelegate <NSObject>
//点击了返回
- (void)xPWebViewNavView:(XPWebViewNavView *)view didClickBack:(UIButton *)sender;
@end
@interface XPWebViewNavView : UIView
///
@property (nonatomic,weak) id<XPWebViewNavViewDelegate> delegate;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,79 +0,0 @@
//
// XPWebViewNavView.m
// YuMi
//
// Created by YuMi on 2023/2/27.
//
#import "XPWebViewNavView.h"
///Third
#import <Masonry/Masonry.h>
#import "UIButton+EnlargeTouchArea.h"
#import "DJDKMIMOMColor.h"
#import "YUMIMacroUitls.h"
@interface XPWebViewNavView()
///
@property (nonatomic,strong) UIButton *backButton;
///
@property (nonatomic,strong) UILabel *titleView;
@end
@implementation XPWebViewNavView
-(instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if(self){
[self initSubViews];
[self initSubViewConstraints];
}
return self;
}
#pragma mark - Private Method
- (void)initSubViews {
[self addSubview:self.backButton];
[self addSubview:self.titleView];
}
- (void)initSubViewConstraints {
[self.backButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.height.mas_equalTo(kGetScaleWidth(28));
make.leading.mas_equalTo(0);
make.bottom.mas_equalTo(-kGetScaleWidth(8));
}];
[self.titleView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.backButton);
make.centerX.equalTo(self);
}];
}
-(void)backButtonAction{
if(self.delegate && [self.delegate respondsToSelector:@selector(xPWebViewNavView:didClickBack:)]){
[self.delegate xPWebViewNavView:self didClickBack:self.backButton];
}
}
#pragma mark -
- (UIButton *)backButton {
if (!_backButton) {
_backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_backButton setImage:[[UIImage imageNamed:@"common_nav_back"]ms_SetImageForRTL] forState:UIControlStateNormal];
[_backButton setImage:[[UIImage imageNamed:@"common_nav_back"]ms_SetImageForRTL] forState:UIControlStateSelected];
[_backButton addTarget:self action:@selector(backButtonAction) forControlEvents:UIControlEventTouchUpInside];
[_backButton setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10];
}
return _backButton;
}
- (UILabel *)titleView {
if (!_titleView) {
_titleView = [[UILabel alloc] init];
_titleView.font = [UIFont systemFontOfSize:17 weight:UIFontWeightSemibold];
_titleView.textColor = UIColorFromRGB(0x1F1B4F);
_titleView.text = YMLocalizedString(@"XPWebViewNavView0");
}
return _titleView;
}
@end

Some files were not shown because too many files have changed in this diff Show More