// // jiaPeiManager.m // jiaPei // // Created by apple on 2016/12/26. // Copyright © 2016年 JCZ. All rights reserved. // #import "jiaPeiManager.h" #import "AFNetworking.h" #import "DES3Util.h" #import "DesUtil.h" @implementation jiaPeiManager + (NSDictionary *)getDicWithArray:(NSArray *)array { NSMutableDictionary *questDic = [NSMutableDictionary dictionaryWithCapacity:array.count]; if (!array) { return questDic; } for (NSDictionary *dict in array) { //其实这个判断跟自定义addpro里面重复了,但是鉴于项目有些参数的添加没有使用addpro过滤。所以此处再次判断 if (dict && dict.allValues.count != 0) { [questDic setValue:[dict.allValues firstObject] forKey:[dict.allKeys firstObject]]; } } return questDic; } + (NSString *)getURLWithDict:(NSDictionary *)dic urlPre:(NSString *)urlP { BOOL isOnline = isOfficial; //生成带有签名的URL NSString *httpUrl = defaultHttp; if (!isOnline) { httpUrl = defaultHttp2; } //公共请求 NSArray *commonArray = @[@"getAppAdsNew", //广告 @"getMyYuyueInfos", //获取自主预约 @"getMessageInfos", //我的系统消息 @"getTeachTypes", //获取日志类型 @"getMyTeachLogs", //获取日志 @"stuXXList", //获取休学记录 @"getMyReserveOrders", //获取订单 // @"uploadReserveComplaints", //获取投诉 @"getOrderComplaintsByClassId" //根据课堂ID和投诉用户ID查询投诉 ]; //计时相关 NSArray *trainArray = @[@"getCoachSignForTrain", //获取教练当天签到状态 @"getSignRecords", //获取教练签到记录 @"getCoachSignStuRecords", //获取学员签到列表 @"uploadSignOutOrClassRecord", //签退并上传学时汇总 @"uploadAppTrainSingle", //分钟学时及GPS点上传 @"uploadAppTrainPl", //分钟学时批量上传 @"takePhoto", //学员签到/签退/随机拍照 @"uploadStuSign", //学员签到 @"doTeach", //我要带教 @"saveCoachSignOut", //教练员签退 @"saveCoachSignIn", //教练员签到 @"doDeviceLogOut", //终端注销 @"doDeviceReg", //终端注册 @"getPrice", //培训价格 @"delLogStudent", //霸王签退 @"uploadReserveOrder", //计划生成订单 @"delReserveOrder", //删除计划订单 @"uploadBindStuImei", //学员手机设备绑定 @"getEvaluationCoachList", //教练获得的评价栏目数 @"doComplaint", //学时投诉 @"doEvaluation", //学时评论 @"getTrainFinish", //获取已完成学时 @"getEvaluationList", //查看学时评论 @"getStuSignFlag", //获取当前学员签到状态 @"forceSignOut", //用classid直接汇总 @"uploadMnStuLogin", //模拟计时签到 @"uploadMnSignOut", //模拟计时签退 @"getStudentTrack", //查询轨迹 @"getStudentTrainCheck", //学时确认状态 @"updateStudentTrainCheck", //确认学时 @"getSchPlaces", //查询驾校训练点信息 @"getSchPlaceCoachs", //查询训练场下所有教练 @"getStudentTrainInfos", //终端带教信息 @"getTrainRecordMins" //获取分钟学时 ]; //辽宁模拟相关 NSArray *lnMnTrainArray = @[@"getStuCardIdOrBluetooth", //根据学员ID获取证件号物理ID和蓝牙名称 @"face2face", //签到人脸比对 @"uploadTrainMinPl", //分钟学时批量上传 @"uploadMnqSignOut", //签退并上传学时汇总 @"upgradesVersion", //模拟设备升级 @"faceComparison" //模拟计时过程验证 ]; /// webservice相关接口 NSArray *lnwebserviceApiArray = @[@"studentQrcode", // 集中式理论 @"getZxInfoByStudent", // 获取学员转校信息记录 @"updZxInfoState", // 学员APP确认转校信息 @"face2faceTheory", // 课堂人脸比对 @"getQgCode", // 测试获取教练的二维码 @"getStuProtocol", // 获取学员合同 @"face2faceJykh" // 大车人脸比对 ]; /// webservice相关接口 NSArray *lnwebserviceEduArray = @[@"checkEduStu", // 验证学员是否有权限训练远程教育接口 @"getAppAnnouncement", // 获取公告 @"getAppAnnouncement2", // 获取硬性公告 @"getAppCompetence", @"uploadPhotoLog", // 远程教育调用摄像头做记录 ]; // 远程理论计时 NSArray *educationArr = @[@"getCurrentTime", // 获取当前时间 @"uploadEduSignIn", // 远程理论签到 @"uploadEduPic", // 远程理论拍照上传 @"uploadEduSignOut", // 远程理论签退 @"getTheoryStatus", // 获取理论签到状态 @"edufaceToface" // 远程理论人脸比对 ]; NSString *urlDefault = isOfficial? defaultHttpUrl : defaultHttpUrl2; if ([commonArray containsObject:urlP]) { urlDefault = isOfficial? defaultCommonUrl : defaultCommonUrl2; }else if ([trainArray containsObject:urlP]) { urlDefault = isOfficial? defaultTrainUrl : defaultTrainUrl2; }else if ([urlP isEqualToString:@"takePhoto"]) { urlDefault = isOfficial? defaultUploadUrl : defaultUploadUrl2; }else if ([lnMnTrainArray containsObject:urlP]) {//模拟训练人脸比对 urlDefault = isOfficial? defaultLnsimulator : defaultLnsimulator2; }else if ([lnwebserviceApiArray containsObject:urlP]) { urlDefault = isOfficial? lnwebserviceApi : lnwebserviceApi2; }else if ([lnwebserviceEduArray containsObject:urlP]) { if (!isOnline) { httpUrl = defaultHttp3; } urlDefault = isOfficial? lnwebserviceEdu : lnwebserviceEdu2; } else if ([educationArr containsObject:urlP]) { urlDefault = defaultEducation; } if (!isOnline) { urlDefault = [urlDefault stringByReplacingOccurrencesOfString:@"appservice" withString:@"lnappservice"]; } NSTimeInterval timeI = [[NSDate date] timeIntervalSince1970] * 1000;//获取时间戳 单位:s *1000毫秒 NSString *urlS = @""; if (dic == nil) { urlS = [NSString stringWithFormat:@"%@%@%@?ts=%@&user=ios&v=ln",httpUrl,urlDefault,urlP,[NSString stringWithFormat:@"%.0f",timeI]]; }else{ //添加key字段 NSMutableString *contentString = [NSMutableString stringWithString:[self getSignStringWithDictionary:dic]]; [contentString appendFormat:@"key=%@", [NSString stringWithFormat:@"%.0f",timeI]]; // NSString *strUrl1 = [contentString stringByReplacingOccurrencesOfString:@" " withString:@""]; // NSString *strUrl2 = [strUrl1 stringByReplacingOccurrencesOfString:@"\t" withString:@""]; // NSString *strUrl3 = [strUrl1 stringByReplacingOccurrencesOfString:@"\n" withString:@""]; urlS = [NSString stringWithFormat:@"%@%@%@?ts=%@&sign=%@&user=ios&v=ln",httpUrl,urlDefault,urlP,[NSString stringWithFormat:@"%.0f",timeI],[[contentString md5Encrypt] uppercaseString]]; //NSLog(@"urlS----><>%@----><>%@",strUrl3,urlS); } return urlS; } + (NSString *)getSignStringWithDictionary:(NSDictionary *)dic { NSMutableString *contentString =[NSMutableString string]; NSDictionary* dict = [NSDictionary dictionaryWithDictionary:dic]; NSArray *keys = [dict allKeys]; //按字母顺序排序 NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }]; //拼接字符串 for (NSString *categoryId in sortedArray) { if (![categoryId isEqualToString:@"sign"] && ![categoryId isEqualToString:@"timestamp"]){ if([categoryId isEqualToString:@"biz_content"]){ NSError *error = nil; NSDictionary* bizDict = [dict objectForKey:@"biz_content"]; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:bizDict options:NSJSONWritingPrettyPrinted error: &error]; NSMutableData *tempJsonData = [NSMutableData dataWithData:jsonData]; NSString* jsonString1 = [[NSString alloc] initWithData:tempJsonData encoding:NSUTF8StringEncoding]; NSString *jsonString2 = [jsonString1 stringByReplacingOccurrencesOfString:@" : " withString:@":"]; [contentString appendFormat:@"biz_content=%@&",jsonString2]; }else{ [contentString appendFormat:@"%@=%@&", categoryId, [dict valueForKey:categoryId]]; } } } return contentString; } //dic > string + (NSString *)dictionaryToJsonString:(NSDictionary *)dic { NSError *parseError = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&parseError]; return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; } //jsonString > dic + (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString { if (jsonString == nil) { return nil; } NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *err; if (jsonData == nil) { return nil; } NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; if(err) { // NSLog(@"json解析失败:%@",err); ShowMsg([NSString stringWithFormat:@"数据解析失败,%@",err]); return nil; } return dic; } + (void)requestAnythingWithURL:(NSString *)urlString array:(NSArray *)aAarray data:(NSData *)uplownData completion:(MyBlockType)finishBlock { if (uplownData) {//有媒体数据上传的请求 NSString *httpUrl = isOfficial == YES?defaultHttp:defaultHttp2; NSString *defaultUpload = defaultUploadUrl; NSString *urlS = [NSString stringWithFormat:@"%@%@%@",httpUrl,defaultUpload,urlString]; if (!isOfficial) { urlS = [urlS stringByReplacingOccurrencesOfString:@"appservice" withString:@"lnappservice"]; } // [urlS stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [urlS stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; AFHTTPSessionManager *afSessionManager = [AFHTTPSessionManager manager]; afSessionManager.requestSerializer = [AFHTTPRequestSerializer serializer]; afSessionManager.responseSerializer = [AFHTTPResponseSerializer serializer]; afSessionManager.responseSerializer.acceptableContentTypes = [afSessionManager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; afSessionManager.requestSerializer.timeoutInterval = 40; [afSessionManager POST:urlS parameters:nil headers:nil constructingBodyWithBlock:^(id _Nonnull formData) { int k = 0; for (NSData *uplownData in aAarray) { NSString *typeString = [Tools typeForImageData:uplownData]; NSString *fileType = [NSString stringWithFormat:@"image.%@",typeString]; NSString *mimeType = [NSString stringWithFormat:@"image/%@",typeString]; k ++; [formData appendPartWithFileData:uplownData name:[NSString stringWithFormat:@"photo%d",k] fileName:fileType mimeType:mimeType]; } } progress:^(NSProgress * _Nonnull uploadProgress) { //NSLog(@"uploadProgress----><>%@-----><>%@",urlS,uploadProgress); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (responseObject == nil) { NSDictionary *dic = nil; finishBlock(dic); return; } NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; //请求成功 NSLog(@"上传图片-----><>%@----><>%@",urlS,dic); finishBlock(dic); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { //请求失败 NSLog(@"上传---><>%@",error); //失败的时候 要把失败的事情传输回去 NSDictionary *dic = nil; finishBlock(dic); }]; }else{//无媒体数据上传的请求 NSDictionary *dic = [jiaPeiManager getDicWithArray:aAarray]; if (aAarray == nil) { dic = nil; } //生成请求加密后的url NSString *urlS = [jiaPeiManager getURLWithDict:dic urlPre:urlString]; if (![urlString isEqualToString:@"getSchInfoListByTujian"]) { NSLog(@"发起请求---urlString---><>%@--->\n%@",urlS,dic); } //设置请求管理器 AFHTTPSessionManager *afSessionManager = [AFHTTPSessionManager manager]; afSessionManager.requestSerializer = [AFJSONRequestSerializer serializer]; afSessionManager.responseSerializer = [AFHTTPResponseSerializer serializer]; afSessionManager.responseSerializer.acceptableContentTypes = [afSessionManager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; afSessionManager.requestSerializer.timeoutInterval = 15; //如果是人脸比对 增加了十秒超时延时 if ([urlString isEqualToString:@"face2face"] || [urlS isEqualToString:@"faceComparison"]) { afSessionManager.requestSerializer.timeoutInterval = 25; } [afSessionManager POST:urlS parameters:dic headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { //请求成功 if (responseObject == nil) { NSDictionary *dic = nil; finishBlock(dic); return; } NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; if (![urlString isEqualToString:@"getSchInfoListByTujian"]) { NSLog(@"请求成功123---urlString---><>%@--->\n%@",urlString,dic); } //鉴于项目里所有接口都没有处理 =-1 的情况,而服务器据说每个接口又有。就在这里统一处理了 //项目里大部分地方都没有按==0判定成功处理。都是判定了几个异常状态(常见的1,2)然后直接认定成功了 if ([dic[@"code"] isEqualToString:@"-1"]) {//数据异常 [dic setValue:@"1" forKey:@"code"]; } finishBlock(dic); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if ([error.localizedDescription isEqualToString:@"The request timed out."]) { finishBlock(nil); //,@"请求超时" NSLog(@"请求超时----><>%@",error); }else{ //请求失败 NSLog(@"请求失败123----><>%@",error); //失败的时候 要把失败的事情传输回去 NSDictionary *dic = nil; finishBlock(dic); } }]; } } + (void)requestGetAnythingWithURL:(NSString *)urlString completion:(MyBlockType)finishBlock { //生成请求加密后的url NSString *urlS = [jiaPeiManager getURLWithDict:nil urlPre:urlString]; // NSLog(@"-----><>%@--------><>%@",urlString,urlS); //设置请求管理器 AFHTTPSessionManager *afSessionManager = [AFHTTPSessionManager manager]; afSessionManager.requestSerializer = [AFJSONRequestSerializer serializer]; afSessionManager.responseSerializer = [AFHTTPResponseSerializer serializer]; [afSessionManager GET:urlS parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { //NSLog(@"请求返回123-------><>%@",responseObject); if (responseObject == nil) { NSDictionary *dic = nil; finishBlock(dic); return; } NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; NSLog(@"请求返回123---------><>%@",dic); finishBlock(dic); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { //请求失败 NSLog(@"请求失败123----><>%@",error); //失败的时候 要把失败的事情传输回去 @{@"code":@"1",@"body":@"请求失败"} NSDictionary *dic = nil; finishBlock(dic); }]; } #pragma mark 公共请求 +(void)requestADImage { if (![Util connectedToNetWork]) { NSString *filePath = [Tools getPathWithFileName:@"ads.plist"]; if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { NSArray *arr = [NSArray arrayWithContentsOfFile:filePath]; myDelegate.adArray = arr; } } NSMutableArray *arr=[NSMutableArray array]; [arr addPro:@"type" Value:@"4"]; NSString* method = @"getAppAdsNew"; [jiaPeiManager requestAnythingWithURL:method array:arr data:nil completion:^(NSDictionary *root) { if (!root || [root[@"code"] isEqualToString:@"1"]) { //如果没广告图片 就从这里获取 NSString *filePath = [Tools getPathWithFileName:@"ads.plist"]; if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { NSArray *arr = [NSArray arrayWithContentsOfFile:filePath]; myDelegate.adArray = arr; } }else{ //有广告 就更新本地广告 if ([root[@"body"] count] > 0) { myDelegate.adArray = root[@"body"]; NSString *filePath = [Tools getPathWithFileName:@"ads.plist"]; [root[@"body"] writeToFile:filePath atomically:YES]; } } //这个判断是否可以在广告加载钱接收到广告 其实和放另一个地方是一样的效果 NSMutableArray *array = [NSMutableArray array]; for (NSDictionary *dic in myDelegate.adArray) { if ([dic[@"LOCATION"] isEqualToString:@"1"]) { [array addObject:dic[@"IMG"]]; } } defUser.adPaths = array; [[NSNotificationCenter defaultCenter] postNotificationName:@"updateAD" object:@"isSuccess"]; }]; } @end