Keep Delete
This commit is contained in:
6
Podfile
6
Podfile
@@ -7,9 +7,6 @@ project 'YuMi.xcodeproj'
|
|||||||
target 'YuMi' do
|
target 'YuMi' do
|
||||||
use_frameworks!
|
use_frameworks!
|
||||||
|
|
||||||
# 滑动标签栏
|
|
||||||
pod 'JXCategoryView'
|
|
||||||
pod 'JXPagingView/Pager'
|
|
||||||
#模型转化
|
#模型转化
|
||||||
pod 'MJExtension', '3.4.2'
|
pod 'MJExtension', '3.4.2'
|
||||||
#图片加载
|
#图片加载
|
||||||
@@ -19,8 +16,7 @@ target 'YuMi' do
|
|||||||
pod 'SDWebImageFLPlugin' # 对FLAnimatedImage和SDWebImage的桥接
|
pod 'SDWebImageFLPlugin' # 对FLAnimatedImage和SDWebImage的桥接
|
||||||
pod 'AFNetworking'
|
pod 'AFNetworking'
|
||||||
#文字自动滚动
|
#文字自动滚动
|
||||||
pod 'MarqueeLabel'
|
|
||||||
pod 'YYText'
|
|
||||||
pod 'Masonry'
|
pod 'Masonry'
|
||||||
#输入
|
#输入
|
||||||
pod 'SZTextView'
|
pod 'SZTextView'
|
||||||
|
18
Podfile.lock
18
Podfile.lock
@@ -19,9 +19,6 @@ PODS:
|
|||||||
- FLAnimatedImage (1.0.17)
|
- FLAnimatedImage (1.0.17)
|
||||||
- GKCycleScrollView (1.2.3)
|
- GKCycleScrollView (1.2.3)
|
||||||
- IQKeyboardManager (6.5.19)
|
- IQKeyboardManager (6.5.19)
|
||||||
- JXCategoryView (1.6.8)
|
|
||||||
- JXPagingView/Pager (2.1.3)
|
|
||||||
- MarqueeLabel (4.5.3)
|
|
||||||
- Masonry (1.1.0)
|
- Masonry (1.1.0)
|
||||||
- MBProgressHUD (1.2.0)
|
- MBProgressHUD (1.2.0)
|
||||||
- MJExtension (3.4.2)
|
- MJExtension (3.4.2)
|
||||||
@@ -60,7 +57,6 @@ PODS:
|
|||||||
- YYImage (1.0.4):
|
- YYImage (1.0.4):
|
||||||
- YYImage/Core (= 1.0.4)
|
- YYImage/Core (= 1.0.4)
|
||||||
- YYImage/Core (1.0.4)
|
- YYImage/Core (1.0.4)
|
||||||
- YYText (1.0.7)
|
|
||||||
- YYWebImage (1.0.5):
|
- YYWebImage (1.0.5):
|
||||||
- YYCache
|
- YYCache
|
||||||
- YYImage
|
- YYImage
|
||||||
@@ -73,9 +69,6 @@ DEPENDENCIES:
|
|||||||
- FLAnimatedImage
|
- FLAnimatedImage
|
||||||
- GKCycleScrollView
|
- GKCycleScrollView
|
||||||
- IQKeyboardManager
|
- IQKeyboardManager
|
||||||
- JXCategoryView
|
|
||||||
- JXPagingView/Pager
|
|
||||||
- MarqueeLabel
|
|
||||||
- Masonry
|
- Masonry
|
||||||
- MBProgressHUD
|
- MBProgressHUD
|
||||||
- MJExtension (= 3.4.2)
|
- MJExtension (= 3.4.2)
|
||||||
@@ -93,7 +86,6 @@ DEPENDENCIES:
|
|||||||
- TYCyclePagerView
|
- TYCyclePagerView
|
||||||
- TZImagePickerController
|
- TZImagePickerController
|
||||||
- YuMi (from `yum`)
|
- YuMi (from `yum`)
|
||||||
- YYText
|
|
||||||
- YYWebImage
|
- YYWebImage
|
||||||
- ZLCollectionViewFlowLayout
|
- ZLCollectionViewFlowLayout
|
||||||
|
|
||||||
@@ -105,9 +97,6 @@ SPEC REPOS:
|
|||||||
- FLAnimatedImage
|
- FLAnimatedImage
|
||||||
- GKCycleScrollView
|
- GKCycleScrollView
|
||||||
- IQKeyboardManager
|
- IQKeyboardManager
|
||||||
- JXCategoryView
|
|
||||||
- JXPagingView
|
|
||||||
- MarqueeLabel
|
|
||||||
- Masonry
|
- Masonry
|
||||||
- MBProgressHUD
|
- MBProgressHUD
|
||||||
- MJExtension
|
- MJExtension
|
||||||
@@ -128,7 +117,6 @@ SPEC REPOS:
|
|||||||
- TZImagePickerController
|
- TZImagePickerController
|
||||||
- YYCache
|
- YYCache
|
||||||
- YYImage
|
- YYImage
|
||||||
- YYText
|
|
||||||
- YYWebImage
|
- YYWebImage
|
||||||
- ZLCollectionViewFlowLayout
|
- ZLCollectionViewFlowLayout
|
||||||
|
|
||||||
@@ -143,9 +131,6 @@ SPEC CHECKSUMS:
|
|||||||
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
|
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
|
||||||
GKCycleScrollView: 8ed79d2142e62895a701973358b6f94b661b4829
|
GKCycleScrollView: 8ed79d2142e62895a701973358b6f94b661b4829
|
||||||
IQKeyboardManager: c8665b3396bd0b79402b4c573eac345a31c7d485
|
IQKeyboardManager: c8665b3396bd0b79402b4c573eac345a31c7d485
|
||||||
JXCategoryView: 262d503acea0b1278c79a1c25b7332ffaef4d518
|
|
||||||
JXPagingView: afdd2e9af09c90160dd232b970d603cc6e7ddd0e
|
|
||||||
MarqueeLabel: 0c57d4c6634e04a6d015af79f7c9a175b2309525
|
|
||||||
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
|
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
|
||||||
MBProgressHUD: 3ee5efcc380f6a79a7cc9b363dd669c5e1ae7406
|
MBProgressHUD: 3ee5efcc380f6a79a7cc9b363dd669c5e1ae7406
|
||||||
MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8
|
MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8
|
||||||
@@ -167,10 +152,9 @@ SPEC CHECKSUMS:
|
|||||||
YuMi: 6c5f00f1eccbcea3304feae03cbe659025fdb9cb
|
YuMi: 6c5f00f1eccbcea3304feae03cbe659025fdb9cb
|
||||||
YYCache: 8105b6638f5e849296c71f331ff83891a4942952
|
YYCache: 8105b6638f5e849296c71f331ff83891a4942952
|
||||||
YYImage: 1e1b62a9997399593e4b9c4ecfbbabbf1d3f3b54
|
YYImage: 1e1b62a9997399593e4b9c4ecfbbabbf1d3f3b54
|
||||||
YYText: 5c461d709e24d55a182d1441c41dc639a18a4849
|
|
||||||
YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928
|
YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928
|
||||||
ZLCollectionViewFlowLayout: c99024652ce9f0c57d33ab53052c9b85e4a936b7
|
ZLCollectionViewFlowLayout: c99024652ce9f0c57d33ab53052c9b85e4a936b7
|
||||||
|
|
||||||
PODFILE CHECKSUM: 377abda18823bc4a29b1f0df9b0b4e424bd6f61c
|
PODFILE CHECKSUM: 6c65b83f79bba5e0d4aa83b16b51554490a0376c
|
||||||
|
|
||||||
COCOAPODS: 1.16.2
|
COCOAPODS: 1.16.2
|
||||||
|
@@ -32,13 +32,9 @@
|
|||||||
189DD76226E60DDC00AB55B1 /* Api+Login.m in Sources */ = {isa = PBXBuildFile; fileRef = 189DD76126E60DDC00AB55B1 /* Api+Login.m */; };
|
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 */; };
|
18E7B1B726E8B2D10064BC9B /* Api+Main.m in Sources */ = {isa = PBXBuildFile; fileRef = 18E7B1B626E8B2D10064BC9B /* Api+Main.m */; };
|
||||||
18E7B31826F097E00064BC9B /* UserInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 18E7B31726F097E00064BC9B /* UserInfoModel.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 */; };
|
23116B0B2BDB8FDC00F7F97A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 2368ECD72BC38FED00EDF4C9 /* PrivacyInfo.xcprivacy */; };
|
||||||
232EBBFF2BD7A25500E8CEAD /* MSParamsDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 232EBBFE2BD7A25500E8CEAD /* MSParamsDecode.m */; };
|
232EBBFF2BD7A25500E8CEAD /* MSParamsDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 232EBBFE2BD7A25500E8CEAD /* MSParamsDecode.m */; };
|
||||||
2331C1BD2A60F69E00E1D940 /* UILabel+Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = 2331C1BC2A60F69E00E1D940 /* UILabel+Utils.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 */; };
|
235A45232B04BEB6009753F5 /* PIBaseModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 235A45222B04BEB6009753F5 /* PIBaseModel.m */; };
|
||||||
2368ECCF2BC38F9800EDF4C9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2368ECCD2BC38F9800EDF4C9 /* InfoPlist.strings */; };
|
2368ECCF2BC38F9800EDF4C9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2368ECCD2BC38F9800EDF4C9 /* InfoPlist.strings */; };
|
||||||
2368ECD32BC38FDA00EDF4C9 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2368ECD52BC38FDA00EDF4C9 /* Launch Screen.storyboard */; };
|
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 */; };
|
23CEFC632AFB8FC100576D89 /* BSRealTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23CEFC442AFB8FC100576D89 /* BSRealTextView.m */; };
|
||||||
23CEFC642AFB8FC100576D89 /* BSkObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 23CEFC472AFB8FC100576D89 /* BSkObject.m */; };
|
23CEFC642AFB8FC100576D89 /* BSkObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 23CEFC472AFB8FC100576D89 /* BSkObject.m */; };
|
||||||
23CEFC652AFB8FC100576D89 /* BSDrawLine.m in Sources */ = {isa = PBXBuildFile; fileRef = 23CEFC482AFB8FC100576D89 /* BSDrawLine.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 */; };
|
23E56B3C2B03564B00C8DAC9 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 23E56B3B2B03564B00C8DAC9 /* CoreTelephony.framework */; };
|
||||||
4C06427F2E97BD6D00BAF413 /* EPMineHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0642732E97BD6D00BAF413 /* EPMineHeaderView.m */; };
|
4C06427F2E97BD6D00BAF413 /* EPMineHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0642732E97BD6D00BAF413 /* EPMineHeaderView.m */; };
|
||||||
4C0642802E97BD6D00BAF413 /* EPMomentCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C06427A2E97BD6D00BAF413 /* EPMomentCell.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 */; };
|
4CD19C8F2E9CBBC80069DAA0 /* EPLoginManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19C8B2E9CBBC80069DAA0 /* EPLoginManager.swift */; };
|
||||||
4CD19C912E9CBBD30069DAA0 /* EPLoginBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19C902E9CBBD30069DAA0 /* EPLoginBridge.swift */; };
|
4CD19C912E9CBBD30069DAA0 /* EPLoginBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19C902E9CBBD30069DAA0 /* EPLoginBridge.swift */; };
|
||||||
4CD19C932E9CCF2C0069DAA0 /* EPLoginConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19C922E9CCF2C0069DAA0 /* EPLoginConfig.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 */; };
|
4CD19E7C2E9CDF980069DAA0 /* TTPopupService.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D982E9CDF980069DAA0 /* TTPopupService.m */; };
|
||||||
4CD19E7E2E9CDF980069DAA0 /* XNDJTDDLoadingTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DC82E9CDF980069DAA0 /* XNDJTDDLoadingTool.m */; };
|
4CD19E7E2E9CDF980069DAA0 /* XNDJTDDLoadingTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DC82E9CDF980069DAA0 /* XNDJTDDLoadingTool.m */; };
|
||||||
4CD19E802E9CDF980069DAA0 /* TTPopup.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DA32E9CDF980069DAA0 /* TTPopup.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 */; };
|
4CD19E812E9CDF980069DAA0 /* UIView+GradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DB62E9CDF980069DAA0 /* UIView+GradientLayer.m */; };
|
||||||
4CD19E822E9CDF980069DAA0 /* TTAlertMessageAttributedConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D8F2E9CDF980069DAA0 /* TTAlertMessageAttributedConfig.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 */; };
|
4CD19E862E9CDF980069DAA0 /* TTAlertButtonConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19D8B2E9CDF980069DAA0 /* TTAlertButtonConfig.m */; };
|
||||||
4CD19E882E9CDF980069DAA0 /* UIView+Corner.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DB32E9CDF980069DAA0 /* UIView+Corner.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 */; };
|
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 */; };
|
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 */; };
|
4CD19E9B2E9CDF980069DAA0 /* XCCurrentVCStackManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DC62E9CDF980069DAA0 /* XCCurrentVCStackManager.m */; };
|
||||||
4CD19E9C2E9CDF980069DAA0 /* UIImage+ImageEffects.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DB92E9CDF980069DAA0 /* UIImage+ImageEffects.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 */; };
|
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 */; };
|
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 */; };
|
4CD19EA82E9CDF980069DAA0 /* UIImageConstant.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19DB02E9CDF980069DAA0 /* UIImageConstant.m */; };
|
||||||
4CD19EAE2E9CDFC30069DAA0 /* EPLoginButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19EAC2E9CDFC30069DAA0 /* EPLoginButton.swift */; };
|
4CD19EAE2E9CDFC30069DAA0 /* EPLoginButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19EAC2E9CDFC30069DAA0 /* EPLoginButton.swift */; };
|
||||||
4CD19EAF2E9CDFC30069DAA0 /* EPLoginInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19EAD2E9CDFC30069DAA0 /* EPLoginInputView.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 */; };
|
4CD19EB52E9D15000069DAA0 /* EPAboutUsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD19EB62E9D15000069DAA0 /* EPAboutUsViewController.swift */; };
|
||||||
4CDF7F3F2E9E580E00113F54 /* EPEmotionColorStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDF7F3E2E9E580E00113F54 /* EPEmotionColorStorage.m */; };
|
4CDF7F3F2E9E580E00113F54 /* EPEmotionColorStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDF7F3E2E9E580E00113F54 /* EPEmotionColorStorage.m */; };
|
||||||
4CDF7F422E9E581900113F54 /* EPEmotionColorPicker.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDF7F412E9E581900113F54 /* EPEmotionColorPicker.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 */; };
|
4CF4640B2EA12723005E96C0 /* DJDKMIMOMColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF4640A2EA12723005E96C0 /* DJDKMIMOMColor.m */; };
|
||||||
4CF464292EA1277C005E96C0 /* TTPopup.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF464272EA1277C005E96C0 /* TTPopup.m */; };
|
4CF464292EA1277C005E96C0 /* TTPopup.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF464272EA1277C005E96C0 /* TTPopup.m */; };
|
||||||
4CF4642A2EA1277C005E96C0 /* TTAlertConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF464112EA1277C005E96C0 /* TTAlertConfig.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 */; };
|
4CF464302EA1277C005E96C0 /* TTNewAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF464242EA1277C005E96C0 /* TTNewAlertView.m */; };
|
||||||
4CF464312EA1277C005E96C0 /* TTActionSheetConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF4640D2EA1277C005E96C0 /* TTActionSheetConfig.m */; };
|
4CF464312EA1277C005E96C0 /* TTActionSheetConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF4640D2EA1277C005E96C0 /* TTActionSheetConfig.m */; };
|
||||||
4CF464322EA1277C005E96C0 /* TTAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF464222EA1277C005E96C0 /* TTAlertView.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 */; };
|
73FFADDC93E195344047A2EC /* Pods_YuMi.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CACF623970097D653132D69A /* Pods_YuMi.framework */; };
|
||||||
9B0E1C5926E77022005D4442 /* BaseNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B0E1C5826E77022005D4442 /* BaseNavigationController.m */; };
|
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 */; };
|
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 */; };
|
9BA8A47527C60D9F000365A3 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9BA8A47427C60D9F000365A3 /* AudioToolbox.framework */; };
|
||||||
9BA8A47727C60DF7000365A3 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9BA8A47627C60DF7000365A3 /* AVFoundation.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 */; };
|
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 */; };
|
E82109AD26F1C8A000FC3319 /* CountDownHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E82109AC26F1C8A000FC3319 /* CountDownHelper.m */; };
|
||||||
E83645A82A40AF5400E0DBE4 /* NSBundle+Localizable.m in Sources */ = {isa = PBXBuildFile; fileRef = E83645A72A40AF5400E0DBE4 /* NSBundle+Localizable.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 */; };
|
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 */; };
|
E88749B6282B8FC600C3C7DB /* MomentsInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E88749B5282B8FC600C3C7DB /* MomentsInfoModel.m */; };
|
||||||
E88863D3278ED4C0004BCFAB /* Timestamp.m in Sources */ = {isa = PBXBuildFile; fileRef = E88863D2278ED4C0004BCFAB /* Timestamp.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 */; };
|
E8E70D7E26F2F19D00F03460 /* Api+Mine.m in Sources */ = {isa = PBXBuildFile; fileRef = E8E70D7D26F2F19D00F03460 /* Api+Mine.m */; };
|
||||||
E8EEB8F226FC2050007C6EBA /* SDPhotoBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8EC26FC2050007C6EBA /* SDPhotoBrowser.m */; };
|
E8EEB8F226FC2050007C6EBA /* SDPhotoBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8EC26FC2050007C6EBA /* SDPhotoBrowser.m */; };
|
||||||
E8EEB8F326FC2050007C6EBA /* SDWaitingView.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8ED26FC2050007C6EBA /* SDWaitingView.m */; };
|
E8EEB8F326FC2050007C6EBA /* SDWaitingView.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8ED26FC2050007C6EBA /* SDWaitingView.m */; };
|
||||||
E8EEB8F426FC2050007C6EBA /* SDBrowserImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8EE26FC2050007C6EBA /* SDBrowserImageView.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 */; };
|
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 */; };
|
E8F6135F291E274E00E12650 /* NSArray+Safe.m in Sources */ = {isa = PBXBuildFile; fileRef = E8F6135E291E274E00E12650 /* NSArray+Safe.m */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
@@ -265,18 +235,10 @@
|
|||||||
18E7B1B626E8B2D10064BC9B /* Api+Main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "Api+Main.m"; sourceTree = "<group>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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; };
|
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; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
E8F6135D291E274E00E12650 /* NSArray+Safe.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSArray+Safe.h"; sourceTree = "<group>"; };
|
||||||
@@ -596,12 +507,6 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
4C0642842E97BD9500BAF413 /* APIConfig.swift */,
|
4C0642842E97BD9500BAF413 /* APIConfig.swift */,
|
||||||
E8DEC99327648FA50078CB70 /* ClientConfig.h */,
|
|
||||||
E8DEC99427648FA50078CB70 /* ClientConfig.m */,
|
|
||||||
E875FA8527D619820086ED04 /* ClientDataModel.h */,
|
|
||||||
E875FA8627D619820086ED04 /* ClientDataModel.m */,
|
|
||||||
9BA812D028BF145700783EA7 /* ClientRedPacketModel.h */,
|
|
||||||
9BA812D128BF145700783EA7 /* ClientRedPacketModel.m */,
|
|
||||||
);
|
);
|
||||||
path = Config;
|
path = Config;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -672,7 +577,6 @@
|
|||||||
14D8768029A751A100E1DD7F /* Config */,
|
14D8768029A751A100E1DD7F /* Config */,
|
||||||
189DD56B26DF5B0900AB55B1 /* Structure */,
|
189DD56B26DF5B0900AB55B1 /* Structure */,
|
||||||
189DD56126DE45F800AB55B1 /* Modules */,
|
189DD56126DE45F800AB55B1 /* Modules */,
|
||||||
4CF462D12EA10E1B005E96C0 /* YMWeb */,
|
|
||||||
E81C27AF26EF39B00031E639 /* AppDelegate */,
|
E81C27AF26EF39B00031E639 /* AppDelegate */,
|
||||||
189DD53826DE255600AB55B1 /* Assets.xcassets */,
|
189DD53826DE255600AB55B1 /* Assets.xcassets */,
|
||||||
2368ECD52BC38FDA00EDF4C9 /* Launch Screen.storyboard */,
|
2368ECD52BC38FDA00EDF4C9 /* Launch Screen.storyboard */,
|
||||||
@@ -740,22 +644,6 @@
|
|||||||
187EEEEE26E89FE8002833B2 /* AccountInfoStorage.m */,
|
187EEEEE26E89FE8002833B2 /* AccountInfoStorage.m */,
|
||||||
18E7B31626F097E00064BC9B /* UserInfoModel.h */,
|
18E7B31626F097E00064BC9B /* UserInfoModel.h */,
|
||||||
18E7B31726F097E00064BC9B /* UserInfoModel.m */,
|
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;
|
path = Model;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -793,7 +681,6 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
23CEFC082AFB8FC100576D89 /* sdkContent */,
|
23CEFC082AFB8FC100576D89 /* sdkContent */,
|
||||||
23FF255C2ABA8EEE0064E904 /* PIIAPTool */,
|
|
||||||
E83645A42A40AEF600E0DBE4 /* Bundle */,
|
E83645A42A40AEF600E0DBE4 /* Bundle */,
|
||||||
E8F61356291E269700E12650 /* Safe */,
|
E8F61356291E269700E12650 /* Safe */,
|
||||||
9B33E3C827D85379003B0E62 /* File */,
|
9B33E3C827D85379003B0E62 /* File */,
|
||||||
@@ -856,10 +743,7 @@
|
|||||||
18E7B1B426E8B2960064BC9B /* YMTabbar */ = {
|
18E7B1B426E8B2960064BC9B /* YMTabbar */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
E8B3E8062848B84F009746AB /* Model */,
|
|
||||||
E8B3E8052848B849009746AB /* Api */,
|
E8B3E8052848B849009746AB /* Api */,
|
||||||
E8B3E8042848B842009746AB /* View */,
|
|
||||||
E8B3E8032848B838009746AB /* Presenter */,
|
|
||||||
);
|
);
|
||||||
path = YMTabbar;
|
path = YMTabbar;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -1067,14 +951,6 @@
|
|||||||
path = K;
|
path = K;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
23FF255C2ABA8EEE0064E904 /* PIIAPTool */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
23D8DEF12AC5633300644637 /* PIIAPRegulate.swift */,
|
|
||||||
);
|
|
||||||
path = PIIAPTool;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
4C0642712E97BD6D00BAF413 /* Controllers */ = {
|
4C0642712E97BD6D00BAF413 /* Controllers */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1253,46 +1129,6 @@
|
|||||||
path = Services;
|
path = Services;
|
||||||
sourceTree = "<group>";
|
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 */ = {
|
4CD19D902E9CDF980069DAA0 /* Config */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1353,15 +1189,6 @@
|
|||||||
path = TTPopup;
|
path = TTPopup;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
4CD19DA72E9CDF980069DAA0 /* UIButton */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
4CD19DA52E9CDF980069DAA0 /* UIButton+EnlargeTouchArea.h */,
|
|
||||||
4CD19DA62E9CDF980069DAA0 /* UIButton+EnlargeTouchArea.m */,
|
|
||||||
);
|
|
||||||
path = UIButton;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
4CD19DAA2E9CDF980069DAA0 /* UIImage */ = {
|
4CD19DAA2E9CDF980069DAA0 /* UIImage */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1417,10 +1244,7 @@
|
|||||||
4CF464282EA1277C005E96C0 /* TTPopup */,
|
4CF464282EA1277C005E96C0 /* TTPopup */,
|
||||||
4CF464092EA12723005E96C0 /* DJDKMIMOMColor.h */,
|
4CF464092EA12723005E96C0 /* DJDKMIMOMColor.h */,
|
||||||
4CF4640A2EA12723005E96C0 /* DJDKMIMOMColor.m */,
|
4CF4640A2EA12723005E96C0 /* DJDKMIMOMColor.m */,
|
||||||
4CD19C9A2E9CDF980069DAA0 /* Adbvertise */,
|
|
||||||
4CD19D762E9CDF980069DAA0 /* MSRTL */,
|
|
||||||
4CD19DA42E9CDF980069DAA0 /* TTPopup */,
|
4CD19DA42E9CDF980069DAA0 /* TTPopup */,
|
||||||
4CD19DA72E9CDF980069DAA0 /* UIButton */,
|
|
||||||
4CD19DAA2E9CDF980069DAA0 /* UIImage */,
|
4CD19DAA2E9CDF980069DAA0 /* UIImage */,
|
||||||
4CD19DB12E9CDF980069DAA0 /* UIImageView */,
|
4CD19DB12E9CDF980069DAA0 /* UIImageView */,
|
||||||
4CD19DB42E9CDF980069DAA0 /* UIViewCorner */,
|
4CD19DB42E9CDF980069DAA0 /* UIViewCorner */,
|
||||||
@@ -1434,17 +1258,6 @@
|
|||||||
path = CustomUI;
|
path = CustomUI;
|
||||||
sourceTree = "<group>";
|
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 */ = {
|
4CF464142EA1277C005E96C0 /* Config */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1522,8 +1335,6 @@
|
|||||||
9B33E3C927D85379003B0E62 /* UploadFile.m */,
|
9B33E3C927D85379003B0E62 /* UploadFile.m */,
|
||||||
23959FE52BB15C930085A282 /* UploadFileModel.h */,
|
23959FE52BB15C930085A282 /* UploadFileModel.h */,
|
||||||
23959FE62BB15C930085A282 /* UploadFileModel.m */,
|
23959FE62BB15C930085A282 /* UploadFileModel.m */,
|
||||||
548D541E2CC208FD0084A2FF /* AlbumResourcePickerViewController.h */,
|
|
||||||
548D541F2CC208FD0084A2FF /* AlbumResourcePickerViewController.m */,
|
|
||||||
);
|
);
|
||||||
path = File;
|
path = File;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -1611,8 +1422,6 @@
|
|||||||
children = (
|
children = (
|
||||||
189DD52C26DE255300AB55B1 /* AppDelegate.h */,
|
189DD52C26DE255300AB55B1 /* AppDelegate.h */,
|
||||||
189DD52D26DE255300AB55B1 /* AppDelegate.m */,
|
189DD52D26DE255300AB55B1 /* AppDelegate.m */,
|
||||||
234D821C2AEC57CF0022EFEB /* YYTextAsyncLayer+PITextAsyncLayer.h */,
|
|
||||||
234D821D2AEC57CF0022EFEB /* YYTextAsyncLayer+PITextAsyncLayer.m */,
|
|
||||||
);
|
);
|
||||||
path = AppDelegate;
|
path = AppDelegate;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -1675,20 +1484,6 @@
|
|||||||
path = Timestamp;
|
path = Timestamp;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
E8B3E8032848B838009746AB /* Presenter */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
);
|
|
||||||
path = Presenter;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
E8B3E8042848B842009746AB /* View */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
);
|
|
||||||
path = View;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
E8B3E8052848B849009746AB /* Api */ = {
|
E8B3E8052848B849009746AB /* Api */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1698,13 +1493,6 @@
|
|||||||
path = Api;
|
path = Api;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
E8B3E8062848B84F009746AB /* Model */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
);
|
|
||||||
path = Model;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
E8E70D6E26F2EB1200F03460 /* YMMine */ = {
|
E8E70D6E26F2EB1200F03460 /* YMMine */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1901,39 +1689,21 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
180116FC279E8CCE00F2CBC0 /* NVDate.m in Sources */,
|
180116FC279E8CCE00F2CBC0 /* NVDate.m in Sources */,
|
||||||
54B9C6EA2C9C2DDC003F1CC5 /* GuildInfo.m in Sources */,
|
|
||||||
234D821E2AEC57CF0022EFEB /* YYTextAsyncLayer+PITextAsyncLayer.m in Sources */,
|
|
||||||
4C4707A52D53430300C8CD24 /* NSData+GZIP.m in Sources */,
|
4C4707A52D53430300C8CD24 /* NSData+GZIP.m in Sources */,
|
||||||
23CEFC542AFB8FC100576D89 /* BSNotification.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 */,
|
4CD19E7C2E9CDF980069DAA0 /* TTPopupService.m in Sources */,
|
||||||
4CD19E7E2E9CDF980069DAA0 /* XNDJTDDLoadingTool.m in Sources */,
|
4CD19E7E2E9CDF980069DAA0 /* XNDJTDDLoadingTool.m in Sources */,
|
||||||
4CD19E802E9CDF980069DAA0 /* TTPopup.m in Sources */,
|
4CD19E802E9CDF980069DAA0 /* TTPopup.m in Sources */,
|
||||||
4CD19E812E9CDF980069DAA0 /* UIView+GradientLayer.m in Sources */,
|
4CD19E812E9CDF980069DAA0 /* UIView+GradientLayer.m in Sources */,
|
||||||
4CD19E822E9CDF980069DAA0 /* TTAlertMessageAttributedConfig.m in Sources */,
|
4CD19E822E9CDF980069DAA0 /* TTAlertMessageAttributedConfig.m in Sources */,
|
||||||
4CD19E842E9CDF980069DAA0 /* XPAdvertiseView.m in Sources */,
|
|
||||||
4CD19E852E9CDF980069DAA0 /* UISwipeGestureRecognizer+MSRTL.m in Sources */,
|
|
||||||
4CD19E862E9CDF980069DAA0 /* TTAlertButtonConfig.m in Sources */,
|
4CD19E862E9CDF980069DAA0 /* TTAlertButtonConfig.m in Sources */,
|
||||||
4CD19E882E9CDF980069DAA0 /* UIView+Corner.m in Sources */,
|
4CD19E882E9CDF980069DAA0 /* UIView+Corner.m in Sources */,
|
||||||
4CD19E8D2E9CDF980069DAA0 /* NetImageView.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 */,
|
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 */,
|
4CD19E9B2E9CDF980069DAA0 /* XCCurrentVCStackManager.m in Sources */,
|
||||||
4CD19E9C2E9CDF980069DAA0 /* UIImage+ImageEffects.m in Sources */,
|
4CD19E9C2E9CDF980069DAA0 /* UIImage+ImageEffects.m in Sources */,
|
||||||
4CD19E9D2E9CDF980069DAA0 /* UIImage+Utils.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 */,
|
4CD19EA42E9CDF980069DAA0 /* TTPopupManagerService.m in Sources */,
|
||||||
4CD19EA52E9CDF980069DAA0 /* MSBaseTextField.m in Sources */,
|
|
||||||
4CD19EA62E9CDF980069DAA0 /* XPAdImageTool.m in Sources */,
|
|
||||||
4CD19EA82E9CDF980069DAA0 /* UIImageConstant.m in Sources */,
|
4CD19EA82E9CDF980069DAA0 /* UIImageConstant.m in Sources */,
|
||||||
4C06428B2E98DC5F00BAF413 /* EPTabBarController.swift in Sources */,
|
4C06428B2E98DC5F00BAF413 /* EPTabBarController.swift in Sources */,
|
||||||
4CF464292EA1277C005E96C0 /* TTPopup.m in Sources */,
|
4CF464292EA1277C005E96C0 /* TTPopup.m in Sources */,
|
||||||
@@ -1949,24 +1719,20 @@
|
|||||||
4C1E98C32E9A45160031AE79 /* EPImageUploader.swift in Sources */,
|
4C1E98C32E9A45160031AE79 /* EPImageUploader.swift in Sources */,
|
||||||
4C1E98C42E9A45160031AE79 /* EPProgressHUD.swift in Sources */,
|
4C1E98C42E9A45160031AE79 /* EPProgressHUD.swift in Sources */,
|
||||||
E8E70D7E26F2F19D00F03460 /* Api+Mine.m in Sources */,
|
E8E70D7E26F2F19D00F03460 /* Api+Mine.m in Sources */,
|
||||||
E8EEB8F726FC2673007C6EBA /* UserPhoto.m in Sources */,
|
|
||||||
E81C27A226EF23490031E639 /* YUMINNNN.h in Sources */,
|
E81C27A226EF23490031E639 /* YUMINNNN.h in Sources */,
|
||||||
4CA7410E2E72B8FC00DB6853 /* YMLanguageConfig.m in Sources */,
|
4CA7410E2E72B8FC00DB6853 /* YMLanguageConfig.m in Sources */,
|
||||||
E855515B280559FE005F293F /* NSDate+DateUtils.m in Sources */,
|
E855515B280559FE005F293F /* NSDate+DateUtils.m in Sources */,
|
||||||
189DD76226E60DDC00AB55B1 /* Api+Login.m in Sources */,
|
189DD76226E60DDC00AB55B1 /* Api+Login.m in Sources */,
|
||||||
54F4693B2C2A984D00A83655 /* MedalModel.m in Sources */,
|
|
||||||
23CEFC4E2AFB8FC100576D89 /* BSNSDictionary.m in Sources */,
|
23CEFC4E2AFB8FC100576D89 /* BSNSDictionary.m in Sources */,
|
||||||
E8EEB8F326FC2050007C6EBA /* SDWaitingView.m in Sources */,
|
E8EEB8F326FC2050007C6EBA /* SDWaitingView.m in Sources */,
|
||||||
23CEFC512AFB8FC100576D89 /* SystemUtil.m in Sources */,
|
23CEFC512AFB8FC100576D89 /* SystemUtil.m in Sources */,
|
||||||
23CEFC5E2AFB8FC100576D89 /* BSRealTimeView.m in Sources */,
|
23CEFC5E2AFB8FC100576D89 /* BSRealTimeView.m in Sources */,
|
||||||
9BA812D228BF145700783EA7 /* ClientRedPacketModel.m in Sources */,
|
|
||||||
4C7B91D82EA096DE00A5E236 /* EPEmotionInfoView.m in Sources */,
|
4C7B91D82EA096DE00A5E236 /* EPEmotionInfoView.m in Sources */,
|
||||||
189DD73E26E21C3F00AB55B1 /* YYUtility.m in Sources */,
|
189DD73E26E21C3F00AB55B1 /* YYUtility.m in Sources */,
|
||||||
23CEFC652AFB8FC100576D89 /* BSDrawLine.m in Sources */,
|
23CEFC652AFB8FC100576D89 /* BSDrawLine.m in Sources */,
|
||||||
180116F9279E8C4C00F2CBC0 /* PLTimeUtil.m in Sources */,
|
180116F9279E8C4C00F2CBC0 /* PLTimeUtil.m in Sources */,
|
||||||
23CEFC502AFB8FC100576D89 /* UILabel+YBAttributeTextTapAction.m in Sources */,
|
23CEFC502AFB8FC100576D89 /* UILabel+YBAttributeTextTapAction.m in Sources */,
|
||||||
23CEFC5C2AFB8FC100576D89 /* BSNetListenModel.m in Sources */,
|
23CEFC5C2AFB8FC100576D89 /* BSNetListenModel.m in Sources */,
|
||||||
548D54202CC208FD0084A2FF /* AlbumResourcePickerViewController.m in Sources */,
|
|
||||||
23CEFC4A2AFB8FC100576D89 /* BSNSStringUtil.m in Sources */,
|
23CEFC4A2AFB8FC100576D89 /* BSNSStringUtil.m in Sources */,
|
||||||
E8EEB8F226FC2050007C6EBA /* SDPhotoBrowser.m in Sources */,
|
E8EEB8F226FC2050007C6EBA /* SDPhotoBrowser.m in Sources */,
|
||||||
23CEFC4F2AFB8FC100576D89 /* BSSDLayoutUtil.m in Sources */,
|
23CEFC4F2AFB8FC100576D89 /* BSSDLayoutUtil.m in Sources */,
|
||||||
@@ -1974,9 +1740,7 @@
|
|||||||
189DD55A26DE39D200AB55B1 /* BaseMvpPresenter.m in Sources */,
|
189DD55A26DE39D200AB55B1 /* BaseMvpPresenter.m in Sources */,
|
||||||
E88863D3278ED4C0004BCFAB /* Timestamp.m in Sources */,
|
E88863D3278ED4C0004BCFAB /* Timestamp.m in Sources */,
|
||||||
189DD6FF26E20E5900AB55B1 /* HttpRequestHelper.m in Sources */,
|
189DD6FF26E20E5900AB55B1 /* HttpRequestHelper.m in Sources */,
|
||||||
54FFD37A2C9BCB1900DE61E5 /* RelationUserVO.m in Sources */,
|
|
||||||
18E7B31826F097E00064BC9B /* UserInfoModel.m in Sources */,
|
18E7B31826F097E00064BC9B /* UserInfoModel.m in Sources */,
|
||||||
18E7B32126F098650064BC9B /* UserInfoSkillVo.m in Sources */,
|
|
||||||
4C0642912E98DC8700BAF413 /* EPMomentViewController.m in Sources */,
|
4C0642912E98DC8700BAF413 /* EPMomentViewController.m in Sources */,
|
||||||
232EBBFF2BD7A25500E8CEAD /* MSParamsDecode.m in Sources */,
|
232EBBFF2BD7A25500E8CEAD /* MSParamsDecode.m in Sources */,
|
||||||
23959FE72BB15C930085A282 /* UploadFileModel.m in Sources */,
|
23959FE72BB15C930085A282 /* UploadFileModel.m in Sources */,
|
||||||
@@ -1992,11 +1756,7 @@
|
|||||||
18E7B1B726E8B2D10064BC9B /* Api+Main.m in Sources */,
|
18E7B1B726E8B2D10064BC9B /* Api+Main.m in Sources */,
|
||||||
23CEFC5B2AFB8FC100576D89 /* BSSelectView.m in Sources */,
|
23CEFC5B2AFB8FC100576D89 /* BSSelectView.m in Sources */,
|
||||||
23CEFC622AFB8FC100576D89 /* BSLogNetDetailViewController.m in Sources */,
|
23CEFC622AFB8FC100576D89 /* BSLogNetDetailViewController.m in Sources */,
|
||||||
18E7B31E26F0984C0064BC9B /* UserLevelVo.m in Sources */,
|
|
||||||
4C7B909B2E9F822900A5E236 /* EPEmotionColorWheelView.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 */,
|
4C7B8F632E9F6E1300A5E236 /* EPSignatureColorGuideView.m in Sources */,
|
||||||
9B33E3CB27D85379003B0E62 /* UploadFile.m in Sources */,
|
9B33E3CB27D85379003B0E62 /* UploadFile.m in Sources */,
|
||||||
4CD19EAE2E9CDFC30069DAA0 /* EPLoginButton.swift in Sources */,
|
4CD19EAE2E9CDFC30069DAA0 /* EPLoginButton.swift in Sources */,
|
||||||
@@ -2010,7 +1770,6 @@
|
|||||||
E8F6135F291E274E00E12650 /* NSArray+Safe.m in Sources */,
|
E8F6135F291E274E00E12650 /* NSArray+Safe.m in Sources */,
|
||||||
4C06427F2E97BD6D00BAF413 /* EPMineHeaderView.m in Sources */,
|
4C06427F2E97BD6D00BAF413 /* EPMineHeaderView.m in Sources */,
|
||||||
4C0642802E97BD6D00BAF413 /* EPMomentCell.m in Sources */,
|
4C0642802E97BD6D00BAF413 /* EPMomentCell.m in Sources */,
|
||||||
E8DEC99527648FA50078CB70 /* ClientConfig.m in Sources */,
|
|
||||||
4CDF7F3F2E9E580E00113F54 /* EPEmotionColorStorage.m in Sources */,
|
4CDF7F3F2E9E580E00113F54 /* EPEmotionColorStorage.m in Sources */,
|
||||||
23CEFC602AFB8FC100576D89 /* RealViewCellModel.m in Sources */,
|
23CEFC602AFB8FC100576D89 /* RealViewCellModel.m in Sources */,
|
||||||
4CD19C872E9CB31C0069DAA0 /* EPLoginViewController.swift in Sources */,
|
4CD19C872E9CB31C0069DAA0 /* EPLoginViewController.swift in Sources */,
|
||||||
@@ -2043,7 +1802,6 @@
|
|||||||
4C1E98C92E9A4DFD0031AE79 /* EPQCloudConfig.swift in Sources */,
|
4C1E98C92E9A4DFD0031AE79 /* EPQCloudConfig.swift in Sources */,
|
||||||
4C1E98CA2E9A4DFD0031AE79 /* EPSDKManager.swift in Sources */,
|
4C1E98CA2E9A4DFD0031AE79 /* EPSDKManager.swift in Sources */,
|
||||||
E88749B6282B8FC600C3C7DB /* MomentsInfoModel.m in Sources */,
|
E88749B6282B8FC600C3C7DB /* MomentsInfoModel.m in Sources */,
|
||||||
E875FA8727D619820086ED04 /* ClientDataModel.m in Sources */,
|
|
||||||
4C1E98C62E9A45BC0031AE79 /* EPMomentAPISwiftHelper.swift in Sources */,
|
4C1E98C62E9A45BC0031AE79 /* EPMomentAPISwiftHelper.swift in Sources */,
|
||||||
23CEFC4D2AFB8FC100576D89 /* BSXWDateUtil.m in Sources */,
|
23CEFC4D2AFB8FC100576D89 /* BSXWDateUtil.m in Sources */,
|
||||||
189DD75926E6003C00AB55B1 /* Api.m in Sources */,
|
189DD75926E6003C00AB55B1 /* Api.m in Sources */,
|
||||||
@@ -2097,6 +1855,7 @@
|
|||||||
189DD54026DE255600AB55B1 /* Debug */ = {
|
189DD54026DE255600AB55B1 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
@@ -2156,6 +1915,7 @@
|
|||||||
189DD54126DE255600AB55B1 /* Release */ = {
|
189DD54126DE255600AB55B1 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
@@ -2304,10 +2064,6 @@
|
|||||||
"-framework",
|
"-framework",
|
||||||
"\"ImageIO\"",
|
"\"ImageIO\"",
|
||||||
"-framework",
|
"-framework",
|
||||||
"\"JXCategoryView\"",
|
|
||||||
"-framework",
|
|
||||||
"\"JXPagingView\"",
|
|
||||||
"-framework",
|
|
||||||
"\"JavaScriptCore\"",
|
"\"JavaScriptCore\"",
|
||||||
"-framework",
|
"-framework",
|
||||||
"\"LocalAuthentication\"",
|
"\"LocalAuthentication\"",
|
||||||
@@ -2318,8 +2074,6 @@
|
|||||||
"-framework",
|
"-framework",
|
||||||
"\"MJRefresh\"",
|
"\"MJRefresh\"",
|
||||||
"-framework",
|
"-framework",
|
||||||
"\"MarqueeLabel\"",
|
|
||||||
"-framework",
|
|
||||||
"\"Masonry\"",
|
"\"Masonry\"",
|
||||||
"-framework",
|
"-framework",
|
||||||
"\"Metal\"",
|
"\"Metal\"",
|
||||||
@@ -2376,8 +2130,6 @@
|
|||||||
"-framework",
|
"-framework",
|
||||||
"\"YYImage\"",
|
"\"YYImage\"",
|
||||||
"-framework",
|
"-framework",
|
||||||
"\"YYText\"",
|
|
||||||
"-framework",
|
|
||||||
"\"YYWebImage\"",
|
"\"YYWebImage\"",
|
||||||
"-framework",
|
"-framework",
|
||||||
"\"YuMi\"",
|
"\"YuMi\"",
|
||||||
@@ -2490,10 +2242,6 @@
|
|||||||
"-framework",
|
"-framework",
|
||||||
"\"ImageIO\"",
|
"\"ImageIO\"",
|
||||||
"-framework",
|
"-framework",
|
||||||
"\"JXCategoryView\"",
|
|
||||||
"-framework",
|
|
||||||
"\"JXPagingView\"",
|
|
||||||
"-framework",
|
|
||||||
"\"JavaScriptCore\"",
|
"\"JavaScriptCore\"",
|
||||||
"-framework",
|
"-framework",
|
||||||
"\"LocalAuthentication\"",
|
"\"LocalAuthentication\"",
|
||||||
@@ -2504,8 +2252,6 @@
|
|||||||
"-framework",
|
"-framework",
|
||||||
"\"MJRefresh\"",
|
"\"MJRefresh\"",
|
||||||
"-framework",
|
"-framework",
|
||||||
"\"MarqueeLabel\"",
|
|
||||||
"-framework",
|
|
||||||
"\"Masonry\"",
|
"\"Masonry\"",
|
||||||
"-framework",
|
"-framework",
|
||||||
"\"Metal\"",
|
"\"Metal\"",
|
||||||
@@ -2562,8 +2308,6 @@
|
|||||||
"-framework",
|
"-framework",
|
||||||
"\"YYImage\"",
|
"\"YYImage\"",
|
||||||
"-framework",
|
"-framework",
|
||||||
"\"YYText\"",
|
|
||||||
"-framework",
|
|
||||||
"\"YYWebImage\"",
|
"\"YYWebImage\"",
|
||||||
"-framework",
|
"-framework",
|
||||||
"\"YuMi\"",
|
"\"YuMi\"",
|
||||||
|
@@ -6,15 +6,10 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
#import <CoreData/CoreData.h>
|
|
||||||
@interface AppDelegate : UIResponder <UIApplicationDelegate>
|
@interface AppDelegate : UIResponder <UIApplicationDelegate>
|
||||||
|
|
||||||
@property (strong, nonatomic) UIWindow *window;
|
@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
|
@end
|
||||||
|
|
||||||
|
@@ -10,11 +10,7 @@
|
|||||||
|
|
||||||
#import "BaseNavigationController.h"
|
#import "BaseNavigationController.h"
|
||||||
#import <AppTrackingTransparency/AppTrackingTransparency.h>
|
#import <AppTrackingTransparency/AppTrackingTransparency.h>
|
||||||
#import "ClientConfig.h"
|
|
||||||
#import "AccountModel.h"
|
|
||||||
#import "YuMi-swift.h"
|
#import "YuMi-swift.h"
|
||||||
#import "EPSignatureColorGuideView.h"
|
|
||||||
#import "EPEmotionColorStorage.h"
|
|
||||||
|
|
||||||
UIKIT_EXTERN NSString * const kOpenRoomNotification;
|
UIKIT_EXTERN NSString * const kOpenRoomNotification;
|
||||||
|
|
||||||
@@ -33,13 +29,7 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification;
|
|||||||
self.window.rootViewController = launchScreenVC;
|
self.window.rootViewController = launchScreenVC;
|
||||||
[self.window makeKeyAndVisible];
|
[self.window makeKeyAndVisible];
|
||||||
|
|
||||||
@kWeakify(self);
|
[self loadMainPage];
|
||||||
[[ClientConfig shareConfig] clientConfig:^{
|
|
||||||
@kStrongify(self);
|
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
|
||||||
[self loadMainPage];
|
|
||||||
});
|
|
||||||
}];
|
|
||||||
|
|
||||||
if (@available(iOS 15, *)) {
|
if (@available(iOS 15, *)) {
|
||||||
[[UITableView appearance] setSectionHeaderTopPadding:0];
|
[[UITableView appearance] setSectionHeaderTopPadding:0];
|
||||||
@@ -89,8 +79,6 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification;
|
|||||||
[self checkAndShowSignatureColorGuide];
|
[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
|
@end
|
||||||
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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 {
|
|
||||||
// 倒计时方法1:GCD
|
|
||||||
[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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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));
|
|
||||||
}];
|
|
||||||
//使用RAC来监听字符串myString的变化
|
|
||||||
@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
|
|
@@ -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
|
|
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 用来解决YYText在RTL下的bug,如果昵称是阿语,整个富文本宽度计算会有误,在昵称前插入此空白字符串,可以修正布局。“i”可以是随意字母或中文
|
|
||||||
+ (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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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);
|
|
||||||
|
|
||||||
|
|
||||||
//根据selector查找Method
|
|
||||||
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{//添加不成功->交换
|
|
||||||
//添加失败了 说明本类中有methodB的实现,此时只需要将methodA和methodB的IMP互换一下即可。
|
|
||||||
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
|
|
@@ -672,32 +672,7 @@ class EPLoginTypesViewController: BaseViewController {
|
|||||||
/// 加载人机验证 Captcha WebView
|
/// 加载人机验证 Captcha WebView
|
||||||
/// - Parameter completion: 验证成功后的回调
|
/// - Parameter completion: 验证成功后的回调
|
||||||
private func loadCaptchaWebView(completion: @escaping () -> Void) {
|
private func loadCaptchaWebView(completion: @escaping () -> Void) {
|
||||||
guard ClientConfig.share().shouldDisplayCaptcha else {
|
completion()
|
||||||
// 不需要验证,直接执行
|
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -4,42 +4,19 @@
|
|||||||
//
|
//
|
||||||
// Created by YUMI on 2021/9/13.
|
// Created by YUMI on 2021/9/13.
|
||||||
//
|
//
|
||||||
///一些项目中所用到的key
|
///项目配置常量
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
@interface YUMIConstant : NSObject
|
@interface YUMIConstant : NSObject
|
||||||
|
|
||||||
UIKIT_EXTERN NSString * const kRoomMiniNotificationKey;
|
/// 配置Key类型枚举(仅保留实际使用的类型)
|
||||||
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;
|
|
||||||
typedef NS_ENUM(NSUInteger, Pi_KeyType) {
|
typedef NS_ENUM(NSUInteger, Pi_KeyType) {
|
||||||
KeyType_PasswordEncode,///密码 des 加密的
|
KeyType_Sign = 0, ///参数加密签名Key
|
||||||
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,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// 获取当前项目中所用到的 type 所对应的 value 的值 type 类型
|
/// 获取指定类型的配置值
|
||||||
NSString * const KeyWithType(Pi_KeyType type);
|
NSString * const KeyWithType(Pi_KeyType type);
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@@ -6,104 +6,16 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import "YUMIConstant.h"
|
#import "YUMIConstant.h"
|
||||||
#import "AESUtils.h"
|
|
||||||
@implementation YUMIConstant
|
@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) {
|
NSString * const KeyWithType(Pi_KeyType type) {
|
||||||
BOOL isRelase = YES;
|
// 参数加密签名Key(用于API请求签名)
|
||||||
#ifdef DEBUG
|
if (type == KeyType_Sign) {
|
||||||
NSString *isProduction = [[NSUserDefaults standardUserDefaults]valueForKey:@"kIsProductionEnvironment"];
|
return @"rpbs6us1m8r2j9g6u06ff2bo18orwaya";
|
||||||
if([isProduction isEqualToString:@"YES"]){
|
|
||||||
isRelase = YES;
|
|
||||||
}else{
|
|
||||||
isRelase = NO;
|
|
||||||
}
|
}
|
||||||
#else
|
return @"";
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@@ -11,115 +11,12 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
|
|
||||||
@interface YUMIHtmlUrl : NSObject
|
@interface YUMIHtmlUrl : NSObject
|
||||||
|
|
||||||
|
/// URL类型枚举(仅保留实际使用的类型)
|
||||||
typedef NS_ENUM(NSUInteger, URLType) {
|
typedef NS_ENUM(NSUInteger, URLType) {
|
||||||
kPrivacyURL,///隐私政策
|
kPrivacyURL = 0, ///隐私政策
|
||||||
kPrivacySDKURL,// 隐私政策-SDK
|
kUserProtocalURL = 4, ///用户协议
|
||||||
kPrivacyPersonalURL,// 隐私政策-个人信息
|
kFAQURL = 6, ///帮助/常见问题
|
||||||
kPrivacyDeviceURL,// 隐私政策-设备权限
|
kCaptchaSwitchPath = 113, ///人机验证
|
||||||
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,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
NSString * const URLWithType(URLType type);
|
NSString * const URLWithType(URLType type);
|
||||||
|
@@ -7,91 +7,37 @@
|
|||||||
|
|
||||||
#import "YUMIHtmlUrl.h"
|
#import "YUMIHtmlUrl.h"
|
||||||
#import "AESUtils.h"
|
#import "AESUtils.h"
|
||||||
#import "Base64.h"
|
|
||||||
#import <Base64/MF_Base64Additions.h>
|
|
||||||
@implementation YUMIHtmlUrl
|
@implementation YUMIHtmlUrl
|
||||||
|
|
||||||
NSString * const URLWithType(URLType type) {
|
NSString * const URLWithType(URLType type) {
|
||||||
NSString * prefix = @"eparty";
|
NSString *prefix = @"eparty";
|
||||||
NSDictionary *newDic = @{
|
|
||||||
@(kTreasureTicketBuyURL) : @"modules/act-treasureSnatching/index.html",///夺宝购买
|
// 明文 URL 配置(无需加密的路径)
|
||||||
@(kTreasureRankListURL) : @"modules/act-treasureSnatching/list.html",///夺宝达人
|
NSDictionary *plainUrls = @{
|
||||||
@(kTreasureRuleURL) : @"modules/act-treasureSnatching/rule.html",///夺宝规则说明
|
@(kCaptchaSwitchPath): @"modules/humanMachineVerification/index.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",///红包礼物,
|
|
||||||
@(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 *plainUrl = plainUrls[@(type)];
|
||||||
NSString * url = [newDic objectForKey:@(type)];
|
if (plainUrl) {
|
||||||
return [NSString stringWithFormat:@"%@/%@",prefix, url];
|
return [NSString stringWithFormat:@"%@/%@", prefix, plainUrl];
|
||||||
}
|
}
|
||||||
|
|
||||||
NSDictionary * dic = @{
|
// 加密 URL 配置(需要 AES 解密的路径)
|
||||||
@(kPrivacyURL) : @"sPa8x4YF1hFEeCeH5v+RMOulemxgjjZLbxkN8ZrBSM8=",//隐私政策 modules/rule/privacy-wap.html
|
NSDictionary *encryptedUrls = @{
|
||||||
@(kPrivacySDKURL) : @"EXbb0qKoel1tyEL3rQ3//BQ6p/uA56xs9iAOyFI7TRU=",//隐私政策-SDK modules/rule/sdk.html
|
@(kPrivacyURL): @"sPa8x4YF1hFEeCeH5v+RMOulemxgjjZLbxkN8ZrBSM8=", // modules/rule/privacy-wap.html
|
||||||
@(kPrivacyPersonalURL) : @"u+t46y/9x4S49BgHUeSXxxu2D69UtZtmyhA93HUTvzI=",//隐私政策-个人信息 modules/rule/personal-info.html
|
@(kUserProtocalURL): @"0sBhBaRqf7oBlYvNK4azCrVPTFjv9FYF0A2v9+qkSxg=", // modules/rule/protocol.html
|
||||||
@(kPrivacyDeviceURL) : @"u+t46y/9x4S49BgHUeSXx/rPFwLB78TiQyN+xJKENGQ=",//隐私政策-设备权限 modules/rule/permissions.html
|
@(kFAQURL): @"k/Bqnh8nGkuhV8KhU6xN5a8EkxEQrbDMAWNBtaAdJCo=", // modules/rule/guide.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",///收益记录
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
NSString * url = [dic objectForKey:@(type)];
|
|
||||||
NSString * webUrl = [AESUtils aesDecrypt:url];
|
NSString *encryptedUrl = encryptedUrls[@(type)];
|
||||||
return [NSString stringWithFormat:@"%@/%@",prefix, webUrl];
|
if (encryptedUrl) {
|
||||||
|
NSString *decryptedPath = [AESUtils aesDecrypt:encryptedUrl];
|
||||||
|
return [NSString stringWithFormat:@"%@/%@", prefix, decryptedPath];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 未找到对应的 URL 配置
|
||||||
|
return @"";
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@@ -4,88 +4,14 @@
|
|||||||
//
|
//
|
||||||
// Created by YUMI on 2021/9/13.
|
// Created by YUMI on 2021/9/13.
|
||||||
//
|
//
|
||||||
///放置一些全局的枚举
|
///全局枚举定义(仅保留实际使用的类型)
|
||||||
#ifndef YUMINNNN_h
|
#ifndef YUMINNNN_h
|
||||||
#define 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绑定xczAccount,6重设xcz密码,7解绑手机
|
|
||||||
typedef NS_ENUM(NSUInteger, GetSmsType) {
|
typedef NS_ENUM(NSUInteger, GetSmsType) {
|
||||||
GetSmsType_Regist = 1,///注册
|
GetSmsType_Regist = 1, ///注册
|
||||||
GetSmsType_Login = 2,///登录
|
GetSmsType_Reset_Password = 3, ///重设密码
|
||||||
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 */
|
#endif /* YUMINNNN_h */
|
||||||
|
@@ -6,11 +6,11 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
#import "YUMINNNN.h"
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
@interface PIUserSexView : UIView
|
@interface PIUserSexView : UIView
|
||||||
@property (nonatomic,assign) GenderType gender;
|
@property (nonatomic,assign) NSInteger gender; /// 性别 1:男 2:女
|
||||||
@property (nonatomic,assign) BOOL selected;
|
@property (nonatomic,assign) BOOL selected;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@@ -57,36 +57,26 @@
|
|||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setGender:(GenderType)gender {
|
- (void)setGender:(NSInteger)gender {
|
||||||
_gender = gender;
|
_gender = gender;
|
||||||
switch (_gender) {
|
if (_gender == 1) { // 男性
|
||||||
case GenderType_Male:
|
self.logoImageView.image = [UIImage imageNamed:@"login_full_male_logo"];
|
||||||
{
|
self.sexLb.text = YMLocalizedString(@"PIUserSexView0");
|
||||||
self.logoImageView.image = [UIImage imageNamed:@"login_full_male_logo"];
|
self.sexImageView.image = [UIImage imageNamed:@"login_full_male"];
|
||||||
self.sexLb.text = YMLocalizedString(@"PIUserSexView0");
|
} else if (_gender == 2) { // 女性
|
||||||
self.sexImageView.image = [UIImage imageNamed:@"login_full_male"];
|
self.logoImageView.image = [UIImage imageNamed:@"login_full_female_logo"];
|
||||||
}
|
self.sexLb.text = YMLocalizedString(@"PIUserSexView1");
|
||||||
break;
|
self.sexImageView.image = [UIImage imageNamed:@"login_full_female"];
|
||||||
case GenderType_Female:
|
|
||||||
{
|
|
||||||
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 {
|
- (void)setSelected:(BOOL)selected {
|
||||||
_selected = selected;
|
_selected = selected;
|
||||||
if (_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.image = [UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor colorWithHexString:@"#EBF5FF"],[DJDKMIMOMColor colorWithHexString:@"#FFFFFF"]] gradientType:GradientTypeTopToBottom imgSize:CGSizeMake(10, 10)];
|
||||||
self.backImageView.layer.borderColor = [DJDKMIMOMColor colorWithHexString:@"#B8E5FF"].CGColor;
|
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.image = [UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor colorWithHexString:@"#FFEBFA"],[DJDKMIMOMColor colorWithHexString:@"#FFFFFF"]] gradientType:GradientTypeTopToBottom imgSize:CGSizeMake(10, 10)];
|
||||||
self.backImageView.layer.borderColor = [DJDKMIMOMColor colorWithHexString:@"#FFB8E2"].CGColor;
|
self.backImageView.layer.borderColor = [DJDKMIMOMColor colorWithHexString:@"#FFB8E2"].CGColor;
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@@ -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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@@ -308,20 +308,6 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
+(void)getExchangeDiamondInformation:(HttpRequestHelperCompletion)completion;
|
+(void)getExchangeDiamondInformation:(HttpRequestHelperCompletion)completion;
|
||||||
|
|
||||||
+(void)confirmExchangeDiamond:(HttpRequestHelperCompletion)completion goldNum:(NSString *)goldNum diamondNum:(NSString *)diamondNum currency:(NSString *)currency;
|
+(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;
|
+(void)getTagList:(HttpRequestHelperCompletion)completion;
|
||||||
///保存个人简介标签
|
///保存个人简介标签
|
||||||
|
@@ -405,26 +405,7 @@
|
|||||||
NSString * fang = [NSString stringFromBase64String:@"Z29sZEV4Y2hhbmdlRGlhbW9uZC9leGNoYW5nZQ=="];///goldExchangeDiamond/exchange
|
NSString * fang = [NSString stringFromBase64String:@"Z29sZEV4Y2hhbmdlRGlhbW9uZC9leGNoYW5nZQ=="];///goldExchangeDiamond/exchange
|
||||||
[self makeRequest:fang method:HttpRequestHelperMethodPOST completion:completion,__FUNCTION__,goldNum,diamondNum,currency, nil];
|
[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{
|
+(void)getTagList:(HttpRequestHelperCompletion)completion{
|
||||||
[self makeRequest:@"label/edit" method:HttpRequestHelperMethodGET completion:completion,__FUNCTION__, nil];
|
[self makeRequest:@"label/edit" method:HttpRequestHelperMethodGET completion:completion,__FUNCTION__, nil];
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
#import "UserVipInfoVo.h"
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
typedef NS_ENUM(NSInteger, MonentsContentType) {
|
typedef NS_ENUM(NSInteger, MonentsContentType) {
|
||||||
///纯文字的
|
///纯文字的
|
||||||
@@ -27,8 +26,8 @@ typedef NS_ENUM(NSInteger, MonentsContentType) {
|
|||||||
@property (nonatomic,assign) NSInteger defUser;
|
@property (nonatomic,assign) NSInteger defUser;
|
||||||
///是否是新用户
|
///是否是新用户
|
||||||
@property (nonatomic,assign) BOOL newUser;
|
@property (nonatomic,assign) BOOL newUser;
|
||||||
///性别
|
///性别 1:男 2:女
|
||||||
@property (nonatomic,assign) GenderType gender;
|
@property (nonatomic,assign) NSInteger gender;
|
||||||
///头像
|
///头像
|
||||||
@property (nonatomic,copy) NSString *avatar;
|
@property (nonatomic,copy) NSString *avatar;
|
||||||
///年龄
|
///年龄
|
||||||
@@ -52,7 +51,7 @@ typedef NS_ENUM(NSInteger, MonentsContentType) {
|
|||||||
///话题是否置顶
|
///话题是否置顶
|
||||||
@property (nonatomic,assign) BOOL topicTop;
|
@property (nonatomic,assign) BOOL topicTop;
|
||||||
///VIP信息
|
///VIP信息
|
||||||
@property (nonatomic, strong) UserVipInfoVo *userVipInfoVO;
|
@property (nonatomic, strong) NSObject *userVipInfoVO;
|
||||||
///发布的内容
|
///发布的内容
|
||||||
@property (nonatomic,copy) NSArray<MomentsPicInfoModel *> *dynamicResList;
|
@property (nonatomic,copy) NSArray<MomentsPicInfoModel *> *dynamicResList;
|
||||||
///头饰url地址
|
///头饰url地址
|
||||||
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -101,7 +101,7 @@
|
|||||||
numStr = [NSString stringWithFormat:YMLocalizedString(@"XPRoomRankTableViewCell0"),numF];
|
numStr = [NSString stringWithFormat:YMLocalizedString(@"XPRoomRankTableViewCell0"),numF];
|
||||||
numStr = [numStr stringByReplacingOccurrencesOfString:@".0" withString:@""];
|
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.coinNumberLabel.text = numStr;
|
||||||
self.avatarImageView.imageUrl = rankModel.avatar;
|
self.avatarImageView.imageUrl = rankModel.avatar;
|
||||||
self.nickNameLabel.text = rankModel.nick;
|
self.nickNameLabel.text = rankModel.nick;
|
||||||
|
@@ -115,7 +115,7 @@
|
|||||||
numStr = [numStr stringByReplacingOccurrencesOfString:@".0" withString:@""];
|
numStr = [numStr stringByReplacingOccurrencesOfString:@".0" withString:@""];
|
||||||
}
|
}
|
||||||
self.sexImageView.hidden = NO;
|
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.coinLabel.text = numStr;
|
||||||
self.avatarImageView.imageUrl = rankModel.avatar;
|
self.avatarImageView.imageUrl = rankModel.avatar;
|
||||||
self.nickLabel.text = rankModel.nick;
|
self.nickLabel.text = rankModel.nick;
|
||||||
|
@@ -44,13 +44,7 @@
|
|||||||
}
|
}
|
||||||
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
|
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
|
||||||
if(self.topViewController == viewController) return;
|
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];
|
[super pushViewController:viewController animated:animated];
|
||||||
}
|
}
|
||||||
|
@@ -6,7 +6,6 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
#import "ClientConfig.h"
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@@ -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
|
|
@@ -1,12 +0,0 @@
|
|||||||
//
|
|
||||||
// GuildInfo.m
|
|
||||||
// YuMi
|
|
||||||
//
|
|
||||||
// Created by P on 2024/9/19.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "GuildInfo.h"
|
|
||||||
|
|
||||||
@implementation GuildInfo
|
|
||||||
|
|
||||||
@end
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -1,12 +0,0 @@
|
|||||||
//
|
|
||||||
// UserExpand.m
|
|
||||||
// YUMI
|
|
||||||
//
|
|
||||||
// Created by zu on 2021/9/14.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "UserExpand.h"
|
|
||||||
|
|
||||||
@implementation UserExpand
|
|
||||||
|
|
||||||
@end
|
|
@@ -6,16 +6,8 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import "NSObject+MJExtension.h"
|
#import "NSObject+MJExtension.h"
|
||||||
#import "UserExpand.h"
|
|
||||||
#import "UserLevelVo.h"
|
|
||||||
#import "UserInfoSkillVo.h"
|
|
||||||
#import "UserVipInfoVo.h"
|
|
||||||
#import "UserPhoto.h"
|
|
||||||
|
|
||||||
#import "MomentsInfoModel.h"
|
#import "MomentsInfoModel.h"
|
||||||
#import "MedalModel.h"
|
|
||||||
#import "RelationUserVO.h"
|
|
||||||
#import "GuildInfo.h"
|
|
||||||
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
@@ -47,17 +39,17 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
@property (nonatomic , assign) NSInteger createTime;
|
@property (nonatomic , assign) NSInteger createTime;
|
||||||
@property (nonatomic , assign) BOOL parentMode;
|
@property (nonatomic , assign) BOOL parentMode;
|
||||||
@property (nonatomic , assign) BOOL isBindPhone;
|
@property (nonatomic , assign) BOOL isBindPhone;
|
||||||
@property (nonatomic , strong) UserExpand * userExpand;
|
@property (nonatomic , strong) NSObject * userExpand;
|
||||||
@property (nonatomic , assign) NSInteger erbanNo;
|
@property (nonatomic , assign) NSInteger erbanNo;
|
||||||
@property (nonatomic , assign) NSInteger registerDay;
|
@property (nonatomic , assign) NSInteger registerDay;
|
||||||
@property (nonatomic , assign) BOOL isFirstCharge;
|
@property (nonatomic , assign) BOOL isFirstCharge;
|
||||||
@property (nonatomic , assign) BOOL hasPrettyErbanNo;
|
@property (nonatomic , assign) BOOL hasPrettyErbanNo;
|
||||||
@property (nonatomic , strong) UserLevelVo * userLevelVo;
|
@property (nonatomic , strong) NSObject * userLevelVo;
|
||||||
@property (nonatomic , assign) BOOL isBindApple;
|
@property (nonatomic , assign) BOOL isBindApple;
|
||||||
@property (nonatomic , assign) NSInteger fansNum;
|
@property (nonatomic , assign) NSInteger fansNum;
|
||||||
@property (nonatomic , assign) BOOL isBindBankCard;
|
@property (nonatomic , assign) BOOL isBindBankCard;
|
||||||
@property (nonatomic , assign) BOOL hasRegPacket;
|
@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 platformRole; /// 0 普通 1超管
|
||||||
@property (nonatomic , assign) NSInteger uid;
|
@property (nonatomic , assign) NSInteger uid;
|
||||||
@property (nonatomic , assign) NSInteger defUser;
|
@property (nonatomic , assign) NSInteger defUser;
|
||||||
@@ -68,7 +60,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
@property (nonatomic , copy) NSString * avatar;
|
@property (nonatomic , copy) NSString * avatar;
|
||||||
@property (nonatomic , copy) NSString * reviewingAvatar;
|
@property (nonatomic , copy) NSString * reviewingAvatar;
|
||||||
@property (nonatomic , assign) BOOL isReview;
|
@property (nonatomic , assign) BOOL isReview;
|
||||||
@property (nonatomic , strong) UserInfoSkillVo * userInfoSkillVo;
|
@property (nonatomic , strong) NSObject * userInfoSkillVo;
|
||||||
@property (nonatomic,copy) NSString *region;
|
@property (nonatomic,copy) NSString *region;
|
||||||
@property (nonatomic,copy) NSArray *labels;
|
@property (nonatomic,copy) NSArray *labels;
|
||||||
@property (nonatomic , assign) BOOL newUser;
|
@property (nonatomic , assign) BOOL newUser;
|
||||||
@@ -85,7 +77,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
///限时首充结束时间
|
///限时首充结束时间
|
||||||
@property (nonatomic, assign) long limitChargeEndTime;
|
@property (nonatomic, assign) long limitChargeEndTime;
|
||||||
///相册
|
///相册
|
||||||
@property (nonatomic, strong) NSArray<UserPhoto *> *privatePhoto;//相册
|
@property (nonatomic, strong) NSArray *privatePhoto;//相册
|
||||||
///签名
|
///签名
|
||||||
@property (nonatomic,copy) NSString *userDesc;
|
@property (nonatomic,copy) NSString *userDesc;
|
||||||
///出生日期
|
///出生日期
|
||||||
@@ -128,7 +120,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
///所选择的麦序
|
///所选择的麦序
|
||||||
@property (nonatomic,assign) int selectMicPosition;
|
@property (nonatomic,assign) int selectMicPosition;
|
||||||
///VIP信息
|
///VIP信息
|
||||||
@property (nonatomic, strong) UserVipInfoVo *userVipInfoVO;
|
@property (nonatomic, strong) NSObject *userVipInfoVO;
|
||||||
///当前使用的资料卡装扮
|
///当前使用的资料卡装扮
|
||||||
@property (nonatomic, copy) NSString *userInfoCardPic;
|
@property (nonatomic, copy) NSString *userInfoCardPic;
|
||||||
///麦位光圈链接
|
///麦位光圈链接
|
||||||
@@ -141,17 +133,12 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
|
|
||||||
///跟随的 本地添加的字段
|
///跟随的 本地添加的字段
|
||||||
@property (nonatomic,copy) NSString *fromNick;
|
@property (nonatomic,copy) NSString *fromNick;
|
||||||
@property (nonatomic,assign) UserEnterRoomFromType fromType;
|
|
||||||
@property (nonatomic,copy) NSString *fromUid;
|
@property (nonatomic,copy) NSString *fromUid;
|
||||||
///安卓房间公屏气泡
|
///安卓房间公屏气泡
|
||||||
@property (nonatomic, copy) NSString *androidBubbleUrl;
|
@property (nonatomic, copy) NSString *androidBubbleUrl;
|
||||||
///iOS房间公屏气泡
|
///iOS房间公屏气泡
|
||||||
@property (nonatomic, copy) NSString *iosBubbleUrl;
|
@property (nonatomic, copy) NSString *iosBubbleUrl;
|
||||||
#pragma mark - 小游戏
|
#pragma mark - 小游戏
|
||||||
/// 小游戏状态 0 未加入游戏;1 加入游戏未准备;2 加入游戏已准备 3 游戏中
|
|
||||||
@property (nonatomic, assign) LittleGamePlayStatus gameStatus;
|
|
||||||
///用户的参加PK的类型
|
|
||||||
@property (nonatomic, assign) GroupType groupType;
|
|
||||||
///礼物墙中的礼物
|
///礼物墙中的礼物
|
||||||
@property (nonatomic,strong) NSArray *userGiftWall;
|
@property (nonatomic,strong) NSArray *userGiftWall;
|
||||||
///礼物墙中的幸运礼物礼物
|
///礼物墙中的幸运礼物礼物
|
||||||
@@ -179,11 +166,11 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
///pk时不能禁麦
|
///pk时不能禁麦
|
||||||
@property(nonatomic,assign) BOOL isNoProhibitMic;
|
@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;
|
@property (nonatomic, copy) NSArray *userNameplateList;
|
||||||
|
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
+ (NSDictionary *)objectClassInArray {
|
+ (NSDictionary *)objectClassInArray {
|
||||||
return @{
|
return @{
|
||||||
|
@"dynamicInfo":MomentsInfoModel.class,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
|
@@ -1,12 +0,0 @@
|
|||||||
//
|
|
||||||
// UserInfoSkillVo.m
|
|
||||||
// YUMI
|
|
||||||
//
|
|
||||||
// Created by zu on 2021/9/14.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "UserInfoSkillVo.h"
|
|
||||||
|
|
||||||
@implementation UserInfoSkillVo
|
|
||||||
|
|
||||||
@end
|
|
@@ -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
|
|
@@ -1,12 +0,0 @@
|
|||||||
//
|
|
||||||
// UserLevelVo.m
|
|
||||||
// YUMI
|
|
||||||
//
|
|
||||||
// Created by zu on 2021/9/14.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "UserLevelVo.h"
|
|
||||||
|
|
||||||
@implementation UserLevelVo
|
|
||||||
|
|
||||||
@end
|
|
@@ -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
|
|
@@ -1,13 +0,0 @@
|
|||||||
//
|
|
||||||
// UserPhoto.m
|
|
||||||
// YUMI
|
|
||||||
//
|
|
||||||
// Created by YUMI on 2021/9/23.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "UserPhoto.h"
|
|
||||||
|
|
||||||
@implementation UserPhoto
|
|
||||||
|
|
||||||
|
|
||||||
@end
|
|
@@ -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
|
|
@@ -1,12 +0,0 @@
|
|||||||
//
|
|
||||||
// UserVipInfoVo.m
|
|
||||||
// YUMI
|
|
||||||
//
|
|
||||||
// Created by YUMI on 2022/1/4.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "UserVipInfoVo.h"
|
|
||||||
|
|
||||||
@implementation UserVipInfoVo
|
|
||||||
|
|
||||||
@end
|
|
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
#import "BaseMvpPresenter.h"
|
#import "BaseMvpPresenter.h"
|
||||||
#import "AccountInfoStorage.h"
|
#import "AccountInfoStorage.h"
|
||||||
#import "ClientConfig.h"
|
|
||||||
#import "BaseNavigationController.h"
|
#import "BaseNavigationController.h"
|
||||||
|
|
||||||
@interface BaseMvpPresenter()
|
@interface BaseMvpPresenter()
|
||||||
|
@@ -40,19 +40,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)setupTopTheme {
|
- (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 {
|
- (void)setupCustomNavigationBar:(void(^)(void))backAction title:(NSString *)title titleColor:(UIColor *)color {
|
||||||
@@ -203,7 +191,7 @@
|
|||||||
- (UIButton *)mvpBackButton {
|
- (UIButton *)mvpBackButton {
|
||||||
if (!_backButton) {
|
if (!_backButton) {
|
||||||
UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
|
UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
|
||||||
[b setImage:[kImage(@"common_nav_back_white") ms_SetImageForRTL]
|
[b setImage:kImage(@"common_nav_back_white")
|
||||||
forState:UIControlStateNormal];
|
forState:UIControlStateNormal];
|
||||||
[b addTarget:self
|
[b addTarget:self
|
||||||
action:@selector(didTapBack)
|
action:@selector(didTapBack)
|
||||||
|
@@ -36,7 +36,6 @@ isEnterprise = [bundleID isEqualToString:@"com.hflighting.yumi"];\
|
|||||||
#import "YUMIHtmlUrl.h"
|
#import "YUMIHtmlUrl.h"
|
||||||
#import "NSArray+Safe.h"
|
#import "NSArray+Safe.h"
|
||||||
#import "NSString+Utils.h"
|
#import "NSString+Utils.h"
|
||||||
#import "UIButton+EnlargeTouchArea.h"
|
|
||||||
#import "UIView+Corner.h"
|
#import "UIView+Corner.h"
|
||||||
#import "UIView+GradientLayer.h"
|
#import "UIView+GradientLayer.h"
|
||||||
#import "UILabel+Utils.h"
|
#import "UILabel+Utils.h"
|
||||||
@@ -50,15 +49,10 @@ isEnterprise = [bundleID isEqualToString:@"com.hflighting.yumi"];\
|
|||||||
#import "YUMIConstant.h"
|
#import "YUMIConstant.h"
|
||||||
#import "YUMINNNN.h"
|
#import "YUMINNNN.h"
|
||||||
#import "NSObject+MJExtension.h"
|
#import "NSObject+MJExtension.h"
|
||||||
#import <MarqueeLabel-Swift.h>
|
|
||||||
#import <YYText/YYText.h>
|
|
||||||
#import "HttpRequestHelper.h"
|
#import "HttpRequestHelper.h"
|
||||||
#import "BSNetListenModel.h"
|
#import "BSNetListenModel.h"
|
||||||
#import "PIBaseModel.h"
|
#import "PIBaseModel.h"
|
||||||
#import "PLTimeUtil.h"
|
#import "PLTimeUtil.h"
|
||||||
#import "UIImage+ImageEffects.h"
|
#import "UIImage+ImageEffects.h"
|
||||||
#import "UIImage+MSRTL.h"
|
|
||||||
#import "MSBaseRTLFlowLayout.h"
|
|
||||||
#import "MSBaseTextField.h"
|
|
||||||
#import "SZTextView.h"
|
#import "SZTextView.h"
|
||||||
#endif /* PrefixHeader_pch */
|
#endif /* PrefixHeader_pch */
|
||||||
|
@@ -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
|
|
@@ -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
|
|
@@ -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] = [:]// 用于完成Id的缓存map
|
|
||||||
|
|
||||||
@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()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@@ -9,8 +9,6 @@
|
|||||||
#import "YYUtility.h"
|
#import "YYUtility.h"
|
||||||
#import <CoreTelephony/CTTelephonyNetworkInfo.h> //为判断网络制式的主要文件
|
#import <CoreTelephony/CTTelephonyNetworkInfo.h> //为判断网络制式的主要文件
|
||||||
#import <CoreTelephony/CTCarrier.h> //添加获取客户端运营商 支持
|
#import <CoreTelephony/CTCarrier.h> //添加获取客户端运营商 支持
|
||||||
#import "ClientConfig.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -120,22 +118,11 @@ static NSString * const kMobileFrameworkResourceBundleName = @"YYMobileFramework
|
|||||||
static NSString *_from = nil;
|
static NSString *_from = nil;
|
||||||
|
|
||||||
+ (NSString *)getAppSource{
|
+ (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_Flight包或appstore App Store包
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return _from;
|
return _from;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (BOOL)isFromAppStore{
|
+ (BOOL)isFromAppStore{
|
||||||
if([[[YYUtility getAppSource] lowercaseString] isEqualToString:@"appstore"]){
|
|
||||||
return YES;
|
return YES;
|
||||||
}
|
|
||||||
return NO;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -149,7 +136,7 @@ static NSString *_from = nil;
|
|||||||
+ (YYUtilityTelephonType)getOperatorInfomation {
|
+ (YYUtilityTelephonType)getOperatorInfomation {
|
||||||
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
|
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
|
||||||
//NSLog(@"info = %@", info);
|
//NSLog(@"info = %@", info);
|
||||||
CTCarrier *carrier = [info subscriberCellularProvider];
|
CTCarrier *carrier = [info serviceSubscriberCellularProviders];
|
||||||
//NSLog(@"carrier = %@", carrier);
|
//NSLog(@"carrier = %@", carrier);
|
||||||
if (carrier == nil) {
|
if (carrier == nil) {
|
||||||
return YYUtilityTelephonType_Link_Unknown;
|
return YYUtilityTelephonType_Link_Unknown;
|
||||||
|
@@ -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 {
|
+ (NSString *)deviceUniqueIdentification {
|
||||||
// SSKeychain
|
// SSKeychain
|
||||||
NSString * currentDeviceUUIDStr = [SSKeychain passwordForService:@" " account:@"uuid"];
|
NSString * currentDeviceUUIDStr = [SSKeychain passwordForService:@" " account:@"uuid"];
|
||||||
|
@@ -204,13 +204,6 @@ typedef enum : NSUInteger {
|
|||||||
*/
|
*/
|
||||||
+ (void)checkAssetsLibrayAvailable:(void (^)(void))available denied:(void(^)(void))denied restriction:(void(^)(void))restriction;
|
+ (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 *)macAddresss;
|
||||||
+ (NSString *)idfa;
|
+ (NSString *)idfa;
|
||||||
|
|
||||||
|
@@ -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
|
|
@@ -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 这个协议类专门用来处理JavaScript调用原生OC的方法
|
|
||||||
@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协议,必须实现如下方法,然后把方法向外传递
|
|
||||||
//通过接收JS传出消息的name进行捕捉的回调方法
|
|
||||||
- (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];
|
|
||||||
|
|
||||||
//根据生成的WKUserScript对象,初始化WKWebViewConfiguration
|
|
||||||
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;
|
|
||||||
//添加KVO,WKWebView有一个属性estimatedProgress,就是当前网页加载的进度,所以监听这个属性
|
|
||||||
[_webview addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
|
|
||||||
//添加KVO,监听title属性
|
|
||||||
[_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
|
|
@@ -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
|
|
@@ -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
Reference in New Issue
Block a user