// // NetworkingTool.m // yunbaolive // // Created by 阴天遮住侧脸 on 2020/6/11. // Copyright © 2020 cat. All rights reserved. // https://blog.csdn.net/chase20150628/article/details/91575154 #import "NetworkingTool.h" @implementation NetworkingTool #pragma mark - POST + (nullable NSURLSessionDataTask *)BasePOST_Host:(NSString *)host hostPath:(NSString *)hostPath parameters:(nullable id)paramDic headers:(nullable NSDictionary *)headerDic progress:(nullable void (^)(NSProgress *progress))progressBlock success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))successBlock failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failureBlock { NSString *url = [host stringByAppendingFormat:@"/%@", hostPath]; return [self BasePOST:url parameters:paramDic headers:headerDic progress:progressBlock success:successBlock failure:failureBlock]; } /// POST请求(创建并运行一个带有 "POST "请求的 "NSURLSessionDataTask"。) /// @param URLString 完整URLString /// @param paramDic 参数 /// @param headerDic 附加到这个请求的默认头部的头部 /// @param progressBlock 进度回调 /// @param successBlock 成功回调 /// @param failureBlock 失败回调 + (nullable NSURLSessionDataTask *)BasePOST:(NSString *)URLString parameters:(nullable id)paramDic headers:(nullable NSDictionary *)headerDic progress:(nullable void (^)(NSProgress *progress))progressBlock success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))successBlock failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failureBlock { AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; return [sessionManager POST:URLString parameters:paramDic headers:headerDic progress:progressBlock success:successBlock failure:failureBlock]; } #pragma mark - GET + (nullable NSURLSessionDataTask *)BaseGet_Host:(NSString *)host hostPath:(NSString *)hostPath parameters:(NSDictionary *)paramDic headers:(nullable NSDictionary *)headerDic progress:(nullable void (^)(NSProgress *progress))progressBlock success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))successBlock failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failureBlock { NSString *url = [host stringByAppendingFormat:@"/%@", hostPath]; return [self BaseGet:url parameters:paramDic headers:headerDic progress:progressBlock success:successBlock failure:failureBlock]; } /// GET请求 /// @param URLString URLString /// @param paramDic 参数 /// @param headerDic 附加到这个请求的默认头部的头部 /// @param downloadProgress 进度回调 /// @param successBlock 成功回调 /// @param failureBlock 失败回调 + (nullable NSURLSessionDataTask *)BaseGet:(NSString *)URLString parameters:(NSDictionary *)paramDic headers:(nullable NSDictionary *)headerDic progress:(nullable void (^)(NSProgress *progress))progressBlock success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))successBlock failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failureBlock { AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; return [sessionManager GET:URLString parameters:paramDic headers:headerDic progress:progressBlock success:successBlock failure:failureBlock]; } #pragma mark - 下载 + (nullable NSURLSessionDownloadTask *)downloadFileWithURL:(NSString *)urlString saveFilePath:(NSString *)savePath progress:(void (^)(NSProgress *downloadProgress))downloadProgressBlock completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler { AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; NSURLRequest *requset = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; //返回一个下载任务对象 NSURLSessionDownloadTask *downTask = [sessionManager downloadTaskWithRequest:requset progress:^(NSProgress * _Nonnull downloadProgress) { // completedUnitCount 下载的大小 // totalUnitCount文件的总大小 NSLog(@"%lld----%lld",downloadProgress.completedUnitCount,downloadProgress.totalUnitCount); } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { NSString *fullPath =[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject stringByAppendingString:response.suggestedFilename]; NSLog(@"targetPath-:%@---fullPath:-%@",targetPath,fullPath); //这个block 需要返回一个目标 地址 存储下载的文件 // return [NSURL fileURLWithPath:fullPath]; return [NSURL fileURLWithPath:savePath]; } completionHandler:completionHandler]; //启动下载任务--开始下载 [downTask resume]; return downTask; } #pragma mark - 上传 /// upload上传文件 /// @param filePath 文件路径 /// @param data 文件二进制数据 /// @param uploadProgress 上传进度回调 /// @param completionHandler 上传完成回调 + (nullable NSURLSessionUploadTask *)upload:(NSString *)filePath fileData:(NSData *)data progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler { AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; NSURLRequest *requset = [NSURLRequest requestWithURL:[NSURL URLWithString:filePath]]; NSURLSessionUploadTask *uploadTask = [sessionManager uploadTaskWithRequest:requset fromData:data progress:uploadProgress completionHandler:completionHandler]; /* NSURLRequest *requset = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost"]]; UIImage *image = [UIImage imageNamed:@"pic.jpg"]; NSData *imageData = UIImageJPEGRepresentation(image, 0.8); NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithRequest:requset fromData:imageData progress:^(NSProgress * _Nonnull uploadProgress) { NSLog(@"%lld",uploadProgress.completedUnitCount); } completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { NSLog(@"error:%@",error.description); NSLog(@"%@",responseObject); }]; */ [uploadTask resume]; return uploadTask; } /// 上传数据 - POST请求 - Form表单提交数据(创建并运行一个包含多部分 "POST "请求的 "NSURLSessionDataTask"。) /// @param URLString URLString /// @param paramDic 参数 /// @param headerDic 附加到这个请求的默认头部的头部 /// @param block 一个接受单个参数并将数据附加到HTTP body的块。block参数是一个采用`AFMultipartFormData`协议的对象。 /// @param uploadProgress 上传进度回调 /// @param successBlock 成功回调 ---> id /// @param failureBlock 失败回调 + (nullable NSURLSessionDataTask *)upload_BasePOST:(NSString *)URLString parameters:(nullable id)paramDic headers:(nullable NSDictionary *)headerDic constructingBodyWithBlock:(nullable void (^)(id formData))block progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))successBlock failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failureBlock { AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; return [sessionManager POST:URLString parameters:paramDic headers:headerDic constructingBodyWithBlock:block progress:uploadProgress success:successBlock failure:failureBlock]; /** constructingBodyWithBlock中: //上传数据 方式1 UIImage *image = [UIImage imageNamed:@"pic.jpg"]; NSData *imageData = UIImageJPEGRepresentation(image, 0.7); //要上传的数据 和 上传数据服务器对应的名称 [formData appendPartWithFormData:imageData name:@"file"]; 方式2 FileData要上传的数据 name 服务器规定 fileName 上传文件的名称 mimeType类型 [formData appendPartWithFileData:imageData name:@"file" fileName:@"100.jpg" mimeType:@"image/jpg"]; //本地文件的路径 方式3 NSURL *url = [NSURL fileURLWithPath:@"路径"]; [formData appendPartWithFileURL:url name:@"file" error:nil]; */ } #pragma mark - 网络状态全局监听 /// 网络状态全局监听, 内部会发送状态改变通知! + (void)setNetStatusObserver { AFNetworkReachabilityManager *netManager = [AFNetworkReachabilityManager sharedManager]; /** AFNetworkReachabilityStatusUnknown = -1, AFNetworkReachabilityStatusNotReachable = 0, AFNetworkReachabilityStatusReachableViaWWAN = 1, AFNetworkReachabilityStatusReachableViaWiFi = 2, */ [netManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status){ switch (status) { case AFNetworkReachabilityStatusUnknown: //未知 [[NSNotificationCenter defaultCenter] postNotificationName:NetworkStatusChangKey_Unknown object:nil]; break; case AFNetworkReachabilityStatusNotReachable: //没有网络 [[NSNotificationCenter defaultCenter] postNotificationName:NetworkStatusChangKey_NotReachable object:nil]; break; case AFNetworkReachabilityStatusReachableViaWWAN: //蜂窝 [[NSNotificationCenter defaultCenter] postNotificationName:NetworkStatusChangKey_ReachableViaWWAN object:nil]; break; case AFNetworkReachabilityStatusReachableViaWiFi: //WiFi [[NSNotificationCenter defaultCenter] postNotificationName:NetworkStatusChangKey_ReachableViaWiFi object:nil]; break; } }]; [netManager startMonitoring]; //开始监听 } #pragma mark - Set_Serializer ///设置-请求格式 + (void)setRequestSerializer:(CYHRequestSerializer)requestSerializer { AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; sessionManager.requestSerializer = requestSerializer == CYHRequestSerializerHTTP ? [AFHTTPRequestSerializer serializer] : [AFJSONRequestSerializer serializer]; } ///设置 - 响应格式 + (void)setResponseSerializer:(CYHResponseSerializer)responseSerializer { AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; sessionManager.responseSerializer = responseSerializer == CYHResponseSerializerHTTP ? [AFHTTPResponseSerializer serializer] : [AFJSONResponseSerializer serializer]; } #pragma mark - Set_Timeout + (void)setRequestTimeout:(NSTimeInterval)interval { [AFHTTPSessionManager manager].requestSerializer.timeoutInterval = interval; } #pragma mark - Set_SecurityPolicy安全策略 + (void)setSecurityPolicy:(AFSecurityPolicy *)securityPolicy { [AFHTTPSessionManager manager].securityPolicy = securityPolicy; } #pragma mark - 会话 + (AFHTTPSessionManager *)sessionManager { return [AFHTTPSessionManager manager]; } /* + (instancetype)shared { return [[self alloc] init]; } // 创建静态对象 防止外部访问 static NetworkingTool *_instance; + (instancetype)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (_instance == nil) { _instance = [super allocWithZone:zone]; AFHTTPSessionManager *session = [AFHTTPSessionManager manager]; // session.requestSerializer = [AFJSONRequestSerializer serializer]; _instance->_session = session; } }); return _instance; } // 为了严谨,也要重写copyWithZone 和 mutableCopyWithZone -(id)copyWithZone:(NSZone *)zone { return _instance; } -(id)mutableCopyWithZone:(NSZone *)zone { return _instance; } */ @end