// // myHttp.m // tianyin // // Created by xTT on 15/6/6. // Copyright (c) 2015年 xTT. All rights reserved. // #import "MyHttp.h" #import "AppDelegate.h" #import "User.h" #import "Device.h" #import "Circle.h" #define goLoginTag 100 #define goHomeTag 200 #define reQuestTag 300 #define updataTag 400 @interface MyHttp (){ NSString *reURLString; NSDictionary *reParameters; void (^reSuccess)(NSURLSessionDataTask *, id); void (^reFailure)(NSURLSessionDataTask *task, NSError *error); } @end @implementation MyHttp + (instancetype)sharedClient { static MyHttp *client = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ client = [[MyHttp alloc] initWithBaseURL:[NSURL URLWithString:xBaseUrl]]; client.requestSerializer.HTTPMethodsEncodingParametersInURI = [NSSet setWithArray:@[@"GET", @"HEAD"]]; client.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil]; [client.reachabilityManager startMonitoring]; NSString *basicAuthStr = [NSString stringWithFormat:@"%@:%@",URL_username,URL_password]; NSData *basicAuthData = [basicAuthStr dataUsingEncoding:NSASCIIStringEncoding]; // 通过 ID :密码 的格式,用Basic 的方式拼接成字符串 NSString *basicAuthValue = [NSString stringWithFormat:@"Basic %@",[basicAuthData base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength]]; // 设置Authorization的方法设置header [client.requestSerializer setValue:basicAuthValue forHTTPHeaderField:@"Authorization"]; // [client.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // [client setSecurityPolicy:[client customSecurityPolicy]]; }); return client; } - (AFSecurityPolicy*)customSecurityPolicy { /**** SSL Pinning ****/ // NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"app2g.mobilebrother.net" ofType:@"cer"]; // NSData *cerData = [NSData dataWithContentsOfFile:cerPath]; // AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate // withPinnedCertificates:[[NSSet alloc] initWithObjects:cerData, nil]]; // [securityPolicy setAllowInvalidCertificates:YES]; // 是否在证书域字段中验证域名 // AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init]; // [securityPolicy setValidatesDomainName:NO]; // **** SSL Pinning *** AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; [securityPolicy setAllowInvalidCertificates:YES]; return securityPolicy; } - (NSDictionary *)addIdentify:(id)parameters URL:(NSString *)URLString{ NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:parameters]; [dic setObject:[[NSBundle mainBundle] bundleIdentifier] forKey:@"identify"]; // xLog(@"parameters = %@ = %@",dic,URLString); return dic; } - (NSURLSessionDataTask *)URL:(NSString *)URLString method:(NSString *)method parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure{ return [self URL:URLString method:method parameters:parameters constructingBodyWithBlock:nil success:success failure:failure]; } - (NSURLSessionDataTask *)URL:(NSString *)URLString method:(NSString *)method parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure showHUD:(BOOL)showHUD{ return [self URL:URLString method:method parameters:parameters constructingBodyWithBlock:nil success:success failure:failure showHUD:showHUD]; //本来是写死 NO } - (NSURLSessionDataTask *)URL:(NSString *)URLString method:(NSString *)method parameters:(id)parameters constructingBodyWithBlock:(void (^)(id formData))block success:(void (^)(NSURLSessionDataTask * task, id responseObject))success failure:(void (^)(NSURLSessionDataTask * task, NSError * error))failure{ return [self URL:URLString method:method parameters:parameters constructingBodyWithBlock:block success:success failure:failure showHUD:YES]; } - (NSURLSessionDataTask *)URL:(NSString *)URLString method:(NSString *)method parameters:(id)parameters constructingBodyWithBlock:(void (^)(id formData))block success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure showHUD:(BOOL)showHUD{ return [self URL:URLString method:method parameters:parameters constructingBodyWithBlock:block success:success failure:failure showHUD:showHUD showError:YES]; //本来是写死 YES } //- (void)setFormData:(id)formData // parameters:(id)parameters // obj:(id)obj // img:(UIImage *)img { // if (img) { // [formData appendPartWithFileData:UIImageJPEGRepresentation(img, 0.1) // name:@"image" // fileName:@"image.jpg" // mimeType:@"image/jpeg"]; // }else if (obj){ // if ([obj isKindOfClass:[UIImage class]]) { // [formData appendPartWithFileData:UIImageJPEGRepresentation(obj, 0.1) // name:@"content" // fileName:@"image.jpg" // mimeType:@"image/jpeg"]; // }else if ([parameters[@"content_type"] isEqualToNumber:@(3)] || // [parameters[@"type"] isEqualToNumber:@(3)]){ // [formData appendPartWithFileData:obj // name:@"content" // fileName:@"voice" // mimeType:@"amr"]; // } // } //} - (NSURLSessionDataTask *)URL:(NSString *)URLString method:(NSString *)method parameters:(id)parameters constructingBodyWithBlock:(void (^)(id formData))block success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure showHUD:(BOOL)showHUD showError:(BOOL)showError{ AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate; [app beingBackgroundUpdateTask]; if (!parameters || [parameters isKindOfClass:[NSDictionary class]]) { parameters = [NSMutableDictionary dictionaryWithDictionary:parameters]; } if ([User currentUser]) { [parameters setObject:[User currentUser].openid forKey:@"openid"]; [parameters setObject:[User currentUser].accesstoken forKey:@"accesstoken"]; } //MARK: 添加app版本号,BundleID,时区,语言等到头部 [self.requestSerializer setValue:kTOKEN_APP_VERSION forHTTPHeaderField:@"Version"]; [self.requestSerializer setValue:kTOKEN_APP_BUNDLEID forHTTPHeaderField:@"BundleId"]; [self.requestSerializer setValue:kTOKEN_APP_LANGUAGE forHTTPHeaderField:@"Accept-Language"]; [self.requestSerializer setValue:kTOKEN_APP_TIMEZONE forHTTPHeaderField:@"Timezone"]; if (showError && self.reachabilityManager.networkReachabilityStatus != AFNetworkReachabilityStatusUnknown && !self.reachabilityManager.isReachable) { //[UICommon MessageErrorText:NSLocalizedStringFromTable(@"请检查您的网络设置", @"Localization", @"")]; [UICommon MessageErrorText:NSLocalizedStringFromTable(@"请检查您的网络设置", @"Localization", @"")]; [UICommon HidenLoading]; failure(nil,nil); return nil; } if (showHUD) { //[UICommon MessageUpload:@"正在加载"]; } xLog(@"请求 %@ = %@ = %@",parameters,URLString,method); NSURLSessionDataTask *dataTask = nil; WEAKSELF if ([method isEqualToString:@"POST"]) { if (block) { dataTask = [super POST:URLString parameters:parameters constructingBodyWithBlock:^(id _Nonnull formData) { [UICommon HidenLoading]; if (block) { block(formData); } } progress:^(NSProgress * _Nonnull uploadProgress) { // xLog(@"%@",uploadProgress); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { xLog(@"返回 %@ = %@ = %@",responseObject,URLString,method); [self httpSuccess:success task:task responseObject:responseObject showHUD:showHUD showError:showError]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [UICommon HidenLoading]; [self httpFailure:failure task:task error:error showHUD:showHUD showError:showError]; }]; }else{ dataTask = [super POST:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { // xLog(@"%@",uploadProgress); }success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject){ xLog(@"返回 %@ = %@ = %@",responseObject,URLString,method); [self httpSuccess:success task:task responseObject:responseObject showHUD:showHUD showError:showError]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error){ [self httpFailure:failure task:task error:error showHUD:showHUD showError:showError]; }]; } }else if([method isEqualToString:@"GET"]){ dataTask = [super GET:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { // xLog(@"%@",uploadProgress); }success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject){ xLog(@"返回 %@ = %@ = %@",responseObject,URLString,method); [self httpSuccess:success task:task responseObject:responseObject showHUD:showHUD showError:showError]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error){ [self httpFailure:failure task:task error:error showHUD:showHUD showError:showError]; }]; }else if([method isEqualToString:@"PUT"]){ dataTask = [super PUT:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject){ xLog(@"返回 %@ = %@ = %@",responseObject,URLString,method); [self httpSuccess:success task:task responseObject:responseObject showHUD:showHUD showError:showError]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error){ [self httpFailure:failure task:task error:error showHUD:showHUD showError:showError]; }]; }else if([method isEqualToString:@"PATCH"]){ if (block) { dataTask = [self PATCH:URLString parameters:parameters constructingBodyWithBlock:^(id _Nonnull formData) { if (block) { block(formData); } } progress:^(NSProgress * _Nonnull uploadProgress) { // xLog(@"%@",uploadProgress); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { xLog(@"返回 %@ = %@ = %@",responseObject,URLString,method); [self httpSuccess:success task:task responseObject:responseObject showHUD:showHUD showError:showError]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [self httpFailure:failure task:task error:error showHUD:showHUD showError:showError]; }]; }else{ dataTask = [super PATCH:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject){ xLog(@"返回 %@ = %@ = %@",responseObject,URLString,method); [self httpSuccess:success task:task responseObject:responseObject showHUD:showHUD showError:showError]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error){ [self httpFailure:failure task:task error:error showHUD:showHUD showError:showError]; }]; } }else if([method isEqualToString:@"DELETE"]){ dataTask = [super DELETE:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject){ xLog(@"返回 %@ = %@ = %@",responseObject,URLString,method); [self httpSuccess:success task:task responseObject:responseObject showHUD:showHUD showError:showError]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error){ [self httpFailure:failure task:task error:error showHUD:showHUD showError:showError]; }]; } return dataTask; } //PATCH上传文件 -(NSURLSessionDataTask*)PATCH:(NSString *)URLString parameters:(id)parameters constructingBodyWithBlock:(void (^)(id _Nonnull))block progress:(void (^)(NSProgress * _Nonnull))uploadProgress success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure{ NSError *serializationError = nil; NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"PATCH" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:&serializationError]; if (serializationError) { if (failure) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wgnu" dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ failure(nil, serializationError); }); #pragma clang diagnostic pop } return nil; } __block NSURLSessionDataTask *task = [self uploadTaskWithStreamedRequest:request progress:uploadProgress completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { if (error) { if (failure) { failure(task, error); } } else { if (success) { success(task, responseObject); } } }]; [task resume]; return task; } - (void)httpSuccess:(void (^)(NSURLSessionDataTask *task, id responseObject))success task:(NSURLSessionDataTask *)task responseObject:(id)responseObject showHUD:(BOOL)showHUD showError:(BOOL)showError { [UICommon HidenLoading]; AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate; [app endBackgroundUpdateTask]; if ([responseObject[@"code"] intValue] != HTTP_SUCCESS && showError) { if([task.currentRequest.URL.absoluteString containsString:@"/location/last"]&&([responseObject[@"code"] intValue] == 5002 || [responseObject[@"code"] intValue] == 5001) ){ [UICommon HidenLoading]; }else{ [self showErrorWithCode:[responseObject[@"code"] intValue] message:responseObject[@"msg"]]; } }else if (showHUD){ [UICommon HidenLoading]; } if (success) { success(task, responseObject); } } - (void)httpFailure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure task:(NSURLSessionDataTask *)task error:(NSError *)error showHUD:(BOOL)showHUD showError:(BOOL)showError{ [UICommon HidenLoading]; xLog(@"请求错误 URL:%@,error = %@",task.currentRequest.URL.absoluteString, error); AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate; [app endBackgroundUpdateTask]; [UICommon HidenLoading]; if (showError) { //[UICommon MessageErrorText:error.userInfo[NSLocalizedDescriptionKey]]; [UICommon MessageErrorText:error.userInfo[NSLocalizedDescriptionKey]]; }else if (showHUD){ [UICommon HidenLoading]; } if (failure) { failure(task, error); xLog(@"%@",[[NSString alloc] initWithData:error.userInfo[@"com.alamofire.serialization.response.error.data"] encoding:NSUTF8StringEncoding]); } } - (void)showErrorWithCode:(int)code message:(NSString *)message{ NSString *msg = @""; switch (code) { case HTTP_ERROR_400: msg = @"请求参数错误,错误详情见 msg 参数"; break; case HTTP_ERROR_401:{ msg = @"accesstoken参数无效"; [User setCurrentUser:nil]; }break; case HTTP_ERROR_402:{ msg = @"密码已被修改"; [User setCurrentUser:nil]; }break; case HTTP_ERROR_403: msg = @"业务所需参数校验失败(密码,验证码等无效)"; break; case HTTP_ERROR_500: msg = @"处理异常,请稍后重试"; break; case HTTP_ERROR_600: msg = @"触发了平台未定义的业务行为"; break; case HTTP_ERROR_2000:{ msg = @"账号数据不存在"; [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"lastLoginName"]; [[NSUserDefaults standardUserDefaults] synchronize]; [User setCurrentUser:nil]; }break; case HTTP_ERROR_2001: msg = @"设备数据不存在"; break; case HTTP_ERROR_2002: msg = @"厂商数据不存在"; // [self invalidSession]; break; case HTTP_ERROR_2003: msg = @"聊天群不存在"; break; case HTTP_ERROR_4000: msg = @"该设备已绑定于某一用于,不可再次被绑定"; break; case HTTP_ERROR_4001: msg = @"该设备已在某一群组中,不能再加入其它群组额"; break; case HTTP_ERROR_4002: msg = @"该设备不在此群组中,无法对其进行删除"; break; case HTTP_ERROR_4004: msg = @"该设备未与用户绑定,所以无法进入聊天群组"; break; case HTTP_ERROR_4005: msg = @"用户还没有使用此手机号注册应用"; break; case HTTP_ERROR_4006: msg = @"用户不在该设备的联系人中"; break; case HTTP_ERROR_4007: msg = @"该闹钟已被删除,不在此设备中"; break; case HTTP_ERROR_4008: msg = @"该免打扰设置已被删除,不在此设备中"; break; case HTTP_ERROR_4009: msg = @"该照片未找到"; break; case HTTP_ERROR_4010:{ msg = @"所创建的业务数据因业务场景原因数量已超限(sos号码,闹钟,免打扰)"; // @"contact" // @"disturbBan" // @"voiceAlarm" // if ([task.response.URL.relativePath rangeOfString:str].location != NSNotFound) { // NSLog(@"这个字符串中有\n"); // } }break; case HTTP_ERROR_5001: msg = @"设备未联网,可能当前信号差或关机"; break; case HTTP_ERROR_5002: msg = @"设备未联网,可能当前信号差"; break; default: break; } xLog(@"msg ====== %@",msg); if (message.length > 0) { // [UICommon MessageErrorText:message]; [UICommon MessageErrorText:message]; } else { //[UICommon MessageErrorText:msg]; [UICommon MessageErrorText:message]; } if (!cUser && code != 405) { [UICommon HidenLoading]; AfterDispatch(1, ^{ [[NSNotificationCenter defaultCenter] postNotificationName:@"outLogin" object:nil]; }); } } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ // AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate; if (alertView.tag == goHomeTag) { // [app goHomeViewController]; }else if(alertView.tag == goLoginTag){ // [app goLoginViewController]; }else if(alertView.tag == reQuestTag && _isMust){ // [self POST:reURLString parameters:reParameters success:reSuccess failure:reFailure]; } } - (void)invalidSession{ [User setCurrentUser:nil]; [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadCircleDataView" object:nil]; } + (NSString *)getURL:(NSString *)URL objArr:(NSArray *)objArr { __block NSString *urlStr = URL;//self.caInterface[@"prefix"]; NSArray *arr = @[@"[openid]",@"[imei]",@"[vendor]",@"[groupid]"]; @try { [arr enumerateObjectsUsingBlock:^(NSString * _Nonnull key, NSUInteger idx, BOOL * _Nonnull stop) { __block NSString *str = @""; NSRange range = [urlStr rangeOfString:key]; if (range.location != NSNotFound) { if ([key isEqualToString:@"[openid]"]) { __block User *user = nil; [objArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj isKindOfClass:[User class]]) { user = obj; str = user.openid; *stop = YES; } }]; }else if([key isEqualToString:@"[imei]"] || [key isEqualToString:@"[vendor]"]){ __block Device *device = nil; [objArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj isKindOfClass:[Device class]]) { device = obj; if ([key isEqualToString:@"[vendor]"]) { str = [NSString stringWithFormat:@"%@",device.vendor]; }else if ([key isEqualToString:@"[imei]"]){ if( device.imei){ str = device.imei; } } *stop = YES; } }]; }else if([key isEqualToString:@"[groupid]"]){ __block Circle *circle = nil; [objArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj isKindOfClass:[Circle class]]) { circle = obj; str = circle.groupid; *stop = YES; } }]; } urlStr = [urlStr stringByReplacingOccurrencesOfString:key withString:str]; } }]; } @catch (NSException *exception) { NSLog(@"URL format exception!!!"); } NSLog(@"get url = %@", urlStr); return urlStr; } - (void)UploadPictureByFileName:(NSString*) fileName Path:(NSData*) path success:(void (^)(id responseObject))success failure:(void (^)(id faiObject))failure { NSString *urlString = fileName; NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate; [app beingBackgroundUpdateTask]; if (!parameters || [parameters isKindOfClass:[NSDictionary class]]) { parameters = [NSMutableDictionary dictionaryWithDictionary:parameters]; } if ([User currentUser]) { [parameters setObject:[User currentUser].openid forKey:@"openid"]; [parameters setObject:[User currentUser].accesstoken forKey:@"accesstoken"]; } //MARK: 添加app版本号,BundleID,时区,语言等到头部 [self.requestSerializer setValue:kTOKEN_APP_VERSION forHTTPHeaderField:@"Version"]; [self.requestSerializer setValue:kTOKEN_APP_BUNDLEID forHTTPHeaderField:@"BundleId"]; [self.requestSerializer setValue:kTOKEN_APP_LANGUAGE forHTTPHeaderField:@"Accept-Language"]; [self.requestSerializer setValue:kTOKEN_APP_TIMEZONE forHTTPHeaderField:@"Timezone"]; [self POST:urlString parameters:parameters constructingBodyWithBlock:^(id _Nonnull formData) { [formData appendPartWithFileData:path name:@"image" fileName:@"image.jpg" mimeType:@"image/jpg/file"]; } progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (success) { success(responseObject); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (failure) { failure(error); } NSLog(@"上传错误:%@",error); }]; } @end