New file |
| | |
| | | // |
| | | // 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 <Foundation/Foundation.h> |
| | | #import <UIKit/UIKit.h> |
| | | #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<UIImage *> *)images |
| | | fileNames:(NSArray<NSString *> *)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 |
| | | |