// // UseAccountManage.m // VclustersGemini // // Created by APPLE on 2019/6/13. // Copyright © 2019 APPLE. All rights reserved. // #import "UseAccountManage.h" #import "AFNetworkReachabilityManager.h" #import "VclCrash.h" #import "AppDelegate.h" #import "iPhone.h" #import "Notification.h" #import "CloudPhoneAPI.h" #define CloudServiceForDevice @"http://47.98.158.194:8014" #define PayCloudService @"http://193.112.153.4" @interface UseAccountManage () { ; } @property (nonatomic) SSLAuthenticate authenticated; @property (nonatomic,strong) NSURLConnection *urlConnection; @end @implementation UseAccountManage @synthesize manager; @synthesize mCloudService; @synthesize mRequstAPI; static UseAccountManage *shareInstance = nil; + (UseAccountManage *)shareInstance { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ shareInstance = [[UseAccountManage alloc]init]; }); return shareInstance; } - (id)init { self = [super init]; if (self) { [self initManager]; } return self; } - (void)initManager { mCloudService = CloudService; if ([mCloudService rangeOfString:@"https"].location != NSNotFound) { manager = [[AFHTTPSessionManager manager] initWithBaseURL:[NSURL URLWithString:mCloudService]]; } else { manager = [AFHTTPSessionManager manager]; } manager.requestSerializer = [AFJSONRequestSerializer serializer]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; [manager.requestSerializer setHTTPShouldHandleCookies:NO]; [manager.requestSerializer setHTTPShouldUsePipelining:NO]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/plain",@"application/xml",@"image/png", @"audio/aac", @"text/x-vcard",nil]; manager.requestSerializer.HTTPMethodsEncodingParametersInURI = [NSSet setWithObjects:@"GET", @"HEAD", nil]; // manager.accessibilityLanguage = @"zh-CN,zh"; manager.requestSerializer.timeoutInterval = 20; // 请求头里添加版本号 NSString *version = [NSString stringWithFormat:@"v%@", [iPhone appVersion]]; NSString *uuid = [iPhone phoneDeviceUuid]; [manager.requestSerializer setValue:version forHTTPHeaderField:@"versionName"]; [manager.requestSerializer setValue:uuid forHTTPHeaderField:@"devicesId"]; [manager.requestSerializer setValue:@"2" forHTTPHeaderField:@"client"]; [manager.requestSerializer setValue:@"zh-CN,zh" forHTTPHeaderField:@"Accept-Language"]; [manager.requestSerializer setValue:@"iosSigned" forHTTPHeaderField:@"channelCode"]; if ([mCloudService rangeOfString:@"https"].location != NSNotFound) { [manager setSecurityPolicy:[self customSecurityPolicy]]; } } #pragma mark 网络请求 异常情况处理 // 账号冻结、系统维护、账号注销、异地登陆 - (BOOL)isDidHandelCustomStatusFun:(id)responseObject task:(NSURLSessionDataTask *)task { if(responseObject && [responseObject isKindOfClass:[NSDictionary class]] && [[responseObject allKeys] containsObject:@"status"]) { NSNumber * status = responseObject[@"status"]; if (status && status.intValue == 3003 ) {// 1、账号冻结 [[NSNotificationCenter defaultCenter] postNotificationName:NotNameAccountFreeze object:nil userInfo:responseObject]; return YES; }else if (status && status.intValue == 5100 ) {// 2、系统维护中 [[NSNotificationCenter defaultCenter] postNotificationName:NotNameSystemMaintain object:nil userInfo:responseObject]; return YES; }else if (status && status.intValue == 3004 ) {// 3、账号已注销 [[NSNotificationCenter defaultCenter] postNotificationName:NotNameAccountDestroy object:nil userInfo:responseObject]; return YES; }else if (status && status.intValue == 6013 ) {// 4、异地登陆 [[NSNotificationCenter defaultCenter] postNotificationName:AccountLoginWithOtherDeviceNotification object:nil userInfo:responseObject]; return YES; }else if (status && status.intValue == 6014 ) {// 5、token失效 [[NSNotificationCenter defaultCenter] postNotificationName:TokenIsInvalidNotification object:nil userInfo:responseObject]; return YES; } } // http请求错误码statusCode NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response; NSInteger statusCode = response.statusCode; // 正常:200 NSString *urlString = task.currentRequest.URL.absoluteString; HLog(@"statusCode:%ld status:%@ url:%@", statusCode,responseObject[@"status"],urlString); if (statusCode == 6013) { // 4、异地登陆 [[NSNotificationCenter defaultCenter] postNotificationName:AccountLoginWithOtherDeviceNotification object:nil userInfo:responseObject]; return YES; }else if (statusCode == 6014) { [[NSNotificationCenter defaultCenter] postNotificationName:TokenIsInvalidNotification object:nil userInfo:responseObject]; return YES; } return NO; } // 系统繁忙 - (NSMutableDictionary *)systemBusyDict { if (!_systemBusyDict) { _systemBusyDict = [NSMutableDictionary dictionary]; [_systemBusyDict setObject:@"系统繁忙,请稍后再试!" forKey:@"msg"]; [_systemBusyDict setObject:@(-1) forKey:@"status"]; [_systemBusyDict setObject:@"" forKey:@"data"]; } return _systemBusyDict; } // 网络异常 - (NSMutableDictionary *)networkErrorDict { if (!_networkErrorDict) { _networkErrorDict = [NSMutableDictionary dictionary]; [_networkErrorDict setObject:@"网络异常,请稍后重试!" forKey:@"msg"]; [_networkErrorDict setObject:@(-999) forKey:@"status"]; [_networkErrorDict setObject:[NSDictionary new] forKey:@"data"]; } return _networkErrorDict; } - (id)check401And403WithObject:(id)responseObject { if (CODE == 401 || CODE == 403) { return self.systemBusyDict; }else { return responseObject; } } // 弹出设备已在别处登录 -(void)showLoginOutTip:(NSString*)msgStr { // NSString *msg = msgStr.length != 0 ? msgStr : @"设备已在别处登录"; // // UINavigationController *curNav = ksharedAppDelegate.MainTabbar.navigationController; // // UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:msg preferredStyle:UIAlertControllerStyleAlert]; // UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { // // [curNav popToRootViewControllerAnimated:YES]; // }]; // [alertController addAction:cancelAction]; // // [curNav presentViewController:alertController animated:YES completion:nil]; } #pragma mark 获取链接 - (void)requestWithPostparameters:(NSDictionary*)parameters complteteBlock:(CloudServiceCompletionBlock)complteteBlock { if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) { complteteBlock(nil, self.networkErrorDict); return; } NSString *url = [mCloudService stringByAppendingString:mRequstAPI]; HLog(@"\n------Post请求连接->%@",url); HLog(@"\n------Post请求体->%@",parameters); // // RSA签名 // if ([url containsString:GetOrderNumberAPI] || // [url containsString:STARCOINPAYAPI] || // [url containsString:GETAIRPAYCONNECTIONAPI] || // [url containsString:GETWXPAYCONNECTIONAPI]) { // // NSString *jsonStr = [RSATool sortArrWithDictionary:parameters]; // NSString *signStr = [RSATool RSASignEncrypt:jsonStr key:Const_Pay_PrivateKey]; // signStr = [RSATool deleteNewlineCharactersWithString:signStr]; // if (signStr.length == 0) { // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // [self requestWithPostparameters:parameters complteteBlock:complteteBlock]; // }); // return; // } // [manager.requestSerializer setValue:signStr forHTTPHeaderField:@"sign"]; // }else { // 清空签名 [manager.requestSerializer setValue:@"" forHTTPHeaderField:@"sign"]; // } [manager POST:url parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { ; } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } complteteBlock(nil,[self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) { if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } complteteBlock(error,[self check401And403WithObject:responseObject]); }]; } - (void)requestWithDeleteparameters:(NSDictionary*)parameters complteteBlock:(CloudServiceCompletionBlock)complteteBlock { if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) { complteteBlock(nil, self.networkErrorDict); return; } NSString *url = [mCloudService stringByAppendingString:mRequstAPI]; HLog(@"\n------Delete请求连接->%@",url); HLog(@"\n------Delete请求体->%@",parameters); [manager DELETE:url parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } complteteBlock(nil,[self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error,id _Nonnull responseObject) { if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } complteteBlock(error,[self check401And403WithObject:responseObject]); }]; } - (void)requestWithPutparameters:(NSDictionary*)parameters complteteBlock:(CloudServiceCompletionBlock)complteteBlock { if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) { complteteBlock(nil, self.networkErrorDict); return; } NSString *url = [mCloudService stringByAppendingString:mRequstAPI]; HLog(@"\n------Put请求连接->%@",url); HLog(@"\n------Put请求体->%@",parameters); [manager PUT:url parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } complteteBlock(nil,[self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error,id _Nonnull responseObject) { if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } complteteBlock(error,[self check401And403WithObject:responseObject]); }]; } - (void)requestWithGetparameters:(NSDictionary*)parameters complteteBlock:(CloudServiceCompletionBlock)complteteBlock { if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) { complteteBlock(nil,self.networkErrorDict); return; } NSString *url = [mCloudService stringByAppendingString:mRequstAPI]; HLog(@"\n------Get请求连接->%@",url); // HLog(@"\n------Get请求体->%@",parameters); [manager GET:url parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) { ; } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } complteteBlock(nil,[self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error,id _Nonnull responseObject) { if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } complteteBlock(error,[self check401And403WithObject:responseObject]); }]; } - (void)requestWithPatchparameters:(NSDictionary*)parameters complteteBlock:(CloudServiceCompletionBlock)complteteBlock { if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) { complteteBlock(nil, self.networkErrorDict); return; } NSString *url = [mCloudService stringByAppendingString:mRequstAPI]; // HLog(@"\n------Get请求连接->%@",url); // HLog(@"\n------Get请求体->%@",parameters); [manager PATCH:url parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } complteteBlock(nil,[self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) { if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } complteteBlock(error,[self check401And403WithObject:responseObject]); }]; } #pragma mark hxd 重新封装 afnetwork get 请求 - (void)commonGetCanWithOutTokenCallBackUrl:(NSString *)url Parameters:(NSDictionary *_Nullable)dic success:(Success)success failure:(Faild)faildStr { //// if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) {// 无网络状态 success(self.networkErrorDict); return; } url = [NSString stringWithFormat:@"%@%@",CloudService,url]; // if ([url rangeOfString:AppVersionCheckAPI].location != NSNotFound) { // url = [url stringByReplacingOccurrencesOfString:@"https" withString:@"http"]; // } [manager GET:url parameters:dic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,@"",[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } HLog(@"接口名称:%@,返回:%@,\n ",url,responseObject); success([self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,[error description],[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } faildStr(error); }]; } - (void)CommonGetWithCallBackCode:(NSString *)code Parameters:(NSDictionary *_Nullable)dic success:(Success)success failure:(Faild)faildStr { NSString *url = [NSString stringWithFormat:@"%@%@",CloudService,code]; url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSDictionary *dictLogin = [self getLoginInfo]; if (dictLogin && [[dictLogin allKeys] containsObject:@"token"]) { NSString *tokenStr = [dictLogin objectForKey:@"token"]; [manager.requestSerializer setValue:tokenStr forHTTPHeaderField:@"Authorization"]; } else { //用户协议和隐私协议无需登录也可返回数据 //蜂芒开关 无需登录也可返回数据 if ([code rangeOfString:@"/api/public/v4/agreement/content?agreementCoding=XYPZYHXY2002"].location != NSNotFound || [code rangeOfString:@"/api/public/v4/agreement/content?agreementCoding=XYPZYSXY2001"].location != NSNotFound) { } else {//获取维护系统公告与否时候特殊处理 NSDictionary *responseObject = @{@"status" : @(6013), @"msg" : @"设备已在别处登录", @"data" : @""}; success(responseObject); [self logout]; [self showLoginOutTip:MSG]; return; } } if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) {// 无网络状态 success(self.networkErrorDict); return; } HLog(@"接口名称:%@,\n 参数:%@\n",code,dic); [manager GET:url parameters:dic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,@"",[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } HLog(@"接口名称:%@,返回:%@,\n ",code,responseObject); success([self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,[error description],[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } faildStr(error); }]; } #pragma mark hxd 重新封装 afnetwork post 请求 - (void)CommonPostCallBackCode:(NSString*)code Parameters:(NSDictionary *_Nullable)dict success:(Success)success failure:(Faild)failure { HLog(@"接口名称:%@,\n 参数:%@\n",code,dict); NSString *url = [NSString stringWithFormat:@"%@%@",CloudService,code]; NSDictionary *dictLogin = [self getLoginInfo]; if (dictLogin && [[dictLogin allKeys] containsObject:@"token"]) { NSString *tokenStr = [dictLogin objectForKey:@"token"]; [manager.requestSerializer setValue:tokenStr forHTTPHeaderField:@"Authorization"]; [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // HLog(@"URL:%@---Params:%@---token:%@", url, dict, tokenStr); } else { NSDictionary *responseObject = @{@"status" : @(6013), @"msg" : @"设备已在别处登录", @"data" : @""}; mainBlock(^{ success(responseObject); [self showLoginOutTip:MSG]; }); return; } if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) {// 无网络状态 success(self.networkErrorDict); return; } // // RSA签名 // if ([url containsString:GetOrderNumberAPI] || // [url containsString:STARCOINPAYAPI] || // [url containsString:GETAIRPAYCONNECTIONAPI] || // [url containsString:GETWXPAYCONNECTIONAPI]) { // // NSString *jsonStr = [RSATool sortArrWithDictionary:dict]; // NSString *signStr = [RSATool RSASignEncrypt:jsonStr key:Const_Pay_PrivateKey]; // signStr = [RSATool deleteNewlineCharactersWithString:signStr]; // if (signStr.length == 0) { // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // [self CommonPostCallBackCode:code Parameters:dict success:success failure:failure]; // }); // return; // } // [manager.requestSerializer setValue:signStr forHTTPHeaderField:@"sign"]; // // }else { // 清空签名 [manager.requestSerializer setValue:@"" forHTTPHeaderField:@"sign"]; // } [manager POST:url parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { HLog(@"接口名称:%@ 接口返回:%@,\n ",code,responseObject); [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,@"",[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } success([self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,[error description],[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } failure(error); }]; } - (void)CommonPostCallBackCode:(NSString*)code Params:(id)dict success:(Success)success failure:(Faild)failure { HLog(@"接口名称:%@,\n 参数:%@\n",code,dict); NSString *url = [NSString stringWithFormat:@"%@%@",CloudService,code]; NSDictionary *dictLogin = [self getLoginInfo]; if (dictLogin && [[dictLogin allKeys] containsObject:@"token"]) { NSString *tokenStr = [dictLogin objectForKey:@"token"]; [manager.requestSerializer setValue:tokenStr forHTTPHeaderField:@"Authorization"]; [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // HLog(@"URL:%@---Params:%@---token:%@", url, dict, tokenStr); } else { NSDictionary *responseObject = @{@"status" : @(6013), @"msg" : @"设备已在别处登录", @"data" : @""}; mainBlock(^{ success(responseObject); [self showLoginOutTip:MSG]; }); return; } if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) {// 无网络状态 success(self.networkErrorDict); return; } [manager POST:url parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { HLog(@"接口名称:%@ 接口返回:%@,\n ",code,responseObject); [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,@"",[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } success([self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,[error description],[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } failure(error); }]; } - (void)commonPostCanWithOutTokenCallBackCode:(NSString*)code Parameters:(NSDictionary*)dict success:(Success)success failure:(Faild)failure { HLog(@"接口名称:%@,\n 参数:%@\n",code,dict); NSString *url = [NSString stringWithFormat:@"%@%@",CloudService,code]; NSDictionary *dictLogin = [self getLoginInfo]; if (dictLogin && [[dictLogin allKeys] containsObject:@"token"]) { NSString *tokenStr = [dictLogin objectForKey:@"token"]; [manager.requestSerializer setValue:tokenStr forHTTPHeaderField:@"Authorization"]; [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // HLog(@"URL:%@---Params:%@---token:%@", url, dict, tokenStr); } // if ([code isEqualToString:RegAPI] && [[dict allKeys] containsObject:@"registerTime"]){ // NSString *timeStr = [dict objectForKey:@"registerTime"]; // NSMutableString *data1 = [RSATool sha256_64:[@"Register_SZX_2023:" stringByAppendingString:timeStr]]; // [manager.requestSerializer setValue:data1 forHTTPHeaderField:@"registerSign"]; // } if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) {// 无网络状态 success(self.networkErrorDict); return; } [manager POST:url parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,@"",[responseObject description]]]; HLog(@"接口名称:%@ 接口返回:%@,\n ",code,responseObject); if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } success([self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,[error description],[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } failure(error); }]; } #pragma mark hxd 重新封装 afnetwork put 请求 - (void)CommonPutCallBackCode:(NSString*)code Parameters:(NSDictionary*)dict success:(Success)success failure:(Faild)failure { HLog(@"接口名称:%@,\n 参数:%@\n",code,dict); NSString *url = [NSString stringWithFormat:@"%@%@",CloudService,code]; NSDictionary *dictLogin = [self getLoginInfo]; if (dictLogin && [[dictLogin allKeys] containsObject:@"token"]) { NSString *tokenStr = [dictLogin objectForKey:@"token"]; [manager.requestSerializer setValue:tokenStr forHTTPHeaderField:@"Authorization"]; [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // HLog(@"URL:%@---Params:%@---token:%@", url, dict, tokenStr); } else { NSDictionary *responseObject = @{@"status" : @(6013), @"msg" : @"设备已在别处登录", @"data" : @""}; mainBlock(^{ success(responseObject); [self showLoginOutTip:MSG]; }); return; } if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) {// 无网络状态 success(self.networkErrorDict); return; } [manager PUT:url parameters:dict success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,@"",[responseObject description]]]; HLog(@"接口返回:%@,\n ",responseObject); if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } success([self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,[error description],[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } failure(error); }]; } - (void)commonPutCanWithoutTokenCallBackCode:(NSString*)code Parameters:(NSDictionary*)dict success:(Success)success failure:(Faild)failure { HLog(@"接口名称:%@,\n 参数:%@\n",code,dict); NSString *url = [NSString stringWithFormat:@"%@%@",CloudService,code]; if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) {// 无网络状态 success(self.networkErrorDict); return; } [manager PUT:url parameters:dict success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,@"",[responseObject description]]]; HLog(@"接口返回:%@,\n ",responseObject); if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } success([self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,[error description],[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } failure(error); }]; } #pragma mark hxd 重新封装 afnetwork delete 请求 - (void)CommonDeleteCallBackCode:(NSString*)code Parameters:(NSDictionary *_Nullable)dict success:(Success)success failure:(Faild)failure { HLog(@"接口名称:%@,\n 参数:%@\n",code,dict); NSString *url = [NSString stringWithFormat:@"%@%@",CloudService,code]; NSDictionary *dictLogin = [self getLoginInfo]; if (dictLogin && [[dictLogin allKeys] containsObject:@"token"]) { NSString *tokenStr = [dictLogin objectForKey:@"token"]; [manager.requestSerializer setValue:tokenStr forHTTPHeaderField:@"Authorization"]; [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // HLog(@"URL:%@---Params:%@---token:%@", url, dict, tokenStr); } else { NSDictionary *responseObject = @{@"status" : @(6013), @"msg" : @"设备已在别处登录", @"data" : @""}; mainBlock(^{ success(responseObject); [self showLoginOutTip:MSG]; }); return; } if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) {// 无网络状态 success(self.networkErrorDict); return; } [manager DELETE:url parameters:dict success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,@"",[responseObject description]]]; HLog(@"接口返回:%@,\n ",responseObject); if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } success([self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,[error description],[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } failure(error); }]; } #pragma - mark 证书相关 - (AFSecurityPolicy*)customSecurityPolicy { // // /先导入证书 // NSString *cerName = @"newrelease"; // if ([@"https://client.phone.androidscloud.com" isEqualToString:CloudService]) // { // cerName = @"newrelease"; // } // else if ([@"https://prese.phone.androidscloud.com" isEqualToString:CloudService]) // { // cerName = @"newrelease"; // } // NSString *cerPath = [[NSBundle mainBundle] pathForResource:cerName ofType:@"cer"];//证书的路径 // NSData *certData = [NSData dataWithContentsOfFile:cerPath]; // AFSSLPinningModeCertificate 使用证书验证模式、、、//AFSSLPinningModeNone 不使用SSLPinning //AFSSLPinningModeCertificate 使用SSLPinning AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; // if ([@"https://test.androidscloud.com" isEqualToString:CloudService]) // { // securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; // } // else if ([@"https://pre.androidscloud.com" isEqualToString:CloudService]) // { // securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; // } // else if ([@"https://a.androidscloud.com" isEqualToString:CloudService]) // { // securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; // } // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO // 如果是需要验证自建证书,需要设置为YES securityPolicy.allowInvalidCertificates = NO; //validatesDomainName 是否需要验证域名,默认为YES; //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。 //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。 //如置为NO,建议自己添加对应域名的校验逻辑。 securityPolicy.validatesDomainName = YES; // securityPolicy.pinnedCertificates = [[NSSet alloc] initWithObjects:certData, nil]; return securityPolicy; } // 清空Cookie - (void)clearCookies { NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; NSArray *cookieArray = [NSArray arrayWithArray:[cookieJar cookies]]; for(id obj in cookieArray) { [cookieJar deleteCookie:obj]; } } #pragma mark 云手机列表缓存信息 - (void)setCloudPhoneListModel:(CloudPhoneListModel *)cloudPhoneListModel { _cloudPhoneListModel = cloudPhoneListModel; // 1、保存或更新云手机列表缓存数据 // [HWDataManager saveCloudPhoneList]; } #pragma mark 直接使用外部链接请求数据 请求 - (void)commonGetWithUrl:(NSString *)url Parameters:(NSDictionary *_Nullable)dic success:(Success)success failure:(Faild)faildStr { if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) {// 无网络状态 success(self.networkErrorDict); return; } HLog(@"接口名称:%@,\n 参数:%@\n",url,dic); [manager GET:url parameters:dic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,@"",[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } HLog(@"接口名称:%@,返回:%@,\n ",url,responseObject); success([self check401And403WithObject:responseObject]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) { [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,[error description],[responseObject description]]]; if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } faildStr(error); }]; } //获取登录信息 - (NSDictionary *)getLoginInfo { NSDictionary *loginInfoDict = [HWDataManager getObjectWithKey:Const_HWLoginDictionary]; //只获取一次token 上报频繁调用获取token会奔溃) if (loginInfoDict && [[loginInfoDict allKeys] containsObject:@"token"]) { if ([HWDataManager getStringWithKey:@"XD_getLoginInfo"].length == 0) { NSString *tokenStr = [loginInfoDict objectForKey:@"token"]; [HWDataManager setStringWithKey:@"XD_getLoginInfo" value:tokenStr]; } } return loginInfoDict; } //登出操作 - (BOOL)logout { [[NSNotificationCenter defaultCenter] postNotificationName:NotNameAlertClose object:self]; //清除广告的token,重登时,重新获取广告token [HWDataManager setStringWithKey:@"XD_getLoginInfo" value:@""]; NSDictionary *dictLogin = self.getLoginInfo; [[NSNotificationCenter defaultCenter] postNotificationName:WebSocketDisconnectNotification object:dictLogin]; BOOL resultSetLoginInfo = NO; if ([self setLoginInfo:[NSDictionary new]]) { resultSetLoginInfo = YES; } else { if ([self setLoginInfo:[NSDictionary new]]) { resultSetLoginInfo = YES; } else { resultSetLoginInfo = [self setLoginInfo:[NSDictionary new]]; } } [self.useBaseInfo removeAllObjects]; self.useBaseInfo = nil; [self.cloudPhoneListModel.diskInfo removeAllObjects]; self.cloudPhoneListModel.diskInfo = nil; [self.useLeftInfo removeAllObjects]; self.useLeftInfo = nil; [self.manager.requestSerializer setValue:nil forHTTPHeaderField:@"Authorization"]; [[NSNotificationCenter defaultCenter] postNotificationName:ChangeAccountNotification object:nil]; //清空保存的账号 [HWDataManager setStringWithKey:Const_HWAccountPhoneNumber value:@""]; return resultSetLoginInfo; } #pragma - mark 设置用户登录信息 //设置登录信息 - (BOOL)setLoginInfo:(NSDictionary *)loginInfo { // 保存登录字典 [HWDataManager setObjectWithKey:Const_HWLoginDictionary value:loginInfo]; // 保存登录账号 NSString *number = loginInfo[@"account"]; [HWDataManager setStringWithKey:Const_HWAccountPhoneNumber value:number]; return YES; } //保存当前设备漂浮窗位置信息 - (void)saveDviceDriftInfoWith:(CGFloat)pointx ponitY:(CGFloat)ponity hidden:(BOOL)hidden deviceSN:(NSString *)sn { NSDictionary *dictLogin = [[UseAccountManage shareInstance] getLoginInfo]; if ([[dictLogin allKeys] containsObject:@"account"]) { NSString *account = [dictLogin objectForKey:@"account"]; /*数据保存到本地*/ NSString *deviceDriftPath = [HWDataManager pathForDeviceDriftWithAccount:account sn:sn]; NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithFloat:pointx],@"pointx", [NSNumber numberWithFloat:ponity],@"pointy", [NSNumber numberWithBool:hidden],@"hidden",nil]; [dict writeToFile:deviceDriftPath atomically:YES]; } } //保存当前设备sn信息 - (NSDictionary *)getDviceDriftInfoWithdeviceSN:(NSString *)sn { NSDictionary *dictLogin = [[UseAccountManage shareInstance] getLoginInfo]; NSDictionary *dict = nil; if ([[dictLogin allKeys] containsObject:@"account"]) { NSString *account = [dictLogin objectForKey:@"account"]; /*数据保存到本地*/ NSString *deviceDriftPath = [HWDataManager pathForDeviceDriftWithAccount:account sn:sn]; dict = [[NSDictionary alloc] initWithContentsOfFile:deviceDriftPath]; } return dict; } - (void)extensionCloudPhoneToGetDeviceStatesWithDeviceId:(NSInteger )deviceId coordinatesLat:(NSString *)coordinatesLat coordinatesLng:(NSString *)coordinatesLng success:(Success)success faild:(Faild)faildStr { self.mCloudService = CloudService; self.mRequstAPI = GETDEVICESTATESAPI; NSDictionary *parameters; NSDictionary *dictLogin = [self getLoginInfo]; if (dictLogin && [[dictLogin allKeys] containsObject:@"token"]) { NSString *tokenStr = [dictLogin objectForKey:@"token"]; [self.manager.requestSerializer setValue:tokenStr forHTTPHeaderField:@"Authorization"]; } else { return; } NSString *userOperatorNetwork = [iPhone getCarrierInfo]; parameters = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:1],@"deviceStatus",[NSNumber numberWithInteger:deviceId],@"userCardId", coordinatesLat, @"coordinatesLat", coordinatesLng, @"coordinatesLng", userOperatorNetwork, @"userOperatorNetwork", nil]; [self requestWithPostparameters:parameters complteteBlock:^(NSError *error , id data){ [[VclCrash sharedInstance] writeContent:[NSString stringWithFormat:@"%s__error = %@_data = %@__",__FUNCTION__,[error description],[data description]]]; if (error) { faildStr(error); } else { success(data); } }]; } //获取云手机推流页面指令通道URL - (NSString *)getInstructionsChannelUrlWithInternetHttp:(NSString *)internetHttp localIp:(NSString *)localIp cardToken:(NSString *)cardToken { NSDictionary *dictLogin = [[UseAccountManage shareInstance] getLoginInfo]; if ([[dictLogin allKeys] containsObject:@"userName"]) { NSString *tokenStr = @""; if ([[dictLogin allKeys] containsObject:@"token"]) { tokenStr = [dictLogin objectForKey:@"token"]; } NSString *url = [NSString stringWithFormat:@"ws://%@/businessChannel?cardIp=%@&token=%@&type=directives",internetHttp,localIp,cardToken]; return url; }else { return nil; } } //获取云手机推流页面业务通道URL - (NSString *)getBusinessChannelUrlWithInternetHttp:(NSString *)internetHttp localIp:(NSString *)localIp cardToken:(NSString *)cardToken { NSDictionary *dictLogin = [[UseAccountManage shareInstance] getLoginInfo]; if ([[dictLogin allKeys] containsObject:@"userName"]) { NSString *tokenStr = @""; if ([[dictLogin allKeys] containsObject:@"token"]) { tokenStr = [dictLogin objectForKey:@"token"]; } NSString *url = [NSString stringWithFormat:@"ws://%@/businessChannel?cardIp=%@&token=%@&type=business",internetHttp,localIp,cardToken]; return url; }else{ return nil; } } /** * @brief 埋点 * * @param array 参数,埋点数据 * * */ - (void)extensionPublicToBuryPointPostCallBackCode:(NSString*)code Parameters:(NSMutableArray*)array success:(Success)success failure:(Faild)failure { HLog(@"接口名称:%@,\n 参数:%@\n",code,array); NSString *url = [NSString stringWithFormat:@"%@%@",CloudService,code]; NSDictionary *dictLogin = [self getLoginInfo]; // 用户登录 if (dictLogin && [[dictLogin allKeys] containsObject:@"token"]) { NSString *tokenStr = [dictLogin objectForKey:@"token"]; [self.manager.requestSerializer setValue:tokenStr forHTTPHeaderField:@"Authorization"]; } [self.manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; //设备类型 ,1:Android、2:ios、3:PC,必传 [self.manager.requestSerializer setValue:@"2" forHTTPHeaderField:@"platform"]; //渠道,必传 [self.manager.requestSerializer setValue:@"app store" forHTTPHeaderField:@"channel"]; // app版本 NSString *version = [NSString stringWithFormat:@"v%@", [iPhone appVersion]]; [self.manager.requestSerializer setValue:version forHTTPHeaderField:@"versionName"]; if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) {// 无网络状态 success(self.networkErrorDict); return; } [self.manager POST:url parameters:array progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { HLog(@"接口名称:%@ 接口返回:%@,\n ",code,responseObject); if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } success(responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) { if ([self isDidHandelCustomStatusFun:responseObject task:task]) { return; } failure(error); }]; } @end