// // PPNetworkHelper.h // PPNetworkHelper // // Created by AndyPang on 16/8/12. // Copyright © 2016年 AndyPang. All rights reserved. // /* ********************************************************************************* * *⭐️⭐️⭐️ 新建 PP-iOS学习交流群: 323408051 欢迎加入!!! ⭐️⭐️⭐️ * * 如果您在使用 PPNetworkHelper 的过程中出现bug或有更好的建议,还请及时以下列方式联系我,我会及 * 时修复bug,解决问题. * * Weibo : jkpang-庞 (http://weibo.com/jkpang ) * Email : jkpang@outlook.com * QQ 群 : 323408051 * GitHub: https://github.com/jkpang * Blog : https://www.jkpang.cn * * 如果 PPGetAddressBookSwift 好用,希望您能Star支持,你的 ⭐️ 是我持续更新的动力! * * version: 0.8.0 ********************************************************************************* */ #import #import #import "PPNetworkCache.h" #ifndef kIsNetwork #define kIsNetwork [PPNetworkHelper isNetwork] // 一次性判断是否有网的宏 #endif #ifndef kIsWWANNetwork #define kIsWWANNetwork [PPNetworkHelper isWWANNetwork] // 一次性判断是否为手机网络的宏 #endif #ifndef kIsWiFiNetwork #define kIsWiFiNetwork [PPNetworkHelper isWiFiNetwork] // 一次性判断是否为WiFi网络的宏 #endif typedef NS_ENUM(NSUInteger, PPNetworkStatusType) { /// 未知网络 PPNetworkStatusUnknown, /// 无网络 PPNetworkStatusNotReachable, /// 手机网络 PPNetworkStatusReachableViaWWAN, /// WIFI网络 PPNetworkStatusReachableViaWiFi }; typedef NS_ENUM(NSUInteger, PPRequestSerializer) { /// 设置请求数据为JSON格式 PPRequestSerializerJSON, /// 设置请求数据为二进制格式 PPRequestSerializerHTTP, }; typedef NS_ENUM(NSUInteger, PPResponseSerializer) { /// 设置响应数据为JSON格式 PPResponseSerializerJSON, /// 设置响应数据为二进制格式 PPResponseSerializerHTTP, }; /// 请求成功的Block typedef void(^PPHttpRequestSuccess)(id responseObject); /// 请求失败的Block typedef void(^PPHttpRequestFailed)(NSError *error); /// 缓存的Block typedef void(^PPHttpRequestCache)(id responseCache); /// 上传或者下载的进度, Progress.completedUnitCount:当前大小 - Progress.totalUnitCount:总大小 typedef void (^PPHttpProgress)(NSProgress *progress); /// 网络状态的Block typedef void(^PPNetworkStatus)(PPNetworkStatusType status); @class AFHTTPSessionManager; @interface PPNetworkHelper : NSObject /// 有网YES, 无网:NO + (BOOL)isNetwork; /// 手机网络:YES, 反之:NO + (BOOL)isWWANNetwork; /// WiFi网络:YES, 反之:NO + (BOOL)isWiFiNetwork; /// 取消所有HTTP请求 + (void)cancelAllRequest; /// 实时获取网络状态,通过Block回调实时获取(此方法可多次调用) + (void)networkStatusWithBlock:(PPNetworkStatus)networkStatus; /// 取消指定URL的HTTP请求 + (void)cancelRequestWithURL:(NSString *)URL; /// 开启日志打印 (Debug级别) + (void)openLog; /// 关闭日志打印,默认关闭 + (void)closeLog; /** * GET请求,无缓存 * * @param URL 请求地址 * @param parameters 请求参数 * @param success 请求成功的回调 * @param failure 请求失败的回调 * * @return 返回的对象可取消请求,调用cancel方法 */ + (__kindof NSURLSessionTask *)GET:(NSString *)URL parameters:(id)parameters success:(PPHttpRequestSuccess)success failure:(PPHttpRequestFailed)failure; /** * GET请求,自动缓存 * * @param URL 请求地址 * @param parameters 请求参数 * @param responseCache 缓存数据的回调 * @param success 请求成功的回调 * @param failure 请求失败的回调 * * @return 返回的对象可取消请求,调用cancel方法 */ + (__kindof NSURLSessionTask *)GET:(NSString *)URL parameters:(id)parameters responseCache:(PPHttpRequestCache)responseCache success:(PPHttpRequestSuccess)success failure:(PPHttpRequestFailed)failure; /** * POST请求,无缓存 * * @param URL 请求地址 * @param parameters 请求参数 * @param success 请求成功的回调 * @param failure 请求失败的回调 * * @return 返回的对象可取消请求,调用cancel方法 */ + (__kindof NSURLSessionTask *)POST:(NSString *)URL parameters:(id)parameters success:(PPHttpRequestSuccess)success failure:(PPHttpRequestFailed)failure; /** * POST请求,自动缓存 * * @param URL 请求地址 * @param parameters 请求参数 * @param responseCache 缓存数据的回调 * @param success 请求成功的回调 * @param failure 请求失败的回调 * * @return 返回的对象可取消请求,调用cancel方法 */ + (__kindof NSURLSessionTask *)POST:(NSString *)URL parameters:(id)parameters responseCache:(PPHttpRequestCache)responseCache success:(PPHttpRequestSuccess)success failure:(PPHttpRequestFailed)failure; /** * 上传文件 * * @param URL 请求地址 * @param parameters 请求参数 * @param name 文件对应服务器上的字段 * @param filePath 文件本地的沙盒路径 * @param progress 上传进度信息 * @param success 请求成功的回调 * @param failure 请求失败的回调 * * @return 返回的对象可取消请求,调用cancel方法 */ + (__kindof NSURLSessionTask *)uploadFileWithURL:(NSString *)URL parameters:(id)parameters name:(NSString *)name filePath:(NSString *)filePath progress:(PPHttpProgress)progress success:(PPHttpRequestSuccess)success failure:(PPHttpRequestFailed)failure; /** * 上传单/多张图片 * * @param URL 请求地址 * @param parameters 请求参数 * @param name 图片对应服务器上的字段 * @param images 图片数组 * @param fileNames 图片文件名数组, 可以为nil, 数组内的文件名默认为当前日期时间"yyyyMMddHHmmss" * @param imageScale 图片文件压缩比 范围 (0.f ~ 1.f) * @param imageType 图片文件的类型,例:png、jpg(默认类型).... * @param progress 上传进度信息 * @param success 请求成功的回调 * @param failure 请求失败的回调 * * @return 返回的对象可取消请求,调用cancel方法 */ + (__kindof NSURLSessionTask *)uploadImagesWithURL:(NSString *)URL parameters:(id)parameters name:(NSString *)name images:(NSArray *)images fileNames:(NSArray *)fileNames imageScale:(CGFloat)imageScale imageType:(NSString *)imageType progress:(PPHttpProgress)progress success:(PPHttpRequestSuccess)success failure:(PPHttpRequestFailed)failure; /** * 下载文件 * * @param URL 请求地址 * @param fileDir 文件存储目录(默认存储目录为Download) * @param progress 文件下载的进度信息 * @param success 下载成功的回调(回调参数filePath:文件的路径) * @param failure 下载失败的回调 * * @return 返回NSURLSessionDownloadTask实例,可用于暂停继续,暂停调用suspend方法,开始下载调用resume方法 */ + (__kindof NSURLSessionTask *)downloadWithURL:(NSString *)URL fileDir:(NSString *)fileDir progress:(PPHttpProgress)progress success:(void(^)(NSString *filePath))success failure:(PPHttpRequestFailed)failure; /* ************************************** 说明 ********************************************** * * 在一开始设计接口的时候就想着方法接口越少越好,越简单越好,只有GET,POST,上传,下载,监测网络状态就够了. * * 无奈的是在实际开发中,每个APP与后台服务器的数据交互都有不同的请求格式,如果要修改请求格式,就要在此封装 * 内修改,再加上此封装在支持CocoaPods后,如果使用者pod update最新PPNetworkHelper,那又要重新修改此 * 封装内的相关参数. * * 依个人经验,在项目的开发中,一般都会将网络请求部分封装 2~3 层,第2层配置好网络请求工具的在本项目中的各项 * 参数,其暴露出的方法接口只需留出请求URL与参数的入口就行,第3层就是对整个项目请求API的封装,其对外暴露出的 * 的方法接口只留出请求参数的入口.这样如果以后项目要更换网络请求库或者修改请求URL,在单个文件内完成配置就好 * 了,大大降低了项目的后期维护难度 * * 综上所述,最终还是将设置参数的接口暴露出来,如果通过CocoaPods方式使用PPNetworkHelper,在设置项目网络 * 请求参数的时候,强烈建议开发者在此基础上再封装一层,通过以下方法配置好各种参数与请求的URL,便于维护 * ************************************** 说明 ********************************************** */ #pragma mark - 设置AFHTTPSessionManager相关属性 #pragma mark 注意: 因为全局只有一个AFHTTPSessionManager实例,所以以下设置方式全局生效 /** 在开发中,如果以下的设置方式不满足项目的需求,就调用此方法获取AFHTTPSessionManager实例进行自定义设置 (注意: 调用此方法时在要导入AFNetworking.h头文件,否则可能会报找不到AFHTTPSessionManager的❌) @param sessionManager AFHTTPSessionManager的实例 */ + (void)setAFHTTPSessionManagerProperty:(void(^)(AFHTTPSessionManager *sessionManager))sessionManager; /** * 设置网络请求参数的格式:默认为二进制格式 * * @param requestSerializer PPRequestSerializerJSON(JSON格式),PPRequestSerializerHTTP(二进制格式), */ + (void)setRequestSerializer:(PPRequestSerializer)requestSerializer; /** * 设置服务器响应数据格式:默认为JSON格式 * * @param responseSerializer PPResponseSerializerJSON(JSON格式),PPResponseSerializerHTTP(二进制格式) */ + (void)setResponseSerializer:(PPResponseSerializer)responseSerializer; /** * 设置请求超时时间:默认为30S * * @param time 时长 */ + (void)setRequestTimeoutInterval:(NSTimeInterval)time; /// 设置请求头 + (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field; /** * 是否打开网络状态转圈菊花:默认打开 * * @param open YES(打开), NO(关闭) */ + (void)openNetworkActivityIndicator:(BOOL)open; /** 配置自建证书的Https请求, 参考链接: http://blog.csdn.net/syg90178aw/article/details/52839103 @param cerPath 自建Https证书的路径 @param validatesDomainName 是否需要验证域名,默认为YES. 如果证书的域名与请求的域名不一致,需设置为NO; 即服务器使用其他可信任机构颁发 的证书,也可以建立连接,这个非常危险, 建议打开.validatesDomainName=NO, 主要用于这种情况:客户端请求的是子域名, 而证书上的是另外 一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com, 那么mail.google.com是无法验证通过的. */ + (void)setSecurityPolicyWithCerPath:(NSString *)cerPath validatesDomainName:(BOOL)validatesDomainName; @end