diff --git a/Podfile b/Podfile index 87cbf522..3098256b 100644 --- a/Podfile +++ b/Podfile @@ -46,14 +46,10 @@ target 'YuMi' do #上传音乐 pod 'CocoaAsyncSocket',:modular_headers => true #声网 - pod 'AgoraRtcEngine_iOS', '~> 4.2.2' - #上传图片 - pod 'Qiniu' - #内购 - pod 'IAPHelper' + pod 'AgoraRtcEngine_iOS', '~> 4.2.2' #持久化存储 - pod 'SSKeychain' - pod 'Base64' + pod 'SSKeychain' + pod 'Base64' #pop动画 pod 'pop', '~> 1.0.12' #云信 diff --git a/YuMi.xcodeproj/project.pbxproj b/YuMi.xcodeproj/project.pbxproj index 0ecc4e67..a4c2f67d 100644 --- a/YuMi.xcodeproj/project.pbxproj +++ b/YuMi.xcodeproj/project.pbxproj @@ -1263,7 +1263,6 @@ E89D60BA271D643A001F8895 /* Api+Room.m in Sources */ = {isa = PBXBuildFile; fileRef = E89D60B9271D643A001F8895 /* Api+Room.m */; }; E89D60BD271D647A001F8895 /* XPRoomPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = E89D60BC271D647A001F8895 /* XPRoomPresenter.m */; }; E89D60C1271D64B9001F8895 /* RoomInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E89D60C0271D64B9001F8895 /* RoomInfoModel.m */; }; - E89DA66427005932008483C1 /* XPIAPHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E89DA66327005932008483C1 /* XPIAPHelper.m */; }; E89DA66727006443008483C1 /* RechargeStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = E89DA66627006443008483C1 /* RechargeStorage.m */; }; E89DA67227008D59008483C1 /* WalletInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E89DA67127008D59008483C1 /* WalletInfoModel.m */; }; E89DA67527009ACD008483C1 /* XPMineRechargeNavView.m in Sources */ = {isa = PBXBuildFile; fileRef = E89DA67427009ACD008483C1 /* XPMineRechargeNavView.m */; }; @@ -1341,12 +1340,10 @@ E8B825C726EA0D9A009E8E9F /* LoginVerifCodeProtocol.h in Sources */ = {isa = PBXBuildFile; fileRef = E8B825C626EA0995009E8E9F /* LoginVerifCodeProtocol.h */; }; E8B825CA26EA1231009E8E9F /* LoginVerifCodeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B825C826EA1231009E8E9F /* LoginVerifCodeViewController.m */; }; E8B825CD26EA18C8009E8E9F /* DJDKMIMOMColor.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B825CC26EA18C8009E8E9F /* DJDKMIMOMColor.m */; }; - E8B846BC26FD7C1200A777FE /* UploadImage.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B846BB26FD7C1200A777FE /* UploadImage.m */; }; E8B846BF26FD827900A777FE /* XPMineUserInfoAlbumViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B846BE26FD827900A777FE /* XPMineUserInfoAlbumViewController.m */; }; E8B846C226FD82DC00A777FE /* XPMineUserInfoAlbumCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B846C126FD82DC00A777FE /* XPMineUserInfoAlbumCollectionViewCell.m */; }; E8B846C526FDB41A00A777FE /* XPMineUserInfolbumPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B846C426FDB41A00A777FE /* XPMineUserInfolbumPresenter.m */; }; E8B846C726FDB45000A777FE /* XPMineUserInfoAlbumProtocol.h in Sources */ = {isa = PBXBuildFile; fileRef = E8B846C626FDB44100A777FE /* XPMineUserInfoAlbumProtocol.h */; }; - E8B846CB26FDD7CD00A777FE /* XPMineRechargeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B846CA26FDD7CD00A777FE /* XPMineRechargeViewController.m */; }; E8B846CF26FDD96100A777FE /* XPMineRechageHeadView.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B846CE26FDD96100A777FE /* XPMineRechageHeadView.m */; }; E8B846D326FDDBE600A777FE /* XPMineRechargeTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B846D226FDDBE600A777FE /* XPMineRechargeTableViewCell.m */; }; E8B846D626FDE01B00A777FE /* XPMineRechargePresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B846D526FDE01B00A777FE /* XPMineRechargePresenter.m */; }; @@ -3852,8 +3849,6 @@ E89D60BE271D648D001F8895 /* XPRoomProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPRoomProtocol.h; sourceTree = ""; }; E89D60BF271D64B9001F8895 /* RoomInfoModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RoomInfoModel.h; sourceTree = ""; }; E89D60C0271D64B9001F8895 /* RoomInfoModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RoomInfoModel.m; sourceTree = ""; }; - E89DA66227005931008483C1 /* XPIAPHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPIAPHelper.h; sourceTree = ""; }; - E89DA66327005932008483C1 /* XPIAPHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPIAPHelper.m; sourceTree = ""; }; E89DA66527006443008483C1 /* RechargeStorage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RechargeStorage.h; sourceTree = ""; }; E89DA66627006443008483C1 /* RechargeStorage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RechargeStorage.m; sourceTree = ""; }; E89DA67027008D59008483C1 /* WalletInfoModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WalletInfoModel.h; sourceTree = ""; }; @@ -4012,8 +4007,6 @@ E8B825C926EA1231009E8E9F /* LoginVerifCodeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LoginVerifCodeViewController.h; sourceTree = ""; }; E8B825CB26EA18C8009E8E9F /* DJDKMIMOMColor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DJDKMIMOMColor.h; sourceTree = ""; }; E8B825CC26EA18C8009E8E9F /* DJDKMIMOMColor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DJDKMIMOMColor.m; sourceTree = ""; }; - E8B846BA26FD7C1200A777FE /* UploadImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UploadImage.h; sourceTree = ""; }; - E8B846BB26FD7C1200A777FE /* UploadImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UploadImage.m; sourceTree = ""; }; E8B846BD26FD827900A777FE /* XPMineUserInfoAlbumViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoAlbumViewController.h; sourceTree = ""; }; E8B846BE26FD827900A777FE /* XPMineUserInfoAlbumViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoAlbumViewController.m; sourceTree = ""; }; E8B846C026FD82DC00A777FE /* XPMineUserInfoAlbumCollectionViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoAlbumCollectionViewCell.h; sourceTree = ""; }; @@ -4021,8 +4014,6 @@ E8B846C326FDB41A00A777FE /* XPMineUserInfolbumPresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfolbumPresenter.h; sourceTree = ""; }; E8B846C426FDB41A00A777FE /* XPMineUserInfolbumPresenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfolbumPresenter.m; sourceTree = ""; }; E8B846C626FDB44100A777FE /* XPMineUserInfoAlbumProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoAlbumProtocol.h; sourceTree = ""; }; - E8B846C926FDD7CD00A777FE /* XPMineRechargeViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineRechargeViewController.h; sourceTree = ""; }; - E8B846CA26FDD7CD00A777FE /* XPMineRechargeViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineRechargeViewController.m; sourceTree = ""; }; E8B846CD26FDD96100A777FE /* XPMineRechageHeadView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineRechageHeadView.h; sourceTree = ""; }; E8B846CE26FDD96100A777FE /* XPMineRechageHeadView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineRechageHeadView.m; sourceTree = ""; }; E8B846D126FDDBE600A777FE /* XPMineRechargeTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineRechargeTableViewCell.h; sourceTree = ""; }; @@ -4836,7 +4827,6 @@ E82D5C77276B25B000858D6D /* SpriteSheetManager */, E865964E2701A1A900846EBD /* StatisticsService */, E89DA6612700590A008483C1 /* IAPHelper */, - E8B846B926FD7BE600A777FE /* UploadImage */, E8EEB8EA26FC2050007C6EBA /* SDPhotoBrowser */, 2331C1BA2A60F67F00E1D940 /* UILabel */, E81366E426F0A4820076364C /* NSString */, @@ -9407,8 +9397,6 @@ E89DA6612700590A008483C1 /* IAPHelper */ = { isa = PBXGroup; children = ( - E89DA66227005931008483C1 /* XPIAPHelper.h */, - E89DA66327005932008483C1 /* XPIAPHelper.m */, E89DA66527006443008483C1 /* RechargeStorage.h */, E89DA66627006443008483C1 /* RechargeStorage.m */, ); @@ -9868,20 +9856,9 @@ path = Model; sourceTree = ""; }; - E8B846B926FD7BE600A777FE /* UploadImage */ = { - isa = PBXGroup; - children = ( - E8B846BA26FD7C1200A777FE /* UploadImage.h */, - E8B846BB26FD7C1200A777FE /* UploadImage.m */, - ); - path = UploadImage; - sourceTree = ""; - }; E8B846C826FDD79700A777FE /* Recharge */ = { isa = PBXGroup; children = ( - E8B846C926FDD7CD00A777FE /* XPMineRechargeViewController.h */, - E8B846CA26FDD7CD00A777FE /* XPMineRechargeViewController.m */, 1464C5F129A4C18000AF7C94 /* XPIAPRechargeViewController.h */, 1464C5F229A4C18000AF7C94 /* XPIAPRechargeViewController.m */, 1464C5F429A4CA8C00AF7C94 /* XPIAPRechargeCollectionViewCell.h */, @@ -10880,7 +10857,6 @@ E85E7B112A4EB0D200B6D00A /* GuildPersonIncomeRecordModel.m in Sources */, 9BD2ECD2288F833B00F5CD9A /* XPMineFootPrintModel.m in Sources */, E824546626F5FF6000BE8163 /* XPMineResetPayPasswordProtocol.h in Sources */, - E89DA66427005932008483C1 /* XPIAPHelper.m in Sources */, 23D321E22ADFD0FB006B259C /* PIRedPacketChooseTypeCell.m in Sources */, E824545E26F5EF2200BE8163 /* XPMineVerifIdentityProtocol.h in Sources */, E824545326F5CEAD00BE8163 /* XPMineModifPayProtocol.h in Sources */, @@ -11048,7 +11024,6 @@ 238B37BD2AC55A2C00BFC9D5 /* XPTreasureFairyTrialsContentView.m in Sources */, E85E7B262A4EB0D300B6D00A /* XPMineGuildViewController.m in Sources */, E85E7B672A4EC35A00B6D00A /* XPBindExtractInfoModel.m in Sources */, - E8B846CB26FDD7CD00A777FE /* XPMineRechargeViewController.m in Sources */, E86596512701A1C000846EBD /* StatisticsService.m in Sources */, 23CEFC5E2AFB8FC100576D89 /* BSRealTimeView.m in Sources */, E824544026F58F9400BE8163 /* XPMinePayPwdViewController.m in Sources */, @@ -11818,7 +11793,6 @@ E81060E229876E9100B772F0 /* MessageImageModel.m in Sources */, E839533F276A0CDB00CF2F24 /* XPMineNameplateTableViewCell.m in Sources */, E80E09AE2A41336500CD2BE7 /* XPWebViewNavView.m in Sources */, - E8B846BC26FD7C1200A777FE /* UploadImage.m in Sources */, E85E7B2D2A4EB0D300B6D00A /* XPGuildHeaderView.m in Sources */, E85E7B542A4EB4AD00B6D00A /* XPMineGuildListModel.m in Sources */, 9BCE6144277D657600CC0358 /* XPReleaseRadioTableViewCell.m in Sources */, diff --git a/YuMi/Appdelegate/AppDelegate+ThirdConfig.m b/YuMi/Appdelegate/AppDelegate+ThirdConfig.m index 85fd7924..bcd4a1f1 100644 --- a/YuMi/Appdelegate/AppDelegate+ThirdConfig.m +++ b/YuMi/Appdelegate/AppDelegate+ThirdConfig.m @@ -7,7 +7,6 @@ #import "AppDelegate+ThirdConfig.h" ///Third -#import #import #import #import @@ -28,7 +27,6 @@ #import #import - #import #import "YuMi-swift.h" @@ -50,6 +48,7 @@ UIKIT_EXTERN NSString * adImageName; [self configAdjust]; [self configBugly]; [self registerNot]; + } -(void)registerNot{ if (@available(iOS 10.0, *)) { @@ -68,9 +67,7 @@ UIKIT_EXTERN NSString * adImageName; } } --(void)initQCloud{ - -} + /** 崩溃收集 Bugly */ diff --git a/YuMi/CustomUI/UIImage/UIImage+Utils.h b/YuMi/CustomUI/UIImage/UIImage+Utils.h index 5cb9f41f..9117d133 100644 --- a/YuMi/CustomUI/UIImage/UIImage+Utils.h +++ b/YuMi/CustomUI/UIImage/UIImage+Utils.h @@ -53,4 +53,5 @@ typedef NS_ENUM(NSUInteger, GradientType) { -(UIImage *)compressWithMaxLength:(NSUInteger)maxLength; - (UIImage *)roundedImageWithCornerRadius:(CGFloat)cornerRadius size:(CGSize)size; +(UIImage *)getImageFromView:(UIView *)view; ++ (NSString *)getImageTypeWithImageData: (NSData *)data; @end diff --git a/YuMi/CustomUI/UIImage/UIImage+Utils.m b/YuMi/CustomUI/UIImage/UIImage+Utils.m index 3ec74086..acbbdd65 100644 --- a/YuMi/CustomUI/UIImage/UIImage+Utils.m +++ b/YuMi/CustomUI/UIImage/UIImage+Utils.m @@ -451,4 +451,52 @@ UIGraphicsEndImageContext(); // 6. 返回生成的图片 return image; } ++ (NSString *)getImageTypeWithImageData:(NSData *)data { + + uint8_t c; + + [data getBytes:&c length:1]; + + switch (c) { + + case 0xFF: + + return @"jpeg"; + + case 0x89: + + return @"png"; + + case 0x47: + + return @"gif"; + + case 0x49: + + case 0x4D: + + return @"tiff"; + + case 0x52: + + if ([data length] < 12) { + + return nil; + + } + + NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; + + if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { + + return @"webp"; + + } + + return nil; + + } + + return nil; +} @end diff --git a/YuMi/Modules/YMMessage/View/Session/Content/MessageContentTextClickable.m b/YuMi/Modules/YMMessage/View/Session/Content/MessageContentTextClickable.m index 6a5de5a7..40fdf74d 100644 --- a/YuMi/Modules/YMMessage/View/Session/Content/MessageContentTextClickable.m +++ b/YuMi/Modules/YMMessage/View/Session/Content/MessageContentTextClickable.m @@ -25,7 +25,7 @@ ///View #import "XPRoomViewController.h" #import "XPWebViewController.h" -#import "XPMineRechargeViewController.h" + #import "XPIAPRechargeViewController.h" #import "XPMineUserInfoViewController.h" #import "XPMineSimpleUserInfoViewController.h" @@ -143,7 +143,6 @@ case SecretaryRouterType_Purse: case SecretaryRouterType_Recharge: { -// XPMineRechargeViewController * rechargeVC = [[XPMineRechargeViewController alloc] init]; XPIAPRechargeViewController * rechargeVC = [[XPIAPRechargeViewController alloc] init]; rechargeVC.type = @"4"; [[XCCurrentVCStackManager shareManager].getCurrentVC.navigationController pushViewController:rechargeVC animated:YES]; diff --git a/YuMi/Modules/YMMine/Api/Api+Mine.h b/YuMi/Modules/YMMine/Api/Api+Mine.h index 9aeba6d6..69e3524f 100644 --- a/YuMi/Modules/YMMine/Api/Api+Mine.h +++ b/YuMi/Modules/YMMine/Api/Api+Mine.h @@ -112,9 +112,7 @@ NS_ASSUME_NONNULL_BEGIN password:(NSString *)password status:(NSNumber *)status uid:(NSString *)uid; -/// 上传七牛获取token -/// @param complection 完成 -+ (void)qiniuUpLoadImage:(HttpRequestHelperCompletion)complection; + /// 上传用户图像到服务器 /// @param complection 完成 diff --git a/YuMi/Modules/YMMine/Api/Api+Mine.m b/YuMi/Modules/YMMine/Api/Api+Mine.m index b11067a2..8832de87 100644 --- a/YuMi/Modules/YMMine/Api/Api+Mine.m +++ b/YuMi/Modules/YMMine/Api/Api+Mine.m @@ -133,12 +133,7 @@ [self makeRequest:fang method:HttpRequestHelperMethodPOST completion:completion, __FUNCTION__, password,status,uid, nil]; } -/// 上传七牛获取token -/// @param completion 完成 -+ (void)qiniuUpLoadImage:(HttpRequestHelperCompletion)completion { - NSString * fang = [NSString stringFromBase64String:@"cWluaXUvdXBsb2FkL2dldFVwbG9hZFRva2Vu"];///qiniu/upload/getUploadToken - [self makeRequest:fang method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__, nil]; -} + ///得到腾讯存储信息 + (void)getQCloudInfo:(HttpRequestHelperCompletion)completion{ [self makeRequest:@"tencent/cos/getToken" method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__, nil]; diff --git a/YuMi/Modules/YMMine/Presenter/XPMineUserInfoEditPresenter.m b/YuMi/Modules/YMMine/Presenter/XPMineUserInfoEditPresenter.m index c9786ec8..c6f0aea0 100644 --- a/YuMi/Modules/YMMine/Presenter/XPMineUserInfoEditPresenter.m +++ b/YuMi/Modules/YMMine/Presenter/XPMineUserInfoEditPresenter.m @@ -10,7 +10,7 @@ #import "Api+Mine.h" ///Tool #import "AccountInfoStorage.h" -#import "UploadImage.h" +#import "UploadFile.h" ///Model #import "XPMineUserInfoEditModel.h" #import "UserInfoModel.h" @@ -122,16 +122,14 @@ /// 上传头像 /// @param avatar 头像 - (void)uploadAvatar:(UIImage *)avatar { - [Api qiniuUpLoadImage:[self createHttpCompletion:^(BaseModel * _Nonnull data) { - NSString *key = data.data[@"key"]; - NSString *token = data.data[@"token"]; - [UploadImage uploadImage:avatar named:key token:token success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { - NSString *url = resp[@"path"]; - [[self getView] uploadImageSuccess:url]; - } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { - [[self getView] showErrorToast:YMLocalizedString(@"XPMineUserInfoEditPresenter0")]; - }]; - }]]; + NSData *data = UIImageJPEGRepresentation(avatar, 0.5); + NSString *format = [UIImage getImageTypeWithImageData:data]; + NSString *name = [NSString stringWithFormat:@"image/%@.%@",[NSString createUUID],format]; + [[UploadFile share]QCloudUploadImage:data named:name success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { + [[self getView] uploadImageSuccess:key]; + } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { + + }]; } ///获取地区列表 diff --git a/YuMi/Modules/YMMine/Presenter/XPMineUserInfoPresenter.m b/YuMi/Modules/YMMine/Presenter/XPMineUserInfoPresenter.m index 43f0a501..a01a9105 100644 --- a/YuMi/Modules/YMMine/Presenter/XPMineUserInfoPresenter.m +++ b/YuMi/Modules/YMMine/Presenter/XPMineUserInfoPresenter.m @@ -69,18 +69,12 @@ /// 上传声音文件 /// @param filePath 文件路径 - (void)uploadVoice:(NSString *)filePath { - [Api qiniuUpLoadImage:[self createHttpCompletion:^(BaseModel * _Nonnull data) { - NSString *key = data.data[@"key"]; - NSString *token = data.data[@"token"]; - [UploadFile uploadFile:filePath named:key token:token success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { - NSString *url = resp[@"path"]; - [[self getView] uploadVoiceFileToThirdSuccess:url]; + NSString *name = [NSString stringWithFormat:@"file/%@",[NSString createUUID]]; + [[UploadFile share]QCloudUploadFile:filePath named:name success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { + [[self getView] uploadVoiceFileToThirdSuccess:key]; } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { [[self getView] uploadVoiceFileFail:message]; }]; - } fail:^(NSInteger code, NSString * _Nullable msg) { - [[self getView] uploadVoiceFileFail:msg]; - }showLoading:NO]]; } -(void)saveSoundWithUrl:(NSString *)audioUrl second:(NSString *)second{ [Api saveSoundCardInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { diff --git a/YuMi/Modules/YMMine/Presenter/XPMineUserInfolbumPresenter.m b/YuMi/Modules/YMMine/Presenter/XPMineUserInfolbumPresenter.m index 6697af7b..1445c176 100644 --- a/YuMi/Modules/YMMine/Presenter/XPMineUserInfolbumPresenter.m +++ b/YuMi/Modules/YMMine/Presenter/XPMineUserInfolbumPresenter.m @@ -12,7 +12,7 @@ #import "UserInfoModel.h" ///Tool #import "AccountInfoStorage.h" -#import "UploadImage.h" +#import "UploadFile.h" ///P #import "XPMineUserInfoAlbumProtocol.h" @@ -40,16 +40,15 @@ /// 相册 /// @param albumImage 相册的image - (void)uploadAlbumImage:(UIImage *)albumImage { - [Api qiniuUpLoadImage:[self createHttpCompletion:^(BaseModel * _Nonnull data) { - NSString *key = data.data[@"key"]; - NSString *token = data.data[@"token"]; - [UploadImage uploadImage:albumImage named:key token:token success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { - NSString *url = resp[@"path"]; - [[self getView] uploadAlbumImageToThirdSuccess:url]; - } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { - [[self getView] showErrorToast:YMLocalizedString(@"XPMineUserInfolbumPresenter0")]; - }]; - } showLoading:YES]]; + + NSData *data = UIImageJPEGRepresentation(albumImage, 0.5); + NSString *format = [UIImage getImageTypeWithImageData:data]; + NSString *name = [NSString stringWithFormat:@"image/%@.%@",[NSString createUUID],format]; + [[UploadFile share]QCloudUploadImage:data named:name success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { + [[self getView] uploadAlbumImageToThirdSuccess:key]; + } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { + + }]; } diff --git a/YuMi/Modules/YMMine/View/DressUp/View/XPDressUpShopViewController.m b/YuMi/Modules/YMMine/View/DressUp/View/XPDressUpShopViewController.m index 3174477f..fb535ea1 100644 --- a/YuMi/Modules/YMMine/View/DressUp/View/XPDressUpShopViewController.m +++ b/YuMi/Modules/YMMine/View/DressUp/View/XPDressUpShopViewController.m @@ -27,7 +27,7 @@ #import "XPWebViewController.h" #import "XPMineDressUpViewController.h" #import "XPDressUpShopCardViewController.h" -#import "XPMineRechargeViewController.h" + #import "XPIAPRechargeViewController.h" @interface XPDressUpShopViewController () @@ -233,7 +233,6 @@ } - (void)rechargeButtonAction:(UIButton *)sender { -// XPMineRechargeViewController *vc = [[XPMineRechargeViewController alloc] init]; XPIAPRechargeViewController * rechargeVC = [[XPIAPRechargeViewController alloc] init]; rechargeVC.type = @"4"; [self.navigationController pushViewController:rechargeVC animated:YES]; diff --git a/YuMi/Modules/YMMine/View/Recharge/XPMineRechargeViewController.h b/YuMi/Modules/YMMine/View/Recharge/XPMineRechargeViewController.h deleted file mode 100644 index cbccd4e5..00000000 --- a/YuMi/Modules/YMMine/View/Recharge/XPMineRechargeViewController.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// YMMineRechargeViewController.h -// YUMI -// -// Created by YUMI on 2021/9/24. -// - -#import "MvpViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface XPMineRechargeViewController : MvpViewController - -@end - -NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/Recharge/XPMineRechargeViewController.m b/YuMi/Modules/YMMine/View/Recharge/XPMineRechargeViewController.m deleted file mode 100644 index a7132e78..00000000 --- a/YuMi/Modules/YMMine/View/Recharge/XPMineRechargeViewController.m +++ /dev/null @@ -1,318 +0,0 @@ -// -// YMMineRechargeViewController.m -// YUMI -// -// Created by YUMI on 2021/9/24. -// - -#import "XPMineRechargeViewController.h" -///Third -#import -#import -///Tool -#import "DJDKMIMOMColor.h" -#import "YUMIMacroUitls.h" -#import "YUMIHtmlUrl.h" -#import "XPIAPHelper.h" -#import "RechargeStorage.h" -#import "AccountInfoStorage.h" -#import "NSObject+MJExtension.h" -#import "NSArray+Safe.h" -///Model -#import "RechargeListModel.h" -///View -#import "XPMineRechageHeadView.h" -#import "XPMineRechargeTableViewCell.h" -#import "XPMineRechargeNavView.h" -///P -#import "XPMineRechargePresenter.h" -#import "XPMineRechargeProtocol.h" -///VC -#import "XPWebViewController.h" - -@interface XPMineRechargeViewController () -///数据源 -@property (nonatomic,strong) NSArray *datasource; -///列表 -@property (nonatomic,strong) UITableView *tableView; -/// -@property (nonatomic,strong) XPMineRechageHeadView *headeView; -///订单编号 -@property (nonatomic,copy) NSString *orderId; -///导航栏 -@property (nonatomic,strong) XPMineRechargeNavView *navView; -/// -@property (nonatomic,strong) UIStackView *stackView; -///同意 -@property (nonatomic,strong) UILabel *agreeLabel; -///充值协议 -@property (nonatomic,strong) UIButton *protcoloButton; -@end - -@implementation XPMineRechargeViewController - -- (void)dealloc { - [XPIAPHelper shareHelper].delegate = nil; -} - -- (BOOL)isHiddenNavBar { - return YES; -} - -- (XPMineRechargePresenter *)createPresenter { - return [[XPMineRechargePresenter alloc] init]; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - [self initHttpData]; - [self initSubViews]; - [self initSubViewConstraints]; -} -#pragma mark - Response -- (void)protcoloButtonAction:(UIButton *)sender { - XPWebViewController * webVC= [[XPWebViewController alloc] init]; - webVC.url = URLWithType(kRechargePrivacyURL); - [self.navigationController pushViewController:webVC animated:YES]; -} -#pragma mark - Private Method -- (void)initSubViews { - [self.view addSubview:self.tableView]; - [self.view addSubview:self.navView]; - [self.view addSubview:self.stackView]; - - [self.stackView addArrangedSubview:self.agreeLabel]; - [self.stackView addArrangedSubview:self.protcoloButton]; - self.tableView.tableHeaderView = self.headeView; - - [XPIAPHelper shareHelper].delegate = self; - self.automaticallyAdjustsScrollViewInsets = NO; -} - -- (void)initSubViewConstraints { - [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { - make.edges.mas_equalTo(self.view); - }]; - - [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerX.mas_equalTo(self.view); - make.bottom.mas_equalTo(self.view).offset(-20 - kSafeAreaBottomHeight); - }]; - - [self.navView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.top.mas_equalTo(self.view); - make.height.mas_equalTo(kNavigationHeight); - }]; -} - -- (void)initHttpData { - [self getRechargeList]; - [self getUserWalletBalanceInfo]; - [self checkTranscationIds]; -} - -- (void)getRechargeList { - [self.presenter requestRechargeListWithChannel:@"8"]; -} - -- (void)getUserWalletBalanceInfo { - [self.presenter getUserWalletInfo]; -} - -///批量验证 -- (void)checkTranscationIds { - NSString * uid = [AccountInfoStorage instance].getUid; - NSArray * array = [RechargeStorage getAllReciptsWithUid:uid]; - if (array.count > 0) { - [self.presenter checkTranscationIds:array]; - } -} - -///充值成功之后保存订单到钥匙串 -- (void)saveRechageReciptWithTransactionIdentifier:(NSString *)transactionIdentifier { - NSData *receipt = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]]; - NSString *encodeStr = [receipt base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; - NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; - if(transactionIdentifier != nil){ - [dictionary setObject:transactionIdentifier forKey:@"transcationId"]; - } - if(encodeStr != nil){ - [dictionary setObject:encodeStr forKey:@"recipt"]; - } - if(self.orderId != nil){ - [dictionary setObject:self.orderId forKey:@"orderId"]; - } - if(dictionary.allKeys.count == 0)return; - NSString *reciptJson = [dictionary toJSONString]; - NSString * uid = [AccountInfoStorage instance].getUid; - BOOL saveSuccess = [RechargeStorage saveTranscationId:transactionIdentifier recipt:reciptJson uid:uid]; - if (!saveSuccess) { -#warning to do 保存失败 需要埋点 - } -} - -///删除本地保存的 -- (void)deleteRechageReciptWithTransactionIdentifier:(NSString *)transactionIdentifier { - NSString * uid = [AccountInfoStorage instance].getUid; - BOOL deleteSuccess = [RechargeStorage delegateTranscationId:transactionIdentifier uid:uid]; - if (deleteSuccess) { -#warning to do 保存失败 需要埋点 - } -} - -#pragma mark - UITableViewDelegate And UITableViewDataSource -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return self.datasource.count; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - XPMineRechargeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineRechargeTableViewCell class]) forIndexPath:indexPath]; - cell.listModel = [self.datasource safeObjectAtIndex1:indexPath.row]; - cell.delegate = self; - return cell; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - return 65; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ - [tableView deselectRowAtIndexPath:indexPath animated:true]; -} - -#pragma mark - XPMineRechargeTableViewCellDelegate -- (void)xPMineRechargeTableViewCell:(XPMineRechargeTableViewCell *)cell didSelectItem:(RechargeListModel *)listModel { - if (listModel.chargeProdId) { - [self showLoading]; - [self.presenter requestIAPRechargeOrderWithChargeProdId:listModel.chargeProdId]; - } -} - -#pragma mark - XPMineRechargeNavViewDelegate -- (void)xPMineRechargeNavView:(XPMineRechargeNavView *)view didClickBackButton:(UIButton *)sender { - [self.navigationController popViewControllerAnimated:YES]; -} - -#pragma mark - XPIAPHelperDelegate -///当前充值的状态 -- (void)rechargeProcessStatus:(PaymentStatus)status { - [self hideHUD]; - if (status == PaymentStatus_Purchased) { - [self showLoading]; - } else if (status == PaymentStatus_Purchasing) { - [self showLoading]; - } else if (status == PaymentStatus_Failed) { - [self showErrorToast:YMLocalizedString(@"XPMineRechargeViewController0")]; - } else if (status == PaymentStatus_Deferred) { - [self showErrorToast:YMLocalizedString(@"XPMineRechargeViewController1")]; - } -} - -///充值成功回调id -- (void)rechargeSuccess:(NSString *)transactionIdentifier { - ///保存唯一凭证 - [self saveRechageReciptWithTransactionIdentifier:transactionIdentifier]; - NSData *receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]]; - NSString * receipt = [MF_Base64Codec base64StringFromData:receiptData]; - ///二次验证 -// [self.presenter checkReceiptWithData:receipt orderId:self.orderId transcationId:transactionIdentifier]; -} - -#pragma mark - XPMineRechargeProtocol -- (void)requestRechargeListSucccess:(NSArray *)list { - self.datasource = list; - [self.tableView reloadData]; -} - -- (void)requestIAPRechargeOrderSuccess:(NSString *)orderId chargeProdId:(NSString *)chargeProdId { - if (orderId.length > 0) { - self.orderId = orderId; - [[XPIAPHelper shareHelper] buyAppProductWithAppProductId:chargeProdId]; - } -} - -- (void)requestIAPRechargeOrderFail { - ///获取订单失败 -} - -///二次验证成功 -- (void)checkReceiptSuccess:(NSString *)transcationId { - [self deleteRechageReciptWithTransactionIdentifier:transcationId]; - ///刷新一下用户的💎 - [self getUserWalletBalanceInfo]; - self.orderId = nil; -} - -- (void)getUserWalletInfo:(WalletInfoModel *)balanceInfo { - self.headeView.walletInfo = balanceInfo; -} - -- (void)checkTranscationIdsSuccess { - NSString * uid = [AccountInfoStorage instance].getUid; - [RechargeStorage delegateAllTranscationIdsWithUid:uid]; -} -#pragma mark - Getters And Setters -- (UITableView *)tableView { - if (!_tableView) { - _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; - _tableView.delegate = self; - _tableView.dataSource = self; - _tableView.tableFooterView = [UIView new]; - _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - _tableView.backgroundColor = [UIColor clearColor]; - if (@available(iOS 11.0, *)) { - _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; - } - [_tableView registerClass:[XPMineRechargeTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMineRechargeTableViewCell class])]; - } - return _tableView; -} - -- (XPMineRechageHeadView *)headeView { - if (!_headeView) { - _headeView = [[XPMineRechageHeadView alloc] init]; - } - return _headeView; -} - - -- (UIStackView *)stackView { - if (!_stackView) { - _stackView = [[UIStackView alloc] init]; - _stackView.axis = UILayoutConstraintAxisHorizontal; - _stackView.distribution = UIStackViewDistributionFill; - _stackView.alignment = UIStackViewAlignmentFill; - _stackView.spacing = 2; - } - return _stackView; -} - -- (UIButton *)protcoloButton { - if (!_protcoloButton) { - _protcoloButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_protcoloButton setTitle:YMLocalizedString(@"XPIAPRechargeViewController3") forState:UIControlStateNormal]; - [_protcoloButton setTitleColor:[DJDKMIMOMColor appMainColor] forState:UIControlStateNormal]; - _protcoloButton.titleLabel.font = [UIFont systemFontOfSize:12]; - [_protcoloButton addTarget:self action:@selector(protcoloButtonAction:) forControlEvents:UIControlEventTouchUpInside]; - } - return _protcoloButton; -} -- (UILabel *)agreeLabel { - if (!_agreeLabel) { - _agreeLabel = [[UILabel alloc] init]; - _agreeLabel.text = YMLocalizedString(@"XPMineRechargeViewController3"); - _agreeLabel.font = [UIFont systemFontOfSize:12]; - _agreeLabel.textColor = [DJDKMIMOMColor textThirdColor]; - } - return _agreeLabel; -} - -- (XPMineRechargeNavView *)navView { - if (!_navView) { - _navView = [[XPMineRechargeNavView alloc] init]; - _navView.delegate = self; - } - return _navView; -} - -@end diff --git a/YuMi/Modules/YMMine/View/XPMineViewController.m b/YuMi/Modules/YMMine/View/XPMineViewController.m index b16434d9..3b1620ab 100644 --- a/YuMi/Modules/YMMine/View/XPMineViewController.m +++ b/YuMi/Modules/YMMine/View/XPMineViewController.m @@ -40,7 +40,7 @@ ///VC #import "XPMineSettingViewController.h" #import "XPMineUserInfoViewController.h" -#import "XPMineRechargeViewController.h" + #import "XPWebViewController.h" #import "XPRoomViewController.h" #import "XPMineDressUpViewController.h" @@ -224,7 +224,6 @@ UIKIT_EXTERN NSString *kRequestRicket; case XPMineItemType_Account: { - // XPMineRechargeViewController * rechargeVC [self pushThirdPartyPayVC]; } break; diff --git a/YuMi/Modules/YMMine/View/XPSimpleMineViewController.m b/YuMi/Modules/YMMine/View/XPSimpleMineViewController.m index 262b55bd..2cb828f0 100644 --- a/YuMi/Modules/YMMine/View/XPSimpleMineViewController.m +++ b/YuMi/Modules/YMMine/View/XPSimpleMineViewController.m @@ -43,7 +43,7 @@ #import "XPMineSettingViewController.h" #import "XPMineUserInfoViewController.h" #import "XPMineSimpleUserInfoViewController.h" -#import "XPMineRechargeViewController.h" + #import "XPIAPRechargeViewController.h" #import "XPWebViewController.h" #import "XPRoomViewController.h" @@ -137,7 +137,6 @@ break; case XPMineItemType_Account: { -// XPMineRechargeViewController * rechargeVC = [[XPMineRechargeViewController alloc] init]; XPIAPRechargeViewController *rechargeVC = [[XPIAPRechargeViewController alloc] init]; rechargeVC.type = @"4"; [self.navigationController pushViewController:rechargeVC animated:YES]; diff --git a/YuMi/Modules/YMMonents/View/XPMonentsPublishViewController.m b/YuMi/Modules/YMMonents/View/XPMonentsPublishViewController.m index 042a80c0..8efa6894 100644 --- a/YuMi/Modules/YMMonents/View/XPMonentsPublishViewController.m +++ b/YuMi/Modules/YMMonents/View/XPMonentsPublishViewController.m @@ -15,7 +15,7 @@ #import "DJDKMIMOMColor.h" #import "UIImage+Utils.h" #import "Api+Mine.h" -#import "UploadImage.h" +#import "UploadFile.h" #import "TTPopup.h" #import "NSArray+Safe.h" #import "ClientConfig.h" @@ -173,55 +173,49 @@ } - (void)uploadAlbumPicList:(NSArray *)array finish:(void(^)(NSArray *list))finish { + + dispatch_semaphore_t semaphore = dispatch_semaphore_create(1); dispatch_queue_t queue = dispatch_get_global_queue(0, 0); NSMutableArray * dataArray = [NSMutableArray array]; dispatch_async(queue, ^{ for (UIImage * image in array) { dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); - [Api qiniuUpLoadImage:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { - if (code == 200) { - NSString *key = data.data[@"key"]; - NSString *token = data.data[@"token"]; - [UploadImage uploadImage:image named:key token:token success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { - dispatch_semaphore_signal(semaphore); - self.imageCount ++; - NSMutableDictionary * dict= [NSMutableDictionary dictionary]; - MonentsPicResInfo * infor = [MonentsPicResInfo modelWithDictionary:resp]; - if (infor.path) { - [dict safeSetObject:infor.path forKey:@"resUrl"]; - } - if (infor.format) { - [dict safeSetObject:infor.format forKey:@"format"]; - } - - if (infor.w) { - [dict safeSetObject:@(infor.w) forKey:@"width"]; - } - - if (infor.h) { - [dict safeSetObject:@(infor.h) forKey:@"height"]; - } - [dataArray addObject:dict]; - if (self.imageCount == array.count) { - dispatch_async(dispatch_get_main_queue(), ^{ - finish(dataArray); - }); - } - - } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { - self.imageCount ++; - dispatch_semaphore_signal(semaphore); - }]; - } else { - self.imageCount ++; - dispatch_semaphore_signal(semaphore); - } - }]; + NSData *data = UIImageJPEGRepresentation(image, 0.5); + NSString *format = [UIImage getImageTypeWithImageData:data]; + NSString *name = [NSString stringWithFormat:@"image/%@.%@",[NSString createUUID],format]; + [[UploadFile share]QCloudUploadImage:data named:name success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { + dispatch_semaphore_signal(semaphore); + self.imageCount ++; + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + if (image.size.width > 0){ + [dict safeSetObject:@(image.size.width) forKey:@"width"]; + } + if (image.size.height){ + [dict safeSetObject:@(image.size.height) forKey:@"height"]; + } + if (key.length > 0) { + [dict safeSetObject:key forKey:@"resUrl"]; + } + [dict safeSetObject:format forKey:@"format"]; + [dataArray addObject:dict]; + if (self.imageCount == array.count) { + dispatch_async(dispatch_get_main_queue(), ^{ + finish(dataArray); + }); + } + + } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { + self.imageCount ++; + dispatch_semaphore_signal(semaphore); + }]; } }); } + + + #pragma mark - UITextViewDelegate - (void)textViewDidChange:(UITextView *)textView { if (textView.text.length > 500) { diff --git a/YuMi/Modules/YMRoom/View/FirstRecharge/View/XPFirstRechargeView.m b/YuMi/Modules/YMRoom/View/FirstRecharge/View/XPFirstRechargeView.m index 6d11a078..cc132cb8 100644 --- a/YuMi/Modules/YMRoom/View/FirstRecharge/View/XPFirstRechargeView.m +++ b/YuMi/Modules/YMRoom/View/FirstRecharge/View/XPFirstRechargeView.m @@ -30,7 +30,7 @@ #import "XPFirstRechargePresenter.h" #import "XPFirstRechargeProtocol.h" ///VC -#import "XPMineRechargeViewController.h" + #import "XPWebViewController.h" #import "XPFirstRechargeView.h" diff --git a/YuMi/Modules/YMRoom/View/RoomPhotoAlbum/View/PIRoomPhotoAlbumItemVC.m b/YuMi/Modules/YMRoom/View/RoomPhotoAlbum/View/PIRoomPhotoAlbumItemVC.m index 6d3514ac..732a2285 100644 --- a/YuMi/Modules/YMRoom/View/RoomPhotoAlbum/View/PIRoomPhotoAlbumItemVC.m +++ b/YuMi/Modules/YMRoom/View/RoomPhotoAlbum/View/PIRoomPhotoAlbumItemVC.m @@ -10,7 +10,7 @@ #import "PIRoomPhotoAlbumChoosePhotoView.h" #import "XPGuildEmptyCollectionViewCell.h" #import "TZImagePickerController.h" -#import "UploadImage.h" +#import "UploadFile.h" #import "Api+Mine.h" #import "MonentsPicResInfo.h" #import "PIRoomPhotoAlbumOperateView.h" @@ -279,36 +279,41 @@ } ///上传图片 - (void)uploadAlbumPicList:(NSArray *)array finish:(void(^)(NSArray *list))finish { + dispatch_semaphore_t semaphore = dispatch_semaphore_create(1); dispatch_queue_t queue = dispatch_get_global_queue(0, 0); NSMutableArray * dataArray = [NSMutableArray array]; dispatch_async(queue, ^{ for (UIImage * image in array) { dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); - [Api qiniuUpLoadImage:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { - if (code == 200) { - NSString *key = data.data[@"key"]; - NSString *token = data.data[@"token"]; - [UploadImage uploadImage:image named:key token:token success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { - dispatch_semaphore_signal(semaphore); - self.imageCount ++; - if(resp[@"path"] != nil){ - [dataArray addObject:resp[@"path"]]; - } - if (self.imageCount == array.count) { - dispatch_async(dispatch_get_main_queue(), ^{ - finish(dataArray); - }); - } + NSData *data = UIImageJPEGRepresentation(image, 0.5); + NSString *format = [UIImage getImageTypeWithImageData:data]; + NSString *name = [NSString stringWithFormat:@"image/%@.%@",[NSString createUUID],format]; + [[UploadFile share]QCloudUploadImage:data named:name success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { + dispatch_semaphore_signal(semaphore); + self.imageCount ++; + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + if (image.size.width > 0){ + [dict safeSetObject:@(image.size.width) forKey:@"width"]; + } + if (image.size.height){ + [dict safeSetObject:@(image.size.height) forKey:@"height"]; + } + if (key.length > 0) { + [dict safeSetObject:key forKey:@"resUrl"]; + } + [dict safeSetObject:format forKey:@"format"]; + [dataArray addObject:dict]; + if (self.imageCount == array.count) { + dispatch_async(dispatch_get_main_queue(), ^{ + finish(dataArray); + }); + } + } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { self.imageCount ++; dispatch_semaphore_signal(semaphore); }]; - } else { - self.imageCount ++; - dispatch_semaphore_signal(semaphore); - } - }]; } }); } diff --git a/YuMi/Modules/YMRoom/View/SendGiftView/View/XPSendGiftView.m b/YuMi/Modules/YMRoom/View/SendGiftView/View/XPSendGiftView.m index 2a04a76d..767acf2d 100644 --- a/YuMi/Modules/YMRoom/View/SendGiftView/View/XPSendGiftView.m +++ b/YuMi/Modules/YMRoom/View/SendGiftView/View/XPSendGiftView.m @@ -43,7 +43,7 @@ ///P #import "XPGiftProtocol.h" ///VC -#import "XPMineRechargeViewController.h" + #import "XPIAPRechargeViewController.h" #import "XPWebViewController.h" #import "PIGiftSuperGiftBroadcastView.h" @@ -453,7 +453,6 @@ UIKIT_EXTERN NSString * kShowFirstRechargeView; ///充值 - (void)xPGiftBarViewDidClickRecharge:(XPGiftBarView *)view { [self dismissViewControllerAnimated:NO completion:^{ -// XPMineRechargeViewController * rechargeVC = [[XPMineRechargeViewController alloc] init]; XPIAPRechargeViewController * rechargeVC = [[XPIAPRechargeViewController alloc] init]; rechargeVC.type = @"4"; [[XCCurrentVCStackManager shareManager].getCurrentVC.navigationController pushViewController:rechargeVC animated:YES]; diff --git a/YuMi/Modules/YMRoom/View/SendRedPacket/XPRoomSendRedPacketViewController.m b/YuMi/Modules/YMRoom/View/SendRedPacket/XPRoomSendRedPacketViewController.m index 74d242b4..5fd5f121 100644 --- a/YuMi/Modules/YMRoom/View/SendRedPacket/XPRoomSendRedPacketViewController.m +++ b/YuMi/Modules/YMRoom/View/SendRedPacket/XPRoomSendRedPacketViewController.m @@ -20,7 +20,7 @@ #import "XPRoomRedPacketPwdView.h" #import "XPMinePayPwdViewController.h" #import "BaseNavigationController.h" -#import "XPMineRechargeViewController.h" + #import "XPIAPRechargeViewController.h" #import "XPRoomHalfWebView.h" ///P @@ -403,7 +403,6 @@ } - (void)onRechargeButtonClick:(UIButton *)sender { -// XPMineRechargeViewController *rechargeVC = [[XPMineRechargeViewController alloc] init]; XPIAPRechargeViewController * rechargeVC = [[XPIAPRechargeViewController alloc] init]; rechargeVC.type = @"4"; [self.navigationController pushViewController:rechargeVC animated:YES]; diff --git a/YuMi/Modules/YMTabbar/View/TabbarViewController.m b/YuMi/Modules/YMTabbar/View/TabbarViewController.m index 6a8e5d85..cb06eba5 100644 --- a/YuMi/Modules/YMTabbar/View/TabbarViewController.m +++ b/YuMi/Modules/YMTabbar/View/TabbarViewController.m @@ -83,7 +83,7 @@ #import "PIFullScreenBannerAnimation.h" #import #import "Api+Gift.h" - +#import "UploadFile.h" @@ -214,6 +214,7 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; - (void)autoLoginSuccess { [self.presenter loginNIM]; [self.presenter getUserInfo]; + [[UploadFile share]initQCloud]; ///登录成功之后 在验证是否有漏单的行为 [self.presenter checkTranscation]; ///检查更新 diff --git a/YuMi/Modules/YMWeb/XPWebViewController.m b/YuMi/Modules/YMWeb/XPWebViewController.m index 441b2fe0..b860a5ad 100644 --- a/YuMi/Modules/YMWeb/XPWebViewController.m +++ b/YuMi/Modules/YMWeb/XPWebViewController.m @@ -17,7 +17,7 @@ #import #import "XCCurrentVCStackManager.h" #import "XPMineUserInfoViewController.h" -#import "XPMineRechargeViewController.h" + ///vc #import "XPMineDressUpViewController.h" #import "XPDressUpShopViewController.h" diff --git a/YuMi/Tools/File/UploadFile.h b/YuMi/Tools/File/UploadFile.h index 63a9b59b..083d83d1 100644 --- a/YuMi/Tools/File/UploadFile.h +++ b/YuMi/Tools/File/UploadFile.h @@ -11,18 +11,30 @@ NS_ASSUME_NONNULL_BEGIN @interface UploadFile : NSObject + (instancetype)share; +-(void)initQCloud; + ++ (void)downloadAudioWithFileName:(NSString *)fileName musicUrl:(NSString *)musicUrl mainFileName:(NSString *)mainFileName completion:(void (^) (BOOL isSuccess, NSString *editAudioPath))completion; /// 上传一个文件 /// @param filePath 文件地址 /// @param fileName 文件的名字 -/// @param token token + /// @param success 成功 /// @param failure 失败 -+ (void)uploadFile:(NSString *)filePath +- (void)QCloudUploadFile:(NSString *)filePath named:(NSString *)fileName - token:(NSString *)token + success:(void (^)(NSString *key, NSDictionary *resp))success - failure:(void (^)(NSNumber *resCode, NSString *message))failure; -+ (void)downloadAudioWithFileName:(NSString *)fileName musicUrl:(NSString *)musicUrl mainFileName:(NSString *)mainFileName completion:(void (^) (BOOL isSuccess, NSString *editAudioPath))completion; + failure:(void (^)(NSNumber *resCode, NSString *message))failure; +/// 上传一个Image +/// @param image 图片 +/// @param imageName 图片的名字 + +/// @param success 成功 +/// @param failure 失败 +- (void)QCloudUploadImage:(NSData *)data + named:(NSString *)name + success:(void (^)(NSString *key, NSDictionary *resp))success + failure:(void (^)(NSNumber *resCode, NSString *message))failure; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Tools/File/UploadFile.m b/YuMi/Tools/File/UploadFile.m index 70f23ff6..e53d9b0d 100644 --- a/YuMi/Tools/File/UploadFile.m +++ b/YuMi/Tools/File/UploadFile.m @@ -6,13 +6,14 @@ // #import #import "UploadFile.h" -#import #import #import "Api+Mine.h" #import "UploadFileModel.h" static UploadFile* manager; -@interface UploadFile() +@interface UploadFile() +// 一个脚手架实例 +@property (nonatomic) QCloudCredentailFenceQueue* credentialFenceQueue; @property(nonatomic,strong) UploadFileModel *fileModel; @end @@ -32,13 +33,11 @@ static UploadFile* manager; UploadFileModel *fileModel = [UploadFileModel modelWithDictionary:data.data]; self.fileModel = fileModel; QCloudServiceConfiguration* configuration = [QCloudServiceConfiguration new]; + configuration.appID = fileModel.appId; QCloudCOSXMLEndPoint* endpoint = [[QCloudCOSXMLEndPoint alloc] init]; - - - endpoint.regionName = fileModel.region; // 使用 HTTPS - endpoint.useHTTPS = true; + endpoint.useHTTPS = YES; configuration.endpoint = endpoint; // 密钥提供者为自己 configuration.signatureProvider = self; @@ -46,6 +45,9 @@ static UploadFile* manager; [QCloudCOSXMLService registerDefaultCOSXMLWithConfiguration:configuration]; [QCloudCOSTransferMangerService registerDefaultCOSTransferMangerWithConfiguration: configuration]; + + self.credentialFenceQueue = [QCloudCredentailFenceQueue new]; + self.credentialFenceQueue.delegate = self; } }]; @@ -57,60 +59,164 @@ static UploadFile* manager; compelete:(QCloudHTTPAuthentationContinueBlock)continueBlock { + [Api getQCloudInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + if (code == 200){ + UploadFileModel *fileModel = [UploadFileModel modelWithDictionary:data.data]; QCloudCredential* credential = [QCloudCredential new]; - - + + // 临时密钥 SecretId - // sercret_id替换为用户的 SecretId,登录访问管理控制台查看密钥,https://console.cloud.tencent.com/cam/capi - credential.secretID = self.fileModel.secretId; + + credential.secretID = fileModel.secretId; // 临时密钥 SecretKey - // sercret_key替换为用户的 SecretKey,登录访问管理控制台查看密钥,https://console.cloud.tencent.com/cam/capi - credential.secretKey = self.fileModel.secretKey; + + credential.secretKey = fileModel.secretKey; // 临时密钥 Token - // 如果使用永久密钥不需要填入token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048 - credential.token = self.fileModel.sessionToken; + + credential.token = fileModel.sessionToken; /** 强烈建议返回服务器时间作为签名的开始时间, 用来避免由于用户手机本地时间偏差过大导致的签名不正确(参数startTime和expiredTime单位为秒) - */ - credential.startDate = [NSDate dateWithTimeIntervalSince1970:self.fileModel.startTime]; // 单位是秒 - credential.expirationDate = [NSDate dateWithTimeIntervalSince1970:self.fileModel.startTime];// 单位是秒 - - + */ + credential.startDate = [NSDate dateWithTimeIntervalSince1970:fileModel.startTime]; // 单位是秒 + credential.expirationDate = [NSDate dateWithTimeIntervalSince1970:fileModel.expireTime];// 单位是秒 + + QCloudAuthentationV5Creator* creator = [[QCloudAuthentationV5Creator alloc] - initWithCredential:credential]; + initWithCredential:credential]; // 注意 这里不要对urlRequst 进行copy以及mutableCopy操作 QCloudSignature *signature = [creator signatureForData:urlRequst]; continueBlock(signature, nil); - - + + } + } + ]; } +#pragma mark - QCloudCredentailFenceQueueDelegate +- (void) fenceQueue:(QCloudCredentailFenceQueue * )queue requestCreatorWithContinue:(QCloudCredentailFenceQueueContinue)continueBlock +{ + //这里同步从◊后台服务器获取临时密钥,强烈建议将获取临时密钥的逻辑放在这里,最大程度上保证密钥的可用性 + //... - -//zoneAs0 + [Api getQCloudInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + if (code == 200){ + UploadFileModel *fileModel = [UploadFileModel modelWithDictionary:data.data]; + QCloudCredential* credential = [QCloudCredential new]; + // 临时密钥 SecretId + credential.secretID = fileModel.secretId; + // 临时密钥 SecretKey + + credential.secretKey = fileModel.secretKey; + // 临时密钥 Token + + credential.token = fileModel.sessionToken; + /** 强烈建议返回服务器时间作为签名的开始时间, 用来避免由于用户手机本地时间偏差过大导致的签名不正确(参数startTime和expiredTime单位为秒) + */ + credential.startDate = [NSDate dateWithTimeIntervalSince1970:fileModel.startTime]; // 单位是秒 + credential.expirationDate = [NSDate dateWithTimeIntervalSince1970:fileModel.expireTime];// 单位是秒 + QCloudAuthentationV5Creator* creator = [[QCloudAuthentationV5Creator alloc] + initWithCredential:credential]; + continueBlock(creator, nil); + } + }]; +} /// 上传一个文件 /// @param filePath 文件地址 /// @param fileName 文件的名字 -/// @param token token /// @param success 成功 /// @param failure 失败 -+ (void)uploadFile:(NSString *)filePath +- (void)QCloudUploadFile:(NSString *)filePath named:(NSString *)fileName - token:(NSString *)token success:(void (^)(NSString *key, NSDictionary *resp))success - failure:(void (^)(NSNumber *resCode, NSString *message))failure { - QNConfiguration *config = [QNConfiguration build:^(QNConfigurationBuilder *builder) { - builder.zone = [QNFixedZone zoneAs0]; + failure:(void (^)(NSNumber *resCode, NSString *message))failure { + + + QCloudCOSXMLUploadObjectRequest* put = [QCloudCOSXMLUploadObjectRequest new]; + // 本地文件路径 + NSURL* url = [NSURL fileURLWithPath:filePath]; + // 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket + put.bucket = self.fileModel.bucket; + // 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4" + put.object = fileName; + //需要上传的对象内容。可以传入NSData*或者NSURL*类型的变量 + put.body = url; + //监听上传进度 + [put setSendProcessBlock:^(int64_t bytesSent, + int64_t totalBytesSent, + int64_t totalBytesExpectedToSend) { + // bytesSent 本次要发送的字节数(一个大文件可能要分多次发送) + // totalBytesSent 已发送的字节数 + // totalBytesExpectedToSend 本次上传要发送的总字节数(即一个文件大小) }]; - QNUploadManager *upManager = [[QNUploadManager alloc] initWithConfiguration:config]; - [upManager putFile:filePath key:fileName token:token complete:^(QNResponseInfo *info, NSString *key, NSDictionary *resp) { - if (resp) { - success(key,resp); - }else{ - failure(@(info.statusCode),info.error.localizedDescription); + + //监听上传结果 + [put setFinishBlock:^(id outputObject, NSError *error) { + //可以从 outputObject 中获取 response 中 etag 或者自定义头部等信息 + if (error) { + failure(@(error.code),error.localizedDescription); + return; } - } option:nil]; + QCloudUploadObjectResult * result = (QCloudUploadObjectResult *)outputObject; + NSArray *urlList = [result.location componentsSeparatedByString:@".com/"]; + if (urlList.count == 2){ + NSString *url = [NSString stringWithFormat:@"%@/%@",self.fileModel.customDomain,urlList[1]]; + success(url,nil); + return; + } + success(result.location,nil); + }]; + + [[QCloudCOSTransferMangerService defaultCOSTransferManager] UploadObject:put]; + } + +/// 上传一个Image +/// @param image 图片 +/// @param imageName 图片的名字 + +/// @param success 成功 +/// @param failure 失败 +- (void)QCloudUploadImage:(NSData *)data + named:(NSString *)name + success:(void (^)(NSString *key, NSDictionary *resp))success + failure:(void (^)(NSNumber *resCode, NSString *message))failure{ + + QCloudCOSXMLUploadObjectRequest* put = [QCloudCOSXMLUploadObjectRequest new]; + put.bucket = self.fileModel.bucket; + // 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4" + put.object = name; + //需要上传的对象内容。可以传入NSData*或者NSURL*类型的变量 + put.body = data; + //监听上传进度 + [put setSendProcessBlock:^(int64_t bytesSent, + int64_t totalBytesSent, + int64_t totalBytesExpectedToSend) { + // bytesSent 本次要发送的字节数(一个大文件可能要分多次发送) + // totalBytesSent 已发送的字节数 + // totalBytesExpectedToSend 本次上传要发送的总字节数(即一个文件大小) + }]; + + //监听上传结果 + [put setFinishBlock:^(id outputObject, NSError *error) { + + if (error) { + failure(@(error.code),error.localizedDescription); + return; + } + QCloudUploadObjectResult * result = (QCloudUploadObjectResult *)outputObject; + NSArray *urlList = [result.location componentsSeparatedByString:@".com/"]; + if (urlList.count == 2){ + NSString *url = [NSString stringWithFormat:@"%@/%@",self.fileModel.customDomain,urlList[1]]; + success(url,nil); + return; + } + success(result.location,nil); + }]; + + [[QCloudCOSTransferMangerService defaultCOSTransferManager] UploadObject:put]; +} + + +(void)downloadAudioWithFileName:(NSString *)fileName musicUrl:(NSString *)musicUrl mainFileName:(NSString *)mainFileName completion:(void (^) (BOOL isSuccess, NSString *editAudioPath))completion { AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:musicUrl]]; diff --git a/YuMi/Tools/File/UploadFileModel.h b/YuMi/Tools/File/UploadFileModel.h index eba0047d..6b0299a9 100644 --- a/YuMi/Tools/File/UploadFileModel.h +++ b/YuMi/Tools/File/UploadFileModel.h @@ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic,copy) NSString *customDomain; @property(nonatomic,assign) long startTime; @property(nonatomic,assign) long expireTime; +@property(nonatomic,copy) NSString *appId; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Tools/IAPHelper/XPIAPHelper.h b/YuMi/Tools/IAPHelper/XPIAPHelper.h deleted file mode 100644 index a9ab74d3..00000000 --- a/YuMi/Tools/IAPHelper/XPIAPHelper.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// YMIAPHelper.h -// YUMI -// -// Created by YUMI on 2021/9/26. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -typedef NS_ENUM(NSInteger ,PaymentStatus) { - PaymentStatus_Purchasing = 1,//付款中 - PaymentStatus_Purchased, //付款操作已经完成 - PaymentStatus_Failed, //付款操作失败 - PaymentStatus_Deferred, //未知状态 -}; - -@protocol XPIAPHelperDelegate - -///当前充值的状态 -- (void)rechargeProcessStatus:(PaymentStatus)status; - -///充值成功回调id -- (void)rechargeSuccess:(NSString *)transactionIdentifier; -@end - -@interface XPIAPHelper : NSObject -+ (instancetype)shareHelper; -///代理 -@property (nonatomic,weak) id delegate; -///购买商品 -- (void)buyAppProductWithAppProductId:(NSString *)appProductId; -@end - -NS_ASSUME_NONNULL_END diff --git a/YuMi/Tools/IAPHelper/XPIAPHelper.m b/YuMi/Tools/IAPHelper/XPIAPHelper.m deleted file mode 100644 index 3041209c..00000000 --- a/YuMi/Tools/IAPHelper/XPIAPHelper.m +++ /dev/null @@ -1,97 +0,0 @@ -// -// YMIAPHelper.m -// YUMI -// -// Created by YUMI on 2021/9/26. -// - -#import "XPIAPHelper.h" -#import -#import - -@implementation XPIAPHelper - -+ (instancetype)shareHelper { - static dispatch_once_t onceToken; - static XPIAPHelper * helper; - dispatch_once(&onceToken, ^{ - helper = [[XPIAPHelper alloc] init]; - }); - return helper; -} - - -- (void)buyAppProductWithAppProductId:(NSString *)appProductId { - NSSet* dataSet = [[NSSet alloc] initWithObjects:appProductId, nil]; - [IAPShare sharedHelper].iap = [[IAPHelper alloc] initWithProductIdentifiers:dataSet]; - [[IAPShare sharedHelper].iap requestProductsWithCompletion:^(SKProductsRequest *request, SKProductsResponse *response) { - if (response != nil && response.products.count) { - ///有这个内购的产品 - } else if (!response.products.count) { - ///请求内购产品失败,无产品数量 -#warning to do 此处埋点一个 没有内购产品 - if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { - [self.delegate rechargeProcessStatus:PaymentStatus_Failed]; - } - return; - } else if (!response) { -#warning to do 此处埋点一个 请求内购没有响应 - ///请求内购产品失败,内购无响应 - if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { - [self.delegate rechargeProcessStatus:PaymentStatus_Failed]; - } - return; - } else { -#warning to do 此处埋点一个 异常 发起付款失败 - ///异常 发起付款失败 - if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { - [self.delegate rechargeProcessStatus:PaymentStatus_Failed]; - } - return; - } - if (response.products.firstObject) { - [[IAPShare sharedHelper].iap buyProduct:response.products.firstObject onCompletion:^(SKPaymentTransaction *transcation) { - NSLog(@"%@",transcation.error.description); - switch(transcation.transactionState) { - case SKPaymentTransactionStatePurchased: { - NSLog(@"付款完成状态, 要做出相关的处理"); - [[SKPaymentQueue defaultQueue] finishTransaction:transcation]; - if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { - [self.delegate rechargeProcessStatus:PaymentStatus_Purchased]; - } - - if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeSuccess:)]) { - [self.delegate rechargeSuccess:transcation.transactionIdentifier]; - } - //同步返回购买成功后,需要请求服务器二次校验 - } - break; - case SKPaymentTransactionStateFailed: { - [[SKPaymentQueue defaultQueue] finishTransaction:transcation]; - if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { - [self.delegate rechargeProcessStatus:PaymentStatus_Failed]; - } - } - break; - case SKPaymentTransactionStatePurchasing: { - NSLog(@"正在购买中"); - if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { - [self.delegate rechargeProcessStatus:PaymentStatus_Purchasing]; - } - } - break; - default: { - [[SKPaymentQueue defaultQueue] finishTransaction:transcation]; - if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) { - [self.delegate rechargeProcessStatus:PaymentStatus_Deferred]; - } - NSLog(@"其它"); - } - } - }]; - } - }]; -} - - -@end diff --git a/YuMi/Tools/NSString/NSString+Utils.h b/YuMi/Tools/NSString/NSString+Utils.h index 8f2eb294..63c71a0a 100644 --- a/YuMi/Tools/NSString/NSString+Utils.h +++ b/YuMi/Tools/NSString/NSString+Utils.h @@ -37,7 +37,8 @@ NS_ASSUME_NONNULL_BEGIN +(NSString *)getAgeWithBirth:(long)birth; ///得到区号 +(NSString *)getCountryCode; - +///产生唯一的key,用于图片或文件上传 ++ (NSString *)createUUID; @end diff --git a/YuMi/Tools/NSString/NSString+Utils.m b/YuMi/Tools/NSString/NSString+Utils.m index 291a7961..2edc02e8 100644 --- a/YuMi/Tools/NSString/NSString+Utils.m +++ b/YuMi/Tools/NSString/NSString+Utils.m @@ -255,4 +255,15 @@ if(countryCode.length == 0)return @"+886"; return [NSString stringWithFormat:@"+%@",countryCode]; } ++(NSString *)createUUID{ + + CFUUIDRef uuid; + CFStringRef uuidText; + uuid = CFUUIDCreate(NULL); + uuidText = CFUUIDCreateString(NULL, uuid); + NSString *time = [NSDate getNowTimeTimestamp]; + NSString *result = [NSString stringWithFormat:@"%@%@",uuidText,time]; + return [result MD5String]; + +} @end