AFNetworking封装

来源:互联网 发布:游戏编程的软件 编辑:程序博客网 时间:2024/06/05 07:15

.h里面

//

//  CJNetworkRequest.m

//

//

//  Created by YouChangJiang on 16/4/19.

//  Copyright © 2016 YouChangJiang. All rights reserved.

//


/*

 * CJNetworkApi的一些功能和说明:

 

 1. 使用CJNetworkRequest做一些GETPOSTPUTDELETE请求,与业务逻辑对接部分直接以数组或者字典的形式返回。

 2. 网络下载、上传文件,以block的形式返回实时的下载、上传进度,上传文件参数通过模型CJFileConfig去存取。

 3. 通过继承于CJDataService来将一些数据处理,模型转化封装起来,于业务逻辑对接返回的是对应的模型,减少Controllor处理数据处理逻辑的压力。

 4. 自定义一些回调的block

 */


#import "CJNetworkRequest.h"



static BOOL isNetworkUse;


static  NSMutableDictionary *dictionaryForConnectionTag;


@implementation CJNetworkRequest


+(void)initialize {

    dictionaryForConnectionTag = [[NSMutableDictionaryalloc]initWithCapacity:20];

}


+(NSString *) paramAES128String:(NSDictionary *) param {

    

    NSMutableDictionary *muParam = [NSMutableDictionarydictionaryWithDictionary:param];

    [muParam setObject:[NSStringstringWithFormat:@"%ld",(long)[[NSDatedate] timeIntervalSince1970]]forKey:@"requesttime"];

    NSDictionary *localDic =[[NSBundlemainBundle] infoDictionary];

    NSString *currentVersion = [localDicobjectForKey:@"CFBundleShortVersionString"];

    [muParam setObject:currentVersionforKey:@"version"];

    

    NSString *jsonString =nil;

    NSError *error;

    NSData *jsonData = [NSJSONSerializationdataWithJSONObject:muParam

                                                      options:NSJSONWritingPrettyPrinted// Pass 0 if you don't care about the readability of the generated string

                                                         error:&error];

    if (!jsonData) {

        NSLog(@"Got an error: %@", error);

    } else {

        jsonString = [[NSStringalloc] initWithData:jsonDataencoding:NSUTF8StringEncoding];

    }

    return jsonString;

}



+ (void)getRequest:(NSString *)url params:(NSDictionary *)params isEncryption:(BOOL) flag success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {

    

    NSString *absoluteURL = [selfgenerateGETAbsoluteURL:urlparams:params];

    NSString *key = [MyShareClassycjnetworking_md5:absoluteURL];

    

    NSLog(@"%@",key);

    if (![selfverifyReuqest:key]) {

        return;

    }

    

    AFHTTPSessionManager *manager = [selfgetRequstManager];

    

    NSDictionary *paramAESDic = flag?@{@"guess":[DES3UtilAES128Encrypt:[selfparamAES128String:params]]}:params;

    

    [manager GET:urlparameters:paramAESDic progress:^(NSProgress *_Nonnull downloadProgress) {


    } success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

        

        

        [dictionaryForConnectionTagremoveObjectForKey:key];

        successHandler(responseObject);


    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        

        CJLog(@"------请求失败-------%@",error);

        [((JMBaseVC *)[MyShareClassgetInstance].mainViewController)hideLoading];

        if (error.code == -1009) {

            [DialogtoastCenter:error.localizedDescription];

        } else {

            [[DialogInstance] hideProgress];

        }

        

        [dictionaryForConnectionTagremoveObjectForKey:key];

        failureHandler(error);


    }];

}



+ (void)postRequest:(NSString *)url params:(NSDictionary *)params isEncryption:(BOOL) flag success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {

    

    NSString *absoluteURL = [selfgenerateGETAbsoluteURL:urlparams:params];

    NSString *key = [MyShareClassycjnetworking_md5:absoluteURL];

    

    if (![selfverifyReuqest:key]) {

        return;

    }

    

    AFHTTPSessionManager *manager = [selfgetRequstManager];

    

    NSDictionary *paramAESDic = flag?@{@"guess":[DES3UtilAES128Encrypt:[selfparamAES128String:params]]}:params;

    

    [manager POST:urlparameters:paramAESDic progress:^(NSProgress *_Nonnull downloadProgress) {

        

    } success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

        [dictionaryForConnectionTagremoveObjectForKey:key];

        successHandler(responseObject);

    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        CJLog(@"------请求失败-------%@",error);

        [((JMBaseVC *)[MyShareClassgetInstance].mainViewController)hideLoading];

        if (error.code == -1009) {

            [DialogtoastCenter:error.localizedDescription];

        } else {

            [[DialogInstance] hideProgress];

        }

        

        

        [dictionaryForConnectionTagremoveObjectForKey:key];

        failureHandler(error);

    }];

   

}


+ (void)putRequest:(NSString *)url params:(NSDictionary *)params success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {

    

    AFHTTPSessionManager *manager = [selfgetRequstManager];


    [manager PUT:urlparameters:params success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

        successHandler(responseObject);

    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        CJLog(@"------请求失败-------%@",error);

        

        failureHandler(error);

    }];


}


+ (void)deleteRequest:(NSString *)url params:(NSDictionary *)params success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {

    

    

    AFHTTPSessionManager *manager = [selfgetRequstManager];

    [manager DELETE:urlparameters:params success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

        successHandler(responseObject);

    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        CJLog(@"------请求失败-------%@",error);

        if (error.code == -1009) {

            [DialogtoastCenter:error.localizedDescription];

            [((JMBaseVC *)[MyShareClassgetInstance].mainViewController).refreshTB.mj_headerendRefreshing];

        }

        

        failureHandler(error);

    }];

    

}


/**

 下载文件,监听下载进度

 */

+ (void)downloadRequest:(NSString *)url successAndProgress:(progressBlock)progressHandler complete:(responseBlock)completionHandler {

    

    if (![selfcheckNetworkStatus]) {

        progressHandler(0,0, 0);

        completionHandler(nil,nil);

        return;

    }

    

    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfigurationdefaultSessionConfiguration];

    

    AFURLSessionManager *manager = [[AFURLSessionManageralloc] initWithSessionConfiguration:sessionConfiguration];

    

    NSURLRequest *request = [NSURLRequestrequestWithURL:[NSURLURLWithString:url]];

    

    

    NSURLSessionDownloadTask *downloadTask = [managerdownloadTaskWithRequest:requestprogress:^(NSProgress *_Nonnull downloadProgress) {

    

    } destination:^NSURL *_Nonnull(NSURL *_Nonnull targetPath, NSURLResponse * _Nonnull response) {

        NSURL *documentUrl = [[NSFileManagerdefaultManager] URLForDirectory :NSDocumentDirectoryinDomain:NSUserDomainMaskappropriateForURL:nilcreate:NOerror:nil];

        

        return [documentUrlURLByAppendingPathComponent:[responsesuggestedFilename]];

    } completionHandler:^(NSURLResponse *_Nonnull response, NSURL * _Nonnull filePath,NSError * _Nonnull error) {

        if (error) {

            CJLog(@"------下载失败-------%@",error);

        }

        completionHandler(response, error);

    }];

    

    [manager setDownloadTaskDidWriteDataBlock:^(NSURLSession *_Nonnull session, NSURLSessionDownloadTask * _Nonnull downloadTask, int64_t bytesWritten,int64_t totalBytesWritten,int64_t totalBytesExpectedToWrite) {

        

        progressHandler(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);

        

    }];

    [downloadTask resume];

}




/**

 *  发送一个POST请求

 *  @param fileConfig 文件相关参数模型

 *  @param success 请求成功后的回调

 *  @param failure 请求失败后的回调

 *  无上传进度监听

 */

+ (void)updateRequest:(NSString *)url params:(NSDictionary *)params fileConfig:(CJFileConfig *)fileConfig success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {

    

    

    AFHTTPSessionManager *manager = [selfgetRequstManager];

    [manager POST:urlparameters:params constructingBodyWithBlock:^(id<AFMultipartFormData_Nonnull formData) {

        [formData appendPartWithFileData:fileConfig.fileDataname:fileConfig.namefileName:fileConfig.fileNamemimeType:fileConfig.mimeType];

    } progress:^(NSProgress *_Nonnull downloadProgress) {

    

    } success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

        successHandler(responseObject);

    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        CJLog(@"------上传失败-------%@",error);

        failureHandler(error);

    }];

    

}



/**

 上传文件,监听上传进度

 */

+ (void)updateRequest:(NSString *)url params:(NSDictionary *)params fileConfig:(CJFileConfig *)fileConfig successAndProgress:(progressBlock)progressHandler complete:(responseBlock)completionHandler {

    

    

    //获取上传进度

    AFHTTPSessionManager *manager = [selfgetRequstManager];

    

   NSURLSessionDataTask  *session = [managerPOST:url parameters:paramsconstructingBodyWithBlock:^(id<AFMultipartFormData_Nonnull formData) {

        

        // 上传图片,以文件流的格式

        [formData appendPartWithFileData:fileConfig.fileDataname:fileConfig.namefileName:fileConfig.fileNamemimeType:fileConfig.mimeType];

    } progress:^(NSProgress *_Nonnull uploadProgress) {

        

        progressHandler(uploadProgress.completedUnitCount, uploadProgress.totalUnitCount, uploadProgress.totalUnitCount - uploadProgress.completedUnitCount);

        

    } success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

         completionHandler(responseObject, nil);

    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        completionHandler(nil, error);

        if (error) {

            CJLog(@"------上传失败-------%@",error);

        }

    }];

    

    [session resume];


}


+ (AFHTTPSessionManager *)getRequstManager {

    

    // 开启转圈圈

    [AFNetworkActivityIndicatorManagersharedManager].enabled =YES;

    

    AFHTTPSessionManager *manager =nil;

    

    manager = [AFHTTPSessionManagermanager];

    

    manager.responseSerializer.acceptableContentTypes =nil;//[NSSet setWithObject:@"text/ plain"];

    manager.securityPolicy = [AFSecurityPolicydefaultPolicy];

    manager.securityPolicy.allowInvalidCertificates =YES;//  https   manager.securityPolicy.validatesDomainName = NO;//

    manager.requestSerializer.stringEncoding =NSUTF8StringEncoding;

    

    manager.responseSerializer.acceptableContentTypes = [NSSetsetWithArray:@[@"application/json",

                                                                                 @"text/html",

                                                                                 @"text/json",

                                                                                 @"text/plain",

                                                                                 @"text/javascript",

                                                                                 @"text/xml",

                                                                                 @"image/*"]];

    

    // 设置允许同时最大并发数量,过大容易出问题

    manager.operationQueue.maxConcurrentOperationCount =3;

    manager.requestSerializer.timeoutInterval =30;

    return manager;

}



#pragma mark-Private


/**

 url编码

 */

+ (NSString *)encodeUrl:(NSString *)url {

    return [selfcj_URLEncode:url];

}


+ (NSString *)cj_URLEncode:(NSString *)url {

    NSString *newString =

    CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,

                                                              (CFStringRef)url,

                                                              NULL,

                                                              CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"),CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)));

    if (newString) {

        return newString;

    }

    

    return url;

}



/**

 监控网络状态

 */

+ (BOOL)checkNetworkStatus {

    

    AFNetworkReachabilityManager *reachabilityManager = [AFNetworkReachabilityManagersharedManager];

    [reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

        if (status ==AFNetworkReachabilityStatusUnknown) {

            isNetworkUse =YES;

        } elseif (status ==AFNetworkReachabilityStatusReachableViaWiFi){

            isNetworkUse =YES;

        } elseif (status ==AFNetworkReachabilityStatusReachableViaWWAN){

            isNetworkUse =YES;

        } elseif (status ==AFNetworkReachabilityStatusNotReachable){

            // 网络异常操作

            isNetworkUse =NO;

            CJLog(@"网络异常,请检查网络是否可用!");

        }

    }];

    [reachabilityManager startMonitoring];

    returnisNetworkUse;

}


// 仅对一级字典结构起作用

+ (NSString *)generateGETAbsoluteURL:(NSString *)url params:(id)params {

    if (params ==nil || ![params isKindOfClass:[NSDictionaryclass]] || [params count] == 0) {

        return url;

    }

    

    NSString *queries =@"";

    for (NSString *keyin params) {

        id value = [paramsobjectForKey:key];

        

        if ([valueisKindOfClass:[NSDictionaryclass]]) {

            continue;

        } elseif ([value isKindOfClass:[NSArrayclass]]) {

            continue;

        } elseif ([value isKindOfClass:[NSSetclass]]) {

            continue;

        } else {

            queries = [NSStringstringWithFormat:@"%@%@=%@&",

                       (queries.length ==0 ? @"&" : queries),

                       key,

                       value];

        }

    }

    

    if (queries.length >1) {

        queries = [queries substringToIndex:queries.length -1];

    }

    

    if (([urlhasPrefix:@"http://"] || [urlhasPrefix:@"https://"]) && queries.length >1) {

        if ([urlrangeOfString:@"?"].location !=NSNotFound

            || [url rangeOfString:@"#"].location !=NSNotFound) {

            url = [NSStringstringWithFormat:@"%@%@", url, queries];

        } else {

            queries = [queries substringFromIndex:1];

            url = [NSStringstringWithFormat:@"%@?%@", url, queries];

        }

    }

    

    return url.length ==0 ? queries : url;

}


/**

 *  该方法用于判断进入的网络连接请求是否是第一次,或者是否是重复请求(上一次请求还没结束,相同的请求又开始了)

 *

 *  @param verifyDictionary 外部传来的参数

 *

 *  @return 是否同意发起请求

 */

+(BOOL)verifyReuqest:(NSString*)verifyString{

    /**

     *  第一次请求经过数据中心类时,做一下标记,然后将请求交给AFHTTPRequestOperation。然后有返回数据,则将该标记清空。这样,在该过程中,如果有重复请求,在存在tag标记时,不会将请求交给AFHTTPRequestOperation

     */

    /**

     *  这个标识存在于传来的NSDictionary中,这样就可以确保每个类中每个请求传来的标识都不一样。

     使用NSMutableDictionary储存该标识。key - value对应 ‘key’储存的是每个请求的标识,‘value’储存的是请求的状态。默认是NO,发起请求时改变为YES,收到返回数据的时候还原为NO。如果有重复请求进入,则判断valueYES,阻止该次请求。

     */

    if ([dictionaryForConnectionTagobjectForKey:verifyString]) {

        /**

         *  如果NSMutableDictionary中存在该标识,则去查看对应value的状态

         */

        if ([[dictionaryForConnectionTagobjectForKey:verifyString]integerValue]== NO) {

            

            returnNO;

        } else {

            

            returnYES;

        }

        

        

    } else{

        /**

         *  如果没有该标识,则说明该请求是第一次,将其加入字典中,然后发起请求,百度统计

         */

        [dictionaryForConnectionTagsetObject:[NSNumbernumberWithBool:0]forKey:verifyString];

        

        returnYES;

    }

}


@end


/**

 *  用来封装上传参数

 */

@implementation CJFileConfig


+ (instancetype)fileConfigWithfileData:(NSData *)fileData name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType {

    return [[selfalloc] initWithfileData:fileDataname:name fileName:fileNamemimeType:mimeType];

}


- (instancetype)initWithfileData:(NSData *)fileData name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType {

    if (self = [superinit]) {

        

        _fileData = fileData;

        _name = name;

        _fileName = fileName;

        _mimeType = mimeType;

    }

    returnself;

}


@end




.m里面

//

//  CJNetworkRequest.m

//

//

//  Created by YouChangJiang on 16/4/19.

//  Copyright © 2016 YouChangJiang. All rights reserved.

//


/*

 * CJNetworkApi的一些功能和说明:

 

 1. 使用CJNetworkRequest做一些GETPOSTPUTDELETE请求,与业务逻辑对接部分直接以数组或者字典的形式返回。

 2. 网络下载、上传文件,以block的形式返回实时的下载、上传进度,上传文件参数通过模型CJFileConfig去存取。

 3. 通过继承于CJDataService来将一些数据处理,模型转化封装起来,于业务逻辑对接返回的是对应的模型,减少Controllor处理数据处理逻辑的压力。

 4. 自定义一些回调的block

 */


#import "CJNetworkRequest.h"



static BOOL isNetworkUse;


static  NSMutableDictionary *dictionaryForConnectionTag;


@implementation CJNetworkRequest


+(void)initialize {

    dictionaryForConnectionTag = [[NSMutableDictionaryalloc]initWithCapacity:20];

}


+(NSString *) paramAES128String:(NSDictionary *) param {

    

    NSMutableDictionary *muParam = [NSMutableDictionarydictionaryWithDictionary:param];

    [muParam setObject:[NSStringstringWithFormat:@"%ld",(long)[[NSDatedate] timeIntervalSince1970]]forKey:@"requesttime"];

    NSDictionary *localDic =[[NSBundlemainBundle] infoDictionary];

    NSString *currentVersion = [localDicobjectForKey:@"CFBundleShortVersionString"];

    [muParam setObject:currentVersionforKey:@"version"];

    

    NSString *jsonString =nil;

    NSError *error;

    NSData *jsonData = [NSJSONSerializationdataWithJSONObject:muParam

                                                      options:NSJSONWritingPrettyPrinted// Pass 0 if you don't care about the readability of the generated string

                                                         error:&error];

    if (!jsonData) {

        NSLog(@"Got an error: %@", error);

    } else {

        jsonString = [[NSStringalloc] initWithData:jsonDataencoding:NSUTF8StringEncoding];

    }

    return jsonString;

}



+ (void)getRequest:(NSString *)url params:(NSDictionary *)params isEncryption:(BOOL) flag success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {

    

    NSString *absoluteURL = [selfgenerateGETAbsoluteURL:urlparams:params];

    NSString *key = [MyShareClassycjnetworking_md5:absoluteURL];

    

    NSLog(@"%@",key);

    if (![selfverifyReuqest:key]) {

        return;

    }

    

    AFHTTPSessionManager *manager = [selfgetRequstManager];

    

    NSDictionary *paramAESDic = flag?@{@"guess":[DES3UtilAES128Encrypt:[selfparamAES128String:params]]}:params;

    

    [manager GET:urlparameters:paramAESDic progress:^(NSProgress *_Nonnull downloadProgress) {


    } success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

        

        

        [dictionaryForConnectionTagremoveObjectForKey:key];

        successHandler(responseObject);


    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        

        CJLog(@"------请求失败-------%@",error);

        [((JMBaseVC *)[MyShareClassgetInstance].mainViewController)hideLoading];

        if (error.code == -1009) {

            [DialogtoastCenter:error.localizedDescription];

        } else {

            [[DialogInstance] hideProgress];

        }

        

        [dictionaryForConnectionTagremoveObjectForKey:key];

        failureHandler(error);


    }];

}



+ (void)postRequest:(NSString *)url params:(NSDictionary *)params isEncryption:(BOOL) flag success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {

    

    NSString *absoluteURL = [selfgenerateGETAbsoluteURL:urlparams:params];

    NSString *key = [MyShareClassycjnetworking_md5:absoluteURL];

    

    if (![selfverifyReuqest:key]) {

        return;

    }

    

    AFHTTPSessionManager *manager = [selfgetRequstManager];

    

    NSDictionary *paramAESDic = flag?@{@"guess":[DES3UtilAES128Encrypt:[selfparamAES128String:params]]}:params;

    

    [manager POST:urlparameters:paramAESDic progress:^(NSProgress *_Nonnull downloadProgress) {

        

    } success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

        [dictionaryForConnectionTagremoveObjectForKey:key];

        successHandler(responseObject);

    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        CJLog(@"------请求失败-------%@",error);

        [((JMBaseVC *)[MyShareClassgetInstance].mainViewController)hideLoading];

        if (error.code == -1009) {

            [DialogtoastCenter:error.localizedDescription];

        } else {

            [[DialogInstance] hideProgress];

        }

        

        

        [dictionaryForConnectionTagremoveObjectForKey:key];

        failureHandler(error);

    }];

   

}


+ (void)putRequest:(NSString *)url params:(NSDictionary *)params success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {

    

    AFHTTPSessionManager *manager = [selfgetRequstManager];


    [manager PUT:urlparameters:params success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

        successHandler(responseObject);

    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        CJLog(@"------请求失败-------%@",error);

        

        failureHandler(error);

    }];


}


+ (void)deleteRequest:(NSString *)url params:(NSDictionary *)params success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {

    

    

    AFHTTPSessionManager *manager = [selfgetRequstManager];

    [manager DELETE:urlparameters:params success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

        successHandler(responseObject);

    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        CJLog(@"------请求失败-------%@",error);

        if (error.code == -1009) {

            [DialogtoastCenter:error.localizedDescription];

            [((JMBaseVC *)[MyShareClassgetInstance].mainViewController).refreshTB.mj_headerendRefreshing];

        }

        

        failureHandler(error);

    }];

    

}


/**

 下载文件,监听下载进度

 */

+ (void)downloadRequest:(NSString *)url successAndProgress:(progressBlock)progressHandler complete:(responseBlock)completionHandler {

    

    if (![selfcheckNetworkStatus]) {

        progressHandler(0,0, 0);

        completionHandler(nil,nil);

        return;

    }

    

    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfigurationdefaultSessionConfiguration];

    

    AFURLSessionManager *manager = [[AFURLSessionManageralloc] initWithSessionConfiguration:sessionConfiguration];

    

    NSURLRequest *request = [NSURLRequestrequestWithURL:[NSURLURLWithString:url]];

    

    

    NSURLSessionDownloadTask *downloadTask = [managerdownloadTaskWithRequest:requestprogress:^(NSProgress *_Nonnull downloadProgress) {

    

    } destination:^NSURL *_Nonnull(NSURL *_Nonnull targetPath, NSURLResponse * _Nonnull response) {

        NSURL *documentUrl = [[NSFileManagerdefaultManager] URLForDirectory :NSDocumentDirectoryinDomain:NSUserDomainMaskappropriateForURL:nilcreate:NOerror:nil];

        

        return [documentUrlURLByAppendingPathComponent:[responsesuggestedFilename]];

    } completionHandler:^(NSURLResponse *_Nonnull response, NSURL * _Nonnull filePath,NSError * _Nonnull error) {

        if (error) {

            CJLog(@"------下载失败-------%@",error);

        }

        completionHandler(response, error);

    }];

    

    [manager setDownloadTaskDidWriteDataBlock:^(NSURLSession *_Nonnull session, NSURLSessionDownloadTask * _Nonnull downloadTask, int64_t bytesWritten,int64_t totalBytesWritten,int64_t totalBytesExpectedToWrite) {

        

        progressHandler(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);

        

    }];

    [downloadTask resume];

}




/**

 *  发送一个POST请求

 *  @param fileConfig 文件相关参数模型

 *  @param success 请求成功后的回调

 *  @param failure 请求失败后的回调

 *  无上传进度监听

 */

+ (void)updateRequest:(NSString *)url params:(NSDictionary *)params fileConfig:(CJFileConfig *)fileConfig success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {

    

    

    AFHTTPSessionManager *manager = [selfgetRequstManager];

    [manager POST:urlparameters:params constructingBodyWithBlock:^(id<AFMultipartFormData_Nonnull formData) {

        [formData appendPartWithFileData:fileConfig.fileDataname:fileConfig.namefileName:fileConfig.fileNamemimeType:fileConfig.mimeType];

    } progress:^(NSProgress *_Nonnull downloadProgress) {

    

    } success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

        successHandler(responseObject);

    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        CJLog(@"------上传失败-------%@",error);

        failureHandler(error);

    }];

    

}



/**

 上传文件,监听上传进度

 */

+ (void)updateRequest:(NSString *)url params:(NSDictionary *)params fileConfig:(CJFileConfig *)fileConfig successAndProgress:(progressBlock)progressHandler complete:(responseBlock)completionHandler {

    

    

    //获取上传进度

    AFHTTPSessionManager *manager = [selfgetRequstManager];

    

   NSURLSessionDataTask  *session = [managerPOST:url parameters:paramsconstructingBodyWithBlock:^(id<AFMultipartFormData_Nonnull formData) {

        

        // 上传图片,以文件流的格式

        [formData appendPartWithFileData:fileConfig.fileDataname:fileConfig.namefileName:fileConfig.fileNamemimeType:fileConfig.mimeType];

    } progress:^(NSProgress *_Nonnull uploadProgress) {

        

        progressHandler(uploadProgress.completedUnitCount, uploadProgress.totalUnitCount, uploadProgress.totalUnitCount - uploadProgress.completedUnitCount);

        

    } success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

         completionHandler(responseObject, nil);

    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        completionHandler(nil, error);

        if (error) {

            CJLog(@"------上传失败-------%@",error);

        }

    }];

    

    [session resume];


}


+ (AFHTTPSessionManager *)getRequstManager {

    

    // 开启转圈圈

    [AFNetworkActivityIndicatorManagersharedManager].enabled =YES;

    

    AFHTTPSessionManager *manager =nil;

    

    manager = [AFHTTPSessionManagermanager];

    

    manager.responseSerializer.acceptableContentTypes =nil;//[NSSet setWithObject:@"text/ plain"];

    manager.securityPolicy = [AFSecurityPolicydefaultPolicy];

    manager.securityPolicy.allowInvalidCertificates =YES;//  https   manager.securityPolicy.validatesDomainName = NO;//

    manager.requestSerializer.stringEncoding =NSUTF8StringEncoding;

    

    manager.responseSerializer.acceptableContentTypes = [NSSetsetWithArray:@[@"application/json",

                                                                                 @"text/html",

                                                                                 @"text/json",

                                                                                 @"text/plain",

                                                                                 @"text/javascript",

                                                                                 @"text/xml",

                                                                                 @"image/*"]];

    

    // 设置允许同时最大并发数量,过大容易出问题

    manager.operationQueue.maxConcurrentOperationCount =3;

    manager.requestSerializer.timeoutInterval =30;

    return manager;

}



#pragma mark-Private


/**

 url编码

 */

+ (NSString *)encodeUrl:(NSString *)url {

    return [selfcj_URLEncode:url];

}


+ (NSString *)cj_URLEncode:(NSString *)url {

    NSString *newString =

    CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,

                                                              (CFStringRef)url,

                                                              NULL,

                                                              CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"),CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)));

    if (newString) {

        return newString;

    }

    

    return url;

}



/**

 监控网络状态

 */

+ (BOOL)checkNetworkStatus {

    

    AFNetworkReachabilityManager *reachabilityManager = [AFNetworkReachabilityManagersharedManager];

    [reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

        if (status ==AFNetworkReachabilityStatusUnknown) {

            isNetworkUse =YES;

        } elseif (status ==AFNetworkReachabilityStatusReachableViaWiFi){

            isNetworkUse =YES;

        } elseif (status ==AFNetworkReachabilityStatusReachableViaWWAN){

            isNetworkUse =YES;

        } elseif (status ==AFNetworkReachabilityStatusNotReachable){

            // 网络异常操作

            isNetworkUse =NO;

            CJLog(@"网络异常,请检查网络是否可用!");

        }

    }];

    [reachabilityManager startMonitoring];

    returnisNetworkUse;

}


// 仅对一级字典结构起作用

+ (NSString *)generateGETAbsoluteURL:(NSString *)url params:(id)params {

    if (params ==nil || ![params isKindOfClass:[NSDictionaryclass]] || [params count] == 0) {

        return url;

    }

    

    NSString *queries =@"";

    for (NSString *keyin params) {

        id value = [paramsobjectForKey:key];

        

        if ([valueisKindOfClass:[NSDictionaryclass]]) {

            continue;

        } elseif ([value isKindOfClass:[NSArrayclass]]) {

            continue;

        } elseif ([value isKindOfClass:[NSSetclass]]) {

            continue;

        } else {

            queries = [NSStringstringWithFormat:@"%@%@=%@&",

                       (queries.length ==0 ? @"&" : queries),

                       key,

                       value];

        }

    }

    

    if (queries.length >1) {

        queries = [queries substringToIndex:queries.length -1];

    }

    

    if (([urlhasPrefix:@"http://"] || [urlhasPrefix:@"https://"]) && queries.length >1) {

        if ([urlrangeOfString:@"?"].location !=NSNotFound

            || [url rangeOfString:@"#"].location !=NSNotFound) {

            url = [NSStringstringWithFormat:@"%@%@", url, queries];

        } else {

            queries = [queries substringFromIndex:1];

            url = [NSStringstringWithFormat:@"%@?%@", url, queries];

        }

    }

    

    return url.length ==0 ? queries : url;

}


/**

 *  该方法用于判断进入的网络连接请求是否是第一次,或者是否是重复请求(上一次请求还没结束,相同的请求又开始了)

 *

 *  @param verifyDictionary 外部传来的参数

 *

 *  @return 是否同意发起请求

 */

+(BOOL)verifyReuqest:(NSString*)verifyString{

    /**

     *  第一次请求经过数据中心类时,做一下标记,然后将请求交给AFHTTPRequestOperation。然后有返回数据,则将该标记清空。这样,在该过程中,如果有重复请求,在存在tag标记时,不会将请求交给AFHTTPRequestOperation

     */

    /**

     *  这个标识存在于传来的NSDictionary中,这样就可以确保每个类中每个请求传来的标识都不一样。

     使用NSMutableDictionary储存该标识。key - value对应 ‘key’储存的是每个请求的标识,‘value’储存的是请求的状态。默认是NO,发起请求时改变为YES,收到返回数据的时候还原为NO。如果有重复请求进入,则判断valueYES,阻止该次请求。

     */

    if ([dictionaryForConnectionTagobjectForKey:verifyString]) {

        /**

         *  如果NSMutableDictionary中存在该标识,则去查看对应value的状态

         */

        if ([[dictionaryForConnectionTagobjectForKey:verifyString]integerValue]== NO) {

            

            returnNO;

        } else {

            

            returnYES;

        }

        

        

    } else{

        /**

         *  如果没有该标识,则说明该请求是第一次,将其加入字典中,然后发起请求,百度统计

         */

        [dictionaryForConnectionTagsetObject:[NSNumbernumberWithBool:0]forKey:verifyString];

        

        returnYES;

    }

}


@end


/**

 *  用来封装上传参数

 */

@implementation CJFileConfig


+ (instancetype)fileConfigWithfileData:(NSData *)fileData name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType {

    return [[selfalloc] initWithfileData:fileDataname:name fileName:fileNamemimeType:mimeType];

}


- (instancetype)initWithfileData:(NSData *)fileData name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType {

    if (self = [superinit]) {

        

        _fileData = fileData;

        _name = name;

        _fileName = fileName;

        _mimeType = mimeType;

    }

    returnself;

}


@end




0 0